我从smtpd开始,以便处理邮件队列、解析入站电子邮件并将它们发送回收件人(使用smtpdlib.sendmail)。我切换到aiosmtpd因为我需要多线程处理(而smtpd是单线程的,而且看起来已经停产了)。
顺便说一句,我对邮件信封内容的aiosmtpd管理感到困惑,这似乎比以前更加精细,如果您需要真正微调,那就太好了,但如果您只想处理正文而不修改其余部分,那就有点过大了。
举个例子,smtpd process_message方法只需要data_decode=True参数来处理和解码邮件正文而不接触任何东西,而 aiosmtpd HANDLE_data方法似乎无法自动解码邮件信封,并且经常出现嵌入图像、附件等的异常。 .
编辑添加了代码示例,首先是 smtpd:以下代码将实例化 smtp 服务器,等待端口 10025 上的邮件并通过 smtplib(都是本地主机)传递到 10027。为所有类型的邮件(基于文本/html,带有嵌入的图像、附件......)处理数据变量(基本上执行字符串替换,我的目标)是安全的
class PROXY_SMTP(smtpd.SMTPServer):
def process_message(self, peer, mailfrom, rcpttos, data, decode_data=True):
server = smtplib.SMTP('localhost', 10027)
server.sendmail(mailfrom, rcpttos, data)
server.quit()
server = PROXY_SMTP(('127.0.0.1', 10025), None)
asyncore.loop()
以前的代码运行良好,但采用单线程方式(= 一次 1 封邮件),所以我切换到 aiosmtpd 以进行并发邮件处理。与 aiosmtpd 相同的示例大致如下:
class MyHandler:
async def handle_DATA(self, server, session, envelope):
peer = session.peer
mailfrom = envelope.mail_from
rcpttos = envelope.rcpt_tos
data = envelope.content.decode()
server = smtplib.SMTP('localhost', 10027)
server.sendmail(mailfrom, rcpttos, data)
server.quit()
my_handler = MyHandler()
async def main(loop):
my_controller = Controller(my_handler, hostname='127.0.0.1', port=10025)
my_controller.start()
loop = asyncio.get_event_loop()
loop.create_task(main(loop=loop))
try:
loop.run_forever()
此代码适用于文本电子邮件,但在使用任何复杂邮件(mime 内容、附件...)解码信封内容时会出现异常
如何在 aiosmtpd 中解析和解码邮件文本,像使用 smtpd 一样执行字符串替换,然后通过 smtplib 重新注入?