【问题标题】:Basic aiosmtpd SMTP server example [closed]基本 aiosmtpd SMTP 服务器示例 [关闭]
【发布时间】:2017-05-11 00:33:00
【问题描述】:

如何将以下使用 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)

【问题讨论】:

    标签: python aiosmtpd


    【解决方案1】:

    要将您的 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 兼容,请在 handle_DATA() 上使用 @asyncio.coroutine 装饰器。

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

    如果您需要访问peermailfromrcpttos,它们分别以session.peerenvelope.mail_fromenvelope.rcpt_tos 的形式提供。

    【讨论】:

    • 现在出现这个错误:RuntimeError: Task got bad yield: '2'
    • @opsdisk 抱歉,我忘记了 handle_DATA 必须是协程(async def)。我已经编辑了我的解决方案——它现在应该可以工作了。
    • 成功了……刚刚找到了 github 票,以获取此类示例的更好文档
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2013-01-12
    • 2012-01-25
    • 2010-11-24
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多