Python 多部分/混合电子邮件附件不显示,但仅在Windows 10 Mail中显示
我通过PythonPython 多部分/混合电子邮件附件不显示,但仅在Windows 10 Mail中显示,python,email,mime,multipart,smtplib,Python,Email,Mime,Multipart,Smtplib,我通过Pythonemail/smtplib发送的电子邮件有一个奇怪的问题 我正试图用以下内容撰写电子邮件: 纯文本和HTML消息体的替代方案 内嵌在HTML正文中的图像 单独的非内联附件 MIME结构的设置如下: multipart/mixed multipart/alternative text/plain multipart/related text/html image/png - inline
email
/smtplib
发送的电子邮件有一个奇怪的问题
我正试图用以下内容撰写电子邮件:
- 纯文本和HTML消息体的替代方案
- 内嵌在HTML正文中的图像
- 单独的非内联附件
multipart/mixed
multipart/alternative
text/plain
multipart/related
text/html
image/png - inline
application/pdf - attachment
这似乎在我测试过的每个邮件客户端上都能正常工作{BlueMail on Android、iOS邮件客户端、Roundcube},除了Windows 10邮件客户端的。出于某种原因,Windows10内置的邮件客户端似乎可以很好地显示内联图像,但没有显示其他附件的痕迹
我在互联网上找到的有限信息表明,这是Windows 10 mail客户端的一个缺陷,但我个人在该客户端收到了其他带有内联和附件的电子邮件,显示得很好-因此显然存在某种解决方法/替代消息结构
因此,我的问题是:如何以不同的格式设置此邮件,使其在所有相关邮件客户端中正确显示
我正在用Python编写这样的电子邮件:
message = MIMEMultipart("mixed")
message["From"] = ...
.
.
.
bodyText = "..."
bodyHTML = "..."
mailFrom = "..."
targetEmail = "..."
imageContent = ...
messageBody = MIMEMultipart("alternative")
messageBody.attach(MIMEText(bodyText, "plain"))
messageBodyHTML = MIMEMultipart("related")
messageBodyHTML.attach(MIMEText(bodyHTML, "html"))
messageImage = MIMEImage(imageContent)
messageImage.add_header("Content-Disposition", 'inline; filename="..."')
messageImage.add_header("Content-ID", "<id used in html body>")
messageBodyHTML.attach(messageImage)
messageBody.attach(messageBodyHTML)
message.attach(messageBody)
attachment = MIMEApplication(fileContent, Name=fileName)
attachment.add_header("Content-Disposition", 'attachment; filename="..."')
message.attach(attachment)
self.smtplibSession.sendmail(mailSource, targetEmail, message.as_string())
message=MIMEMultipart(“混合”)
消息[“来自”]=。。。
.
.
.
bodyText=“…”
bodyHTML=“…”
mailFrom=“…”
targetMail=“…”
图像内容=。。。
messageBody=MIMEMultipart(“备选方案”)
messageBody.attach(MIMEText(bodyText,“普通”))
messageBodyHTML=MIMEMultipart(“相关”)
messageBodyHTML.attach(MIMEText(bodyHTML,“html”))
messageImage=MIMEImage(图像内容)
messageImage.add_头(“内容处置”,“内联;文件名=”…”)
messageImage.add_头(“Content ID”,“”)
messageBodyHTML.attach(messageImage)
messageBody.attach(messageBodyHTML)
message.attach(messageBody)
附件=MIMEApplication(文件内容,名称=文件名)
附件.添加标题(“内容处置”,“附件;文件名=”…”)
留言。附件(附件)
self.smtplibSession.sendmail(mailSource、targetEmail、message.as_string())
更新:这是来自Windows 10 mail的邮件数据(通过“保存”功能输出-无法查看我可以找到的原始邮件数据…)
MIME版本:1.0
日期:2019年5月30日星期四17:45:28+0200
发件人:xxxxx
主题:xxxxx
线程主题:xxxxx
致:“xxxxx”
内容类型:多部分/相关;
边界=“_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5”
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
内容传输编码:引用可打印
内容类型:text/html;charset=“utf-8”
内容传输编码:base64
内容配置:内联;filename=“embedded image.png”
Ivborw0kgoaaan。。。
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_--
我不确定这是否是从应用程序保存电子邮件的结果,或者这是应用程序实际存储的内容,但Windows 10 Mail应用程序似乎删除了多部分/相关的
节之外的所有内容-也就是说,它只使用所选的备选方案
,而不存储任何其他内容
相比之下,我发现并导出了一封显示正确的电子邮件,其中包含图像、html和附件,但格式似乎简单得多——该电子邮件只包含一个
多部分/混合层,其中包含文本/html
和一个应用程序/pdf
附件。该电子邮件使用了HTML中引用的外部图像,而不是将其嵌入邮件中-我希望避免在外部托管每封电子邮件中的图像。与您不同,附件文件没有问题,相反,我在显示内联图像时遇到了问题(Windows 10 Mail 16005.11629.20174.0
)
不幸的是,正确地处理MIME消息中的非标准方法是一个期望拥有良好电子邮件客户端的特性。显然,Windows10邮件还没有那么“好”
我建议您使用的结构是:
multipart/mixed
├─── multipart/related
│ ├─── multipart/alternative
│ │ ├─── text/plain
│ │ └─── text/html
│ └─── image/png - inline image
└─── application/pdf - attachment
在以下客户中,我对这种结构没有任何问题
- Windows 10邮件
- gmailweb和Android
- Outlook Web、Android和Windows桌面
- 蓝邮安卓
- 圆立方体网
- 邮件启用网站
因此,尝试一下下面的代码,看看它是否适合您
message = MIMEMultipart("mixed")
message["From"] = ...
.
.
.
bodyText = "..."
bodyHTML = "..."
mailFrom = "..."
targetEmail = "..."
imageContent = ...
fileContent = ...
relatedBody = MIMEMultipart("related")
messageBody = MIMEMultipart("alternative")
messageBody.attach(MIMEText(bodyText, "plain"))
messageBody.attach(MIMEText(bodyHTML, "html"))
relatedBody.attach(messageBody)
messageImage = MIMEImage(imageContent)
messageImage.add_header("Content-Disposition", 'inline; filename="..."')
messageImage.add_header("Content-ID", "<id used in html body>")
relatedBody.attach(messageImage)
message.attach(relatedBody)
attachment = MIMEApplication(fileContent)
attachment.add_header("Content-Disposition", 'attachment; filename="..."')
message.attach(attachment)
message=MIMEMultipart(“混合”)
消息[“来自”]=。。。
.
.
.
bodyText=“…”
bodyHTML=“…”
mailFrom=“…”
targetMail=“…”
图像内容=。。。
fileContent=。。。
relatedBody=MIMEMultipart(“相关”)
messageBody=MIMEMultipart(“备选方案”)
messageBody.attach(MIMEText(bodyText,“普通”))
附加(MIMEText(bodyHTML,“html”))
relatedBody.attach(messageBody)
messageImage=MIMEImage(图像内容)
messageImage.add_头(“内容处置”,“内联;文件名=”…”)
messageImage.add_头(“Content ID”,“”)
relatedBody.attach(messageImage)
消息。附加(相关正文)
附件=MIMEApplication(文件内容)
附件.添加标题(“内容处置”,“附件;文件名=”…”)
留言。附件(附件)
message = MIMEMultipart("mixed")
message["From"] = ...
.
.
.
bodyText = "..."
bodyHTML = "..."
mailFrom = "..."
targetEmail = "..."
imageContent = ...
fileContent = ...
relatedBody = MIMEMultipart("related")
messageBody = MIMEMultipart("alternative")
messageBody.attach(MIMEText(bodyText, "plain"))
messageBody.attach(MIMEText(bodyHTML, "html"))
relatedBody.attach(messageBody)
messageImage = MIMEImage(imageContent)
messageImage.add_header("Content-Disposition", 'inline; filename="..."')
messageImage.add_header("Content-ID", "<id used in html body>")
relatedBody.attach(messageImage)
message.attach(relatedBody)
attachment = MIMEApplication(fileContent)
attachment.add_header("Content-Disposition", 'attachment; filename="..."')
message.attach(attachment)