基本 aiosmtpd SMTP 服务器示例
Basic aiosmtpd SMTP server example
如何将以下使用 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)
要将您的 CustomSMTPServer 转换为使用 aiosmtpd 的东西,您必须使用 handle_DATA()
方法定义处理程序 class,该方法与 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()
returns“250 OK”告诉 SMTP 客户端邮件已成功接收和处理。与 smtpd 不同,对于 aiosmtpd,您需要 return handle_DATA()
.
中的 SMTP 响应代码
注意handle_DATA()
必须是协程函数,即使用async def
定义。如果您需要与 Python 3.4 兼容,请在 handle_DATA()
上使用 @asyncio.coroutine
装饰器。
另请注意,self.server.start()
在单独的线程中运行 SMTP 服务器,这与接管当前线程的 asyncore.loop()
不同。
如果您需要访问 peer
、mailfrom
或 rcpttos
,可以使用 session.peer
、envelope.mail_from
和 envelope.rcpt_tos
,分别。
如何将以下使用 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)
要将您的 CustomSMTPServer 转换为使用 aiosmtpd 的东西,您必须使用 handle_DATA()
方法定义处理程序 class,该方法与 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()
returns“250 OK”告诉 SMTP 客户端邮件已成功接收和处理。与 smtpd 不同,对于 aiosmtpd,您需要 return handle_DATA()
.
注意handle_DATA()
必须是协程函数,即使用async def
定义。如果您需要与 Python 3.4 兼容,请在 handle_DATA()
上使用 @asyncio.coroutine
装饰器。
另请注意,self.server.start()
在单独的线程中运行 SMTP 服务器,这与接管当前线程的 asyncore.loop()
不同。
如果您需要访问 peer
、mailfrom
或 rcpttos
,可以使用 session.peer
、envelope.mail_from
和 envelope.rcpt_tos
,分别。