【发布时间】:2018-07-11 18:56:16
【问题描述】:
一点上下文...
前段时间,我用 Python 写了一个处理电子邮件的程序,经常遇到的一件事就是知道电子邮件是否是“多部分”的。
经过一番研究,我知道这与包含 HTML 或附件等的电子邮件有关......但我并没有真正理解它。
我对它的使用仅限于 2 个实例:
1.当我不得不保存原始电子邮件中的附件时
我刚刚在互联网上找到了这个(可能在这里 - 很抱歉没有记下写它的人,但我似乎再也找不到他了:/)并将它粘贴到我的代码中
def downloadAttachments(emailMsg, pathToSaveFile):
"""
Save Attachments to pathToSaveFile (Example: pathToSaveFile = "C:\\Program Files\\")
"""
att_path_list = []
for part in emailMsg.walk():
# multipart are just containers, so we skip them
if part.get_content_maintype() == 'multipart':
continue
# is this part an attachment ?
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
att_path = os.path.join(pathToSaveFile, filename)
#Check if its already there
if not os.path.isfile(att_path) :
# finally write the stuff
fp = open(att_path, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
att_path_list.append(att_path)
return att_path_list
2。当我不得不从原始电子邮件中获取文本时
也是从互联网上的某个人那里粘贴的,但没有真正了解它是如何工作的。
def get_text(emailMsg):
"""
Output: body of the email (text content)
"""
if emailMsg.is_multipart():
return get_text(emailMsg.get_payload(0))
else:
return emailMsg.get_payload(None, True)
我的理解...
如果电子邮件是多部分的,是否可以迭代这些部分。
我的问题是
这些部分究竟是什么?例如,你怎么知道哪一个是 html?或者哪一个是附件?还是只是身体?
【问题讨论】:
-
Multipart 是一种在单个主体内(可能)编码多个数据元素的方式。这可能意味着文本正文中有附件或其他项目,但这不是必需的。您也可以只对多部分消息中的单个消息正文进行编码。
-
if part.get('Content-Disposition') is None:不正确。这只是告诉您这部分没有明确的处置;所以你必须推断出一个隐含的处置,这取决于零件的类型。text/*通常是隐式内联的,而大多数其他类型是隐式附加的。 -
get_text()同样幼稚。如果您想决定将什么显示为“消息”,您希望避免使用显式Content-Disposition: attachment或嵌入例如退回邮件。如果有multipart/alternative(实际上也可能标记为multipart/mixed或multipart/related),则消息正文可能有多种渲染,您可以选择适合您的用例的一种。跨度> -
这个问题是基于一个不准确的心智模型。设计者有一个不同的模型:一条消息(或一个部分)可能有几个部分,可能是替代品('multipart/alternative')、串行等。0-n 个部分中的每一个都必须有一个类型,例如HTML、JPEG、文本、Wordstar 文档、音频/mp3 或许多其他。每个部分都可以指定为内联或附件,如果未指定,则接收者可以猜测。这种模型为发件人提供了很大的灵活性……这对 IMO 来说很好,因为现实世界的发件人无论如何都不是很自律,并且会违反制定的任何规则。
-
@arnt “猜测”不正确;为每种类型定义了默认配置。
标签: python python-3.x email imap