Python email lib - 如何从现有邮件中删除附件?

Posted

技术标签:

【中文标题】Python email lib - 如何从现有邮件中删除附件?【英文标题】:Python email lib - How to remove attachment from existing message? 【发布时间】:2010-12-10 05:31:03 【问题描述】:

我正在使用 Python 电子邮件库阅读一封电子邮件,我需要修改它的附件。 email Message 类有“attach”方法,但没有“detach”之类的东西。如何从多部分邮件中删除附件?如果可能的话,我想这样做而不是从头开始重新创建消息。

基本上我想:

    加载电子邮件 删除 mime 附件 添加新附件

【问题讨论】:

***.com/questions/69850757/python-eml-file-edit 对于 Python 3 基本上是相同的问题。我不想将其作为重复项关闭,因为这里的答案要么特定于 Python 2,要么含糊不清。 【参考方案1】:

我想出的方法是:

    使用 set_payload 将有效负载设置为空列表 创建有效负载,并附加到消息中。

【讨论】:

【参考方案2】:

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

>>> 

【讨论】:

请注意,email API 在 Python 3.6 中已进行了相当大的更新;您不想再在新代码中使用旧 API。【参考方案3】:

嗯,根据我的经验,在你工作的环境中,一切都是Message 对象。消息,它的部分,附件,一切。所以,要完成你想做的事,你需要

    使用Parser API 解析消息(这将为您获取根Message 对象) 遍历结构,确定您需要什么和不需要什么(使用 Message 实例的方法 - .walk()),- 请记住,一切都是 Message。 将您需要的任何东西附加到您提取的部件上,您就可以开始了。

重申一下,您所使用的本质上是一棵树,其中带有 .is_multipart() == True 的 Message 对象是节点,而带有 .is_multipart() == False 的 Message 对象是端节点(它们的有效载荷是一个字符串,而不是一堆 Message 对象)。

【讨论】:

以上是关于Python email lib - 如何从现有邮件中删除附件?的主要内容,如果未能解决你的问题,请参考以下文章

python发邮脚本运行每次都报socket.error: [Errno 110] Connection timed out ,用别人的机器也报

python - 发送邮件(email模块(内置))

包邮免费送Python 全栈知识图谱

包邮免费送Python 全栈知识图谱

Python3 - 如何从现有抽象类定义抽象子类?

如何从 Python 3 中的现有程序创建带有 argparse 的子解析器?