Python:解析带有嵌入图像的电子邮件

Posted

技术标签:

【中文标题】Python:解析带有嵌入图像的电子邮件【英文标题】:Python: parsing emails with embedded images 【发布时间】:2011-05-18 23:00:48 【问题描述】:

我正在开发一个应用程序,它使用 python POP3 库连接到邮件服务器,解析电子邮件并将它们放入数据库。

我已成功解析文本邮件、html 邮件和附件。现在,我被包含嵌入图像的电子邮件所困扰。服务器正在运行 CID:src 标记中图像的一些代码,图像以字节为单位。我不确定如何获取图像并将它们与 CID 进行映射。

请提出建议。

提前致谢。

以下是我收到的电子邮件内容:

Content-Type: multipart/alternative; 
               boundary="php-alt-e0af773d09fadf5208f69aecffcb4de888824263"

 --PHP-alt-e0af773d09fadf5208f69aecffcb4de888824263
 Content-Type: text/plain

 Hi, testing embedded images email!


 --PHP-alt-e0af773d09fadf5208f69aecffcb4de888824263
 Content-Type: multipart/related; boundary="PHP-related-e0af773d09fadf5208f69aecffcb4de888824263"

 --PHP-alt-e0af773d09fadf5208f69aecffcb4de888824263
 Content-Type: text/html

 <html>
 <head>
 <title>Test HTML Mail</title>
 </head>
 <body>
 <font color='red'>Hai, it is me!</font>
 Here is my picture: 
  <img src="cid:PHP-CID-e0af773d09fadf5208f69aecffcb4de888824263" />
 </body>
 </html>

 --PHP-related-e0af773d09fadf5208f69aecffcb4de888824263
 Content-Type: image/gif
 Content-Transfer-Encoding: base64
 Content-ID: <PHP-CID-e0af773d09fadf5208f69aecffcb4de888824263> 

 iVBORw0KGgoAAAANSUhEUgAAAEYAAAAgCAMAAACYXf7xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAwBQTFRF////oNKWY6ZZTnc08/304+P/6/PsRHgpZYpWGHcTWqFWe7pz
WZNFwNa+Q2UqgpZ5JGcZ4ezj7e3/6Oj/tbW62tr/aadiK1sSUHQ6oKeSI0UM5PHkAAAAaZhifHx6
yMjKWHdJY5lbi6yFW5RU0+LSnq2VmZ6Mm8iS8vL/dXVzRERFJVUJrNalcrNtkZGRLnYslsWJ3e3d
7fXwstirWYJB3ergyeTI9vb/iIiIgoKBd6V0np6ce51rU2pDqMqlVVVWTnpFhcN7NTU2RYUqpbWd
rKysOHcn5vbql6eOMWYbMkUi+fn/uOStk6yLZGRm7f7tlLGKOXg20dvNIiIiGUUER4Q0InMcaYtf
3+/e3d3czd7KjY2Nnb6WtdOzKWkmhoaGUJNNjL+FhLt7jLp9IF0Z/v7/0tLRqrijVX9UTmZA+v38
Qko5SW5EVYA9JkwPMzwocnJub7RnfZpy3vPcaGhkhYWDbm5rhISIRoZGN0gxm6aQ/Pz/OYAyXm1V
pKSpeHh2Q1M5oqKgiaZ+dZ1vbqRaTVU4k7GFe6xqpr6c1+rb3uTcfcdx0d3Qk7ePhaJ6cqVsTp5H
xNzA1ezTVotS7e7uv968+v76xtPBPlczm7OVydfDdK1t+fn7+vT91NTddpRpVmNBlLyUgKRymZmW
u9a5dati9vr35eXugrFzTVY2/v//R5M5ial+zdbJcJJn8/jz+f73SV89EREReL1vob2TUVw7orGX
YmtU///+YYZNkaKGmdKUR106iIiD9/b5VWxNmbWOudy0j4+N+//9/v/8Dw8Pd5xnf3+INF8Yjp2D
frZ2cHB30ufZb3Bt2+HY3e3WqKqiLjcrUW09q8+xLmowOXAhmbiI4+Xnjr6P5O/n5/DkeK9mQEBE
8vf5//r/9fT4U5Q9hcqGlNKNDh0FlJSXA0UAC1cJGl0KWaZQwc69yN3K/f76drVuQn0iLTkZeJds
lq+Pv9HBN1YtV21Fkb6Bkb6KmLSHtNC5t9y5DikEhLZ/W3BLMEoddqVi4vfk////U8M4kgAAAQB0

【问题讨论】:

【参考方案1】:

我复制/粘贴此电子邮件内容。甚至我的 formail 客户端也无法正确解码此邮件。 所以也许这个邮件内容不正确或不完整。

【讨论】:

它不完整,它显示嵌入图像部分的部分以及它如何使用图像的cid。【参考方案2】:

我假设您正在使用 Python 的 email 包?它应该可以很好地处理图像。如果您需要自己解码图像,则需要查看编码,在本例中为 base64。标准库中也有一个module for encoding and decoding base64。

至于映射,只需从图像中获取 Content-Id 标头,创建一个将内容 ID 映射到 mime 部分的 dict。要解析 src 中的 URL,请检查它们是否以“cid:”开头(即解析为内部 mime 文档),去掉前缀并在您之前创建的字典中查找它们。

【讨论】:

感谢您的回复。是的,我正在使用电子邮件包。我在解码和阅读 base64 内容时没有问题。我已经为附件做到了。问题在于使用 cid 部分解析和映射内容。 解析是什么意思?内容 ID 除了身份之外没有任何意义,它只是在文档中被选择为唯一的。 解析意味着我的代码适用于所有类型的电子邮件,除了带有内联或嵌入图像的电子邮件。它将我在问题中发布的所有内容显示到电子邮件正文中。【参考方案3】:

通过检查内容中的 Content-Disposition 值和 cid 解决了该问题。

如果是附件,则文件内容应显示为电子邮件的附件,如果是内联的,则内容将显示在正文中。

【讨论】:

这里是一个例子。 如果是内联附件(或嵌入图像),标题将为:``` 'Content-Disposition', 'inline; filename="1.png"' 'Content-ID', '' ``` 和img 标签会是这样的: `` ``` 如果是实际附件标题将类似于:``` 'Content-ID', '' 'Content-Disposition', 'attachment;文件名="Ajay_pratap_devops.pdf"' ```【参考方案4】:

这可以使用附件有效负载标头和img 标记轻松完成。

这是一个例子。

如果是内联附件(或嵌入图像),标题将是:

'Content-Disposition', 'inline; filename="1.png"'
'Content-ID', '178eefca98b2c91aec1'

img 标签会是这样的:

<img  src="cid:178eefca98b2c91aec1" />

如果是实际附件,标题将如下所示:

'Content-ID', '178eefca98bee445dfe2'
'Content-Disposition', 'attachment; filename="Ajay_pratap_devops.pdf"'

【讨论】:

以上是关于Python:解析带有嵌入图像的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Python,MIME,在电子邮件中嵌入图像

Python - 使用嵌入图像向 GMAIL 发送邮件

Python:多部分 html 电子邮件通过嵌入式图像和附件发送

Django:如何发送带有嵌入图像的 HTML 电子邮件

在 Delphi 中生成带有嵌入图像的 HTML 电子邮件

在 c# 中动态分配 ContentId 并发送带有嵌入图像的电子邮件