基本 aiosmtpd SMTP 服务器示例

ops*_*isk 1 python aiosmtpd

如何转换以下基本SMTP服务器使用smtpd一个使用aiosmtpd呢?

import smtpd

class CustomSMTPServer(smtpd.SMTPServer):

    def process_message(self, peer, mailfrom, rcpttos, data):
        myqueue.queue.put(data)

self.server = CustomSMTPServer(('127.0.0.1', 10025), None)
Run Code Online (Sandbox Code Playgroud)

Mat*_*Rav 5

要将您的 CustomSMTPServer 转换为使用 aiosmtpd 的内容,您必须使用与您的handle_DATA()方法执行相同操作的方法定义处理程序类process_message()

import aiosmtpd.controller

class CustomSMTPHandler:
    async def handle_DATA(self, server, session, envelope):
        myqueue.queue.put(envelope.content)
        return '250 OK'

handler = CustomSMTPHandler()
self.server = aiosmtpd.controller.Controller(handler)
self.server.start()
input("Server started. Press Return to quit.")
self.server.stop()
Run Code Online (Sandbox Code Playgroud)

请注意,handle_DATA()返回“250 OK”,它告诉 SMTP 客户端消息已成功接收和处理。与 smtpd 不同,使用 aiosmtpd,您需要以handle_DATA().

注意handle_DATA()必须是协程函数,即使用async def. 如果您需要与 Python 3.4 兼容,请改用@asyncio.coroutine装饰器handle_DATA()

还要注意self.server.start()在单独的线程中运行 SMTP 服务器,不像asyncore.loop()它接管当前线程。

如果您需要访问peermailfromrcpttos,它们分别可用作session.peerenvelope.mail_fromenvelope.rcpt_tos