Python 多线程 SMTP 代理
Python multithreaded SMTP proxy
我在 5 个不同的端口上创建了一个由 smtpd.SMTPServer 运行ning 的多个实例组成的 SMTP 代理,在负载平衡设置中接收、解析和重新注入 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()
已解决。
对于任何最终遇到同样麻烦的人:如果你想要多线程,那么你需要切换到基于 asyncio 的 aiosmtpd,然后能够并行处理邮件。
Smtpd asyncore 循环只是保持 运行 顺序,所以 time.sleep() 会休眠整个处理而不是单个邮件。
到目前为止唯一的缺点是邮件内容的管理更加复杂。其中 smtpd 透明管理正文、编码、附件,使用 aiosmtpd 你需要单独解析信封部分和编码。
我在 5 个不同的端口上创建了一个由 smtpd.SMTPServer 运行ning 的多个实例组成的 SMTP 代理,在负载平衡设置中接收、解析和重新注入 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()
已解决。 对于任何最终遇到同样麻烦的人:如果你想要多线程,那么你需要切换到基于 asyncio 的 aiosmtpd,然后能够并行处理邮件。
Smtpd asyncore 循环只是保持 运行 顺序,所以 time.sleep() 会休眠整个处理而不是单个邮件。
到目前为止唯一的缺点是邮件内容的管理更加复杂。其中 smtpd 透明管理正文、编码、附件,使用 aiosmtpd 你需要单独解析信封部分和编码。