前一段时间,我写了Python一个处理电子邮件的程序,经常遇到的一件事就是知道电子邮件是否是“多部分的”。
经过一番研究,我知道它与包含HTML或附件等的电子邮件有关...但是我并不十分了解。
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是哪个?或附件是哪一个?还是只是身体?
对于如何正确使用多部分消息,没有严格的层次结构或指南。MIME只是定义了一种将多个有效负载收集到单个电子邮件中的方法。我相信,最初的动机之一是能够将图片嵌入文字中。但是能够将二进制文件附加到文本消息上,更广泛的说,就是能够创建带有有效载荷的结构化消息,这些有效载荷以任意方式相关,这是应用程序以其认为合适的任何方式使用的简单条件。
常见的误解是将层次结构假定为“主要部分”和“从属部分”。创建这种结构当然是可能的,但绝不是普遍做到的。实际上,大多数多部分消息只是具有一系列的部分而没有任何层次结构。用户的电子邮件客户端通常会选择一个“内联”部分作为首选的“主要”部分,以显示在消息窗格中,但这绝不是标准规定的,也不是发送方可以强制执行的。
每个MIME部分都有一组标头,它们告诉您类型,编码和配置;对于类型text/*
的零件,默认处置方式是“内联”(因此通常没有明确说明),而大多数其他部件的默认处置方式是“附件”。您需要参考相关标准以获取严格的定义,但可能会有些许困难,因为许多现实世界中的应用程序并非特别符合RFC。
对于您的具体问题,找到(隐式或显式)内联的最上面的叶部分,并显示支持用例的部分作为“主要”部分。如果您想将HTML强制为首选格式,则可以执行此操作。但是许多电子邮件应用程序将其推迟给用户决定,而且由于技术上的需要,身体残障或个人品味,某些用户肯定会选择纯文本(如果有)。
不幸的是,消息生产者最近的惯例是创建一个multipart/alternative
带有text/plain
和text/html
成员的容器,但是却提供了一个完全无用的text/plain
部分,并将所有实际内容包含在一个text/html
部分中。在这种情况下,正确的安排是,text/plain
如果您不能在其中放入任何有用的东西,则完全不提供任何零件(但我想他们只在乎通过一些误导的垃圾邮件过滤器,而不是在实际地适应接收者的偏好)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句