Python:解析带嵌入图片的邮件

5 投票
4 回答
5162 浏览
提问于 2025-04-16 07:55

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

我已经成功解析了文本邮件、HTML邮件和附件。现在,我遇到了一个问题,就是那些包含嵌入图片的邮件。服务器在图片的src标签中显示了CID: 一些代码,而图片是以字节的形式存在。我不太确定该如何获取这些图片,并将它们与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

4 个回答

1

这可以通过使用附件负载头和 img 标签轻松实现。

下面是一个例子。

如果是内联附件(或者说嵌入的图片),那么头部信息会是:

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

img 标签会像这样:

<img height="59" src="cid:178eefca98b2c91aec1" width="169"/>

如果是实际的附件,那么头部信息会是:

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

我猜你是在用Python的email包吧?这个包处理图片没问题。如果你需要自己解码图片,那就得看看它的编码方式,这里用的是base64。Python标准库里也有一个专门用来编码和解码base64的模块

至于映射,你只需要从图片中获取Content-Id头信息,然后创建一个字典,把内容ID和相应的mime部分对应起来。要处理src中的网址,检查它们是否以'cid:'开头(也就是说,它们指向的是内部的mime文档),去掉这个前缀,然后在你之前创建的字典里查找。

2

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

如果是附件,文件内容应该作为附件和邮件一起显示;如果是内嵌的内容,那么这些内容会直接显示在邮件的正文里。

撰写回答