0

我制作了一个由多个 smtpd.SMTPServer 实例组成的 SMTP 代理,这些实例在 5 个不同的端口上运行,在负载平衡设置中接收、解析和重新注入 Postfix 中的电子邮件。

一切运行良好,但我无法在单独的线程上运行每个实例。我想在解析和交付单个邮件之间等待大约 30/40 秒(以进一步处理它们),但是如果我放置 time.sleep,所有实例都会被阻止。

我想切换到并行处理而不是顺序处理,以便有 5 个并发处理线程,这是我的单线程代码的骨架:

class My_Proxy(smtpd.SMTPServer):
        def process_message(self, peer, mailfrom, rcpttos, data, decode_data=True):
        ###PARSING AND PROCESSING STUFF...
        time.sleep( 30 ) ###BLOCKING SLEEP
        ###SEND TO FINAL MTA
        server.sendmail(mailfrom, rcpttos, data_rewrite_https)
        server.quit()

#FIVE INSTANCES DIFFERENT PORTS
server1 = My_Proxy(('127.0.0.1', 10027), None)
server2 = My_Proxy(('127.0.0.1', 10029), None)
server3 = My_Proxy(('127.0.0.1', 10031), None)
server4 = My_Proxy(('127.0.0.1', 10033), None)
server5 = My_Proxy(('127.0.0.1', 10035), None)
asyncore.loop()
4

1 回答 1

0

解决了。对于任何最终遇到同样麻烦的人:如果您想要多线程,那么您需要切换到基于asyncio的 aiosmtpd,然后能够并行处理邮件。

Smtpd asyncore 循环只是保持顺序运行,因此 time.sleep() 将睡眠整个处理而不是单个邮件。

到目前为止,唯一不好的是对邮件内容的管理更加复杂。在 smtpd 透明管理正文、编码、附件的地方,使用 aiosmtpd 需要分别解析信封部分和编码。

于 2020-01-30T16:25:24.843 回答