Multipart/mixed 电子邮件附件未显示,但仅显示在 Windows 10 个邮件中
Multipart/mixed email attachments not showing up, but only in Windows 10 Mail
我通过 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 mail client, Roundcube} except for the Windows 10个邮件客户端。出于某种原因,Windows 10 内置邮件客户端似乎可以很好地显示内联图像,但没有显示其他附件的踪迹。
我在 Internet 上找到的有限信息表明这是 Windows 10 邮件客户端的错误,但我个人收到了该客户端中的其他电子邮件,包括内联附件和附加附件,显示得很好 - 所以显然有某种解决方法/替代消息结构有效。
因此我的问题是:我怎样才能以不同的方式格式化此邮件,以便它在所有相关的邮件客户端中正确显示?
我正在这样写邮件,在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())
更新: 这是来自 Windows 10 封邮件的邮件数据(通过 "save" 功能输出 - 无法查看原始邮件我能找到的数据...)
MIME-Version: 1.0
Date: Thu, 30 May 2019 17:45:28 +0200
From: xxxxx <xxxxx>
Subject: xxxxx
Thread-Topic: xxxxx
To: "xxxxx" <xxxxx>
Content-Type: multipart/related;
boundary="_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_"
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"
<center><img src=3D"cid:embedded-image" alt=...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Type: image/png; name="embedded-image.png"
Content-ID: <embedded-image>
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="embedded-image.png"
iVBORw0KGgoAAAAN...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_--
我不确定这是从应用程序保存电子邮件的结果,还是应用程序实际存储的内容,但 Windows 10 邮件应用程序似乎删除了所有内容在 multipart/related
节之外 - 也就是说,它只采用所选择的 alternative
并且不存储任何其他内容。
为了比较,我找到并导出了一封显示正确的电子邮件,其中包含图像、html 和附件,但格式似乎简单得多 - 该电子邮件仅包含 multipart/mixed
图层,带有 text/html
和 application/pdf
附件。该电子邮件使用了 HTML 中引用的外部图像,而不是将其嵌入邮件中 - 我想避免在每封电子邮件中从外部托管图像。
与您不同,附件文件没有问题,但我在显示内联图像时遇到了问题 (Windows 10 Mail 16005.11629.20174.0
)。
不幸的是,正确处理 MIME 消息中的 non-standard 方法是一项预期具有良好电子邮件客户端的功能。显然 Windows 10 邮件还没有 "good"。
我推荐你使用的结构是:
multipart/mixed
├─── multipart/related
│ ├─── multipart/alternative
│ │ ├─── text/plain
│ │ └─── text/html
│ └─── image/png - inline image
└─── application/pdf - attachment
我在以下客户端中使用此结构没有问题。
- Windows 10 封邮件
- Gmail 网络 & Android
- Outlook Web & Android & Windows 桌面
- 蓝色邮件Android
- Roundcube 网站
- MailEnable Web
那么,试试下面的代码,看看它是否适合你。
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)
我通过 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 mail client, Roundcube} except for the Windows 10个邮件客户端。出于某种原因,Windows 10 内置邮件客户端似乎可以很好地显示内联图像,但没有显示其他附件的踪迹。
我在 Internet 上找到的有限信息表明这是 Windows 10 邮件客户端的错误,但我个人收到了该客户端中的其他电子邮件,包括内联附件和附加附件,显示得很好 - 所以显然有某种解决方法/替代消息结构有效。
因此我的问题是:我怎样才能以不同的方式格式化此邮件,以便它在所有相关的邮件客户端中正确显示?
我正在这样写邮件,在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())
更新: 这是来自 Windows 10 封邮件的邮件数据(通过 "save" 功能输出 - 无法查看原始邮件我能找到的数据...)
MIME-Version: 1.0
Date: Thu, 30 May 2019 17:45:28 +0200
From: xxxxx <xxxxx>
Subject: xxxxx
Thread-Topic: xxxxx
To: "xxxxx" <xxxxx>
Content-Type: multipart/related;
boundary="_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_"
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"
<center><img src=3D"cid:embedded-image" alt=...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_
Content-Type: image/png; name="embedded-image.png"
Content-ID: <embedded-image>
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="embedded-image.png"
iVBORw0KGgoAAAAN...
--_5D6C043C-FD42-42F9-B0E0-841DBFBA96D5_--
我不确定这是从应用程序保存电子邮件的结果,还是应用程序实际存储的内容,但 Windows 10 邮件应用程序似乎删除了所有内容在 multipart/related
节之外 - 也就是说,它只采用所选择的 alternative
并且不存储任何其他内容。
为了比较,我找到并导出了一封显示正确的电子邮件,其中包含图像、html 和附件,但格式似乎简单得多 - 该电子邮件仅包含 multipart/mixed
图层,带有 text/html
和 application/pdf
附件。该电子邮件使用了 HTML 中引用的外部图像,而不是将其嵌入邮件中 - 我想避免在每封电子邮件中从外部托管图像。
与您不同,附件文件没有问题,但我在显示内联图像时遇到了问题 (Windows 10 Mail 16005.11629.20174.0
)。
不幸的是,正确处理 MIME 消息中的 non-standard 方法是一项预期具有良好电子邮件客户端的功能。显然 Windows 10 邮件还没有 "good"。
我推荐你使用的结构是:
multipart/mixed
├─── multipart/related
│ ├─── multipart/alternative
│ │ ├─── text/plain
│ │ └─── text/html
│ └─── image/png - inline image
└─── application/pdf - attachment
我在以下客户端中使用此结构没有问题。
- Windows 10 封邮件
- Gmail 网络 & Android
- Outlook Web & Android & Windows 桌面
- 蓝色邮件Android
- Roundcube 网站
- MailEnable Web
那么,试试下面的代码,看看它是否适合你。
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)