用Python重新组装“message/partial”编码的电子邮件消息

4 投票
2 回答
3634 浏览
提问于 2025-04-16 00:38

有没有办法在Python中重新组合那些用Content-Type: message/partial编码的邮件?(也就是RFC 1521的第7.3.2节,关于部分邮件的内容)

具体来说,给定一组邮件,我们该如何把它们合并回原来的样子?也就是说:

emails = [...] # a  list of `email`.

reassembled_email = merge_emails(emails)

merge_emails需要做些什么?有没有Python项目实现过这个功能?

你可以期待一封邮件是这样的:

From: me@example.com
To: me2@example.com
Date: Wed, 30 Jun 2010 14:19:45 -0400
MIME-Version: 1.0
Content-Type: message/partial;
 id="TAN_U_R<0.0000749046c4>";
 number=1;
 total=2

From: me@example.com
Subject:
To: me2@example.com
Date: Wed, 30 Jun 2010 14:19:45 -0400
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="DC_BOUND_PRE_<1277921980.0000744>"

This is a multi-part message in MIME format.
--DC_BOUND_PRE_<1277921980.0000c4>
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

This E-mail was sent from Your Printer

Some random text.

--DC_BOUND_PRE_<1277921980.0000744>
Content-Type: application/pdf; name="abcdef.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="abcdef.pdf"

JVBERi0xLjMKJZKgoooKNCAwIG9iago8PC9UeXBlL1hPYmplY3QKL1N1YnR5cGUvSW1hZ2UK
... 

这是我最初的想法:

from email import parser 

def merge_emails(emails):
   # we can presume emails are ordered correctly and all the parts accounted for

   content = ''

   for eml im emails:
      content += emails.get_payload()

   return parser.Parser().parsestr(content)

这样做可行吗(就这么简单)?我们该如何重新组合这封邮件呢?

除了在Python中实现这个功能,还有没有什么命令行的Unix/Mac OS X程序可以做到这一点?

谢谢你的阅读,以及你可能提供的任何信息。

祝好,

布莱恩

2 个回答

2

虽然这不是一个Python的解决方案,但这个程序 uudeview 在重新组合 message/partial 类型的电子邮件时非常有用。

3

以下方法对我有效:(Ubuntu Linux + Thunderbird)

  • 把每一条消息保存到一个文件夹里(比如:part1.dat、part2.dat……partN.dat)- 文件的顺序很重要
  • 合并这些文件:使用命令 cat part1.dat part2.dat partN.dat > mail.eml
  • 用Thunderbird打开这个文件。Thunderbird可以识别.eml文件,并把它当作完整的邮件打开

撰写回答