如何使用Python的smptd DebuggingServer输出解码后的base64编码电子邮件

3
我发现了这个厉害的 Python 一行代码,可以即时创建 SMTP 服务器:
python -m smtpd -n -c DebuggingServer localhost:1025

问题是,我的应用程序发送的邮件内容是经过base64编码的,因此输出看起来像垃圾:

---------- MESSAGE FOLLOWS ----------
b'Content-Type: multipart/alternative; boundary="===============7226846835346479139=="'
b'MIME-Version: 1.0'
b'Subject: redacted subject'
b'From: ACME Online 2'
b'To: john.doe@acme.com'
b'Cc: '
b'X-Peer: 10.255.13.37'
b''
b'--===============7226846835346479139=='
b'Content-Type: text/html; charset="utf-8"'
b'MIME-Version: 1.0'
b'Content-Transfer-Encoding: base64'
b''
b'PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv'
b'L0VOIj4KPGh0bWw+CjxoZWFkPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBj'
b'b250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4KICAgIDx0aXRsZT5XZWVrbHkg'

and so on.

if I atob this, I get:

atob('PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv')
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional/"

如何获取已解码的干净的base64输出日志? 附注:我不想在处理日志后获得干净的输出,我需要直接获得干净的输出。它正在Linux Docker容器内运行。


1
你需要编写自己的扩展smtpd.DebuggingServer,以使用email.message包来解析邮件,或者编写一个不同的内容感知结构来对编码的片段进行base64解码。 - zwer
我觉得很奇怪,DebuggingServer 默认情况下不会自动执行此操作。对于任何使用它的人来说,这是一个非常明显的要求。 - Teekin
1个回答

0

感谢 @zwer 的回答,我得以自己实现一个服务器:

import asyncore
import email
from smtpd import DebuggingServer

class ActualDebuggingServer(DebuggingServer):
    def _print_message_content(self, peer, data):
        msg = email.message_from_string(data)
        for (header,value) in msg.items():
            print(header, ': ', value)
        for part in msg.walk():
            print('---------- a part: ----------')
            maybe_decoded_payload = part.get_payload(decode=True)
            if (maybe_decoded_payload is not None):
                print(bytes.decode(maybe_decoded_payload, encoding="utf-8"))


if __name__ == '__main__':
    ActualDebuggingServer(
        ('0.0.0.0', 1025),
        ('0.0.0.0', 1025)
    )
    try:
        asyncore.loop()
    except KeyboardInterrupt:
        pass

这真的很粗糙,它假定部分内容是以UTF-8编码的。此外,我不确定第二个参数是用来干什么的。请谨慎使用。


这对我没用。最终结果还是一样的。我的 Content-Type: text/html; charset="utf-8",但所有内容仍然是base64编码的。 - avatarofhope2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接