基本aiosmtpd SMTP服务器示例

时间:2017-05-11 00:33:00

标签: python aiosmtpd

如何将使用smtpd的以下SMTP服务器转换为使用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)

1 个答案:

答案 0 :(得分:2)

要将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()

请注意handle_DATA()返回“250 OK”,告诉SMTP客户端邮件已成功接收和处理。与smtpd不同,使用aiosmtpd,您需要在handle_DATA()中返回SMTP响应代码。

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

另请注意,self.server.start()在单独的线程中运行SMTP服务器,与接管当前线程的asyncore.loop()不同。

如果您需要访问peermailfromrcpttos,则分别以session.peerenvelope.mail_fromenvelope.rcpt_tos提供。