Python IMAP - 渲染带有内嵌图片的邮件正文

4
我正在开发一个自己的电子邮件客户端(由Django 1.10和Python 3驱动)。目前,我正在尝试使用Python的IMAPClient库渲染收件箱中的邮件。看起来我成功解析了具有mixedalternative子类型的电子邮件,但现在我卡在了尝试呈现带有relative子类型的正文部分上。也就是说,包含嵌入式inline附件的HTML部分。
目前,我将使用各自的fetch命令逐个下载所有内联图像到我的服务器,然后在目标信件的HTML中插入这些图像的链接。
举个例子,假设电子邮件HTML表示包含一个内联图像:

...<td><img src="cid:part1.06030702.04060203@studinter.ru"></td>...

...而包含内联图片描述的bodystruture部分如下所示:

(b'IMAGE', b'JPEG', (b'NAME', b'ban1.jpg'), b'<part1.06030702.04060203@studinter.ru>', None, b'BASE64', 15400, None, (b'INLINE', (b'FILENAME', b'ban1.jpg')), None)

所以理论上,我可以在我的服务器上下载图像,并将 src 标记的值(即 cid:part1.06030702.04060203@studinter.ru )替换为我的服务器上图像的URL。
我的担忧是,将内联附件插入目标HTML消息正文的这个过程是像IMAPClient或Python的email package这样的库已经实现的,我是否要重新发明轮子。我完全迷失在这个话题中。
问题是,我真的必须自己实现它吗?如果是,所描述的方法是否合适?如果不是,我会非常感激如何使用IMAPClient或标准库的imaplib来完成此操作的提示。

1
我认为这个功能没有被构建到你提到的库中,因为上次我检查时(但那是一段时间以前),反向操作(嵌入媒体的消息组装)并不存在。话虽如此,我会尝试使用类似BeautifulSoup的工具将src属性替换为data URI - Paulo Scardine
1
顺便提一下,查看这个相关答案; 还可以参考在HTML中服务Base64编码的图像的策略 - Paulo Scardine
太好了。谢谢你提供的链接!!! - Edgar Navasardyan
1个回答

0

我的外部库 https://github.com/ikvk/imap_tools

from imap_tools import MailBox, A

with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
    for msg in mailbox.fetch(A(all=True)):
        msg.html  # str: '<b>Hello 你 Привет</b>'
        for att in msg.attachments:
            att.filename             # str: 'cat.jpg'
            att.payload              # bytes: b'\xff\xd8\xff\xe0\'
            att.content_id           # str: 'part45.06020801.00060008@mail.ru'
            att.content_type         # str: 'image/jpeg'
            att.content_disposition  # str: 'inline'

这里有足够的数据进行渲染。

您可以分析att.content_id并在HTML中找到它。


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