Python邮箱库 - 如何从现有邮件中删除附件?

5 投票
4 回答
8489 浏览
提问于 2025-04-15 15:23

我有一封电子邮件,想用Python的邮件库来读取,并且需要修改它的附件。这个邮件的Message类里有一个“attach”(附加)的方法,但没有类似“detach”(移除)的东西。我该怎么从一个多部分的邮件中删除一个附件呢?如果可以的话,我希望能在不重新创建邮件的情况下做到这一点。

简单来说,我想要:

  1. 加载这封邮件
  2. 移除mime格式的附件
  3. 添加一个新的附件

4 个回答

3

我找到的做法是:

  1. 先用 set_payload 把负载设置为空列表。
  2. 然后创建负载,并把它附加到消息上。
3

根据我的经验,在你正在处理的这个环境中,所有的东西都是一个 Message 对象。这个消息、它的各个部分、附件,所有的一切都是如此。所以,要实现你想做的事情,你需要:

  1. 使用 Parser API 来解析这个消息(这样你就能得到根 Message 对象)
  2. 遍历这个结构,判断你需要什么,不需要什么(可以用 Message 实例的方法 - .walk()),记住,所有的东西都是 Message
  3. 把你需要的东西附加到你提取出来的部分上,这样就可以了。

再强调一下,你正在处理的其实是一个树形结构,其中 Message 对象如果 .is_multipart() == True 就是节点,而 Message 对象如果 .is_multipart() == False 就是叶子节点(它们的内容是字符串,而不是一堆 Message 对象)。

3

set_payload() 可能会对你有帮助。

set_payload(payload[, charset])

这个方法可以把整个消息对象的内容设置为你提供的内容。确保内容的正确性是使用者自己的责任。

下面是一个简单的互动示例:

>>> from email import mime,message
>>> m1 = message.Message()
>>> t1=email.MIMEText.MIMEText('t1\r\n')
>>> print t1.as_string()
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

t1

>>> m1.attach(t1)
>>> m1.is_multipart()
True
>>> m1.get_payload()
[<email.mime.text.MIMEText instance at 0x00F585A8>]
>>> t2=email.MIMEText.MIMEText('t2\r\n')
>>> m1.set_payload([t2])
>>> print m1.get_payload()[0].as_string()
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

t2

>>> 

撰写回答