Eli*_*Eli 11 python email mime multipart smtplib
我通过Python email/ 发送的电子邮件有一个奇怪的问题smtplib。
我正在尝试撰写包含以下内容的电子邮件:
MIME结构的设置如下:
multipart/mixed
multipart/alternative
text/plain
multipart/related
text/html
image/png - inline
application/pdf - attachment
Run Code Online (Sandbox Code Playgroud)
除 Windows 10邮件客户端外,我测试过的所有邮件客户端{在Android上的BlueMail,iOS邮件客户端,Roundcube}似乎都可以正常工作。出于某种原因,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())
Run Code Online (Sandbox Code Playgroud)
更新:这是Windows 10邮件中的消息数据(通过“保存”功能输出-无法查看我可以找到的原始消息原始数据...)
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_--
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是从应用程序中保存电子邮件的结果,还是这是应用程序实际存储的内容,但似乎Windows 10 Mail应用程序正在multipart/related切掉节外的所有内容-也就是说,这仅仅是以选定的alternative而不存储其他任何东西。
为了便于比较,我发现和导出的正常显示,与图像,HTML和附件的电子邮件,但格式似乎是一个简单得多-该电子邮件仅由一个的multipart/mixed与层text/html和application/pdf附件。该电子邮件使用了HTML中引用的外部图像,而不是将其嵌入消息中-我想避免将图像托管在每封电子邮件的外部。
与您不同的是,附件文件没有问题,但我在显示内联图像 ( Windows 10 Mail 16005.11629.20174.0) 时遇到了问题。
不幸的是,正确处理 MIME 消息中的非标准方法是良好电子邮件客户端所期望的一项功能。显然 Windows 10 邮件还没有那么“好”。
\n\n我推荐您使用的结构是:
\n\nmultipart/mixed\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 multipart/related\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 multipart/alternative\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 text/plain\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 text/html\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 image/png - inline image\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 application/pdf - attachment\nRun Code Online (Sandbox Code Playgroud)\n\n我在以下客户端中使用此结构没有遇到任何问题。
\n\n因此,请尝试以下代码,看看它是否适合您。
\n\nmessage = MIMEMultipart("mixed")\nmessage["From"] = ...\n.\n.\n.\nbodyText = "..."\nbodyHTML = "..."\nmailFrom = "..."\ntargetEmail = "..."\nimageContent = ...\nfileContent = ...\n\nrelatedBody = MIMEMultipart("related")\n\nmessageBody = MIMEMultipart("alternative")\nmessageBody.attach(MIMEText(bodyText, "plain"))\nmessageBody.attach(MIMEText(bodyHTML, "html"))\n\nrelatedBody.attach(messageBody)\n\nmessageImage = MIMEImage(imageContent)\nmessageImage.add_header("Content-Disposition", \'inline; filename="..."\')\nmessageImage.add_header("Content-ID", "<id used in html body>")\n\nrelatedBody.attach(messageImage)\n\nmessage.attach(relatedBody)\n\nattachment = MIMEApplication(fileContent)\nattachment.add_header("Content-Disposition", \'attachment; filename="..."\')\n\nmessage.attach(attachment)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |