Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多部分/混合电子邮件附件不显示,但仅在Windows 10 Mail中显示_Python_Email_Mime_Multipart_Smtplib - Fatal编程技术网

Python 多部分/混合电子邮件附件不显示,但仅在Windows 10 Mail中显示

Python 多部分/混合电子邮件附件不显示,但仅在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

我通过Python
email
/
smtplib
发送的电子邮件有一个奇怪的问题

我正试图用以下内容撰写电子邮件:

  • 纯文本和HTML消息体的替代方案
  • 内嵌在HTML正文中的图像
  • 单独的非内联附件
MIME结构的设置如下:

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)