首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不显示多部分/混合电子邮件附件,但仅在Windows 10邮件中显示

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

Stack Overflow用户
提问于 2019-05-30 13:41:04
回答 1查看 2.8K关注 0票数 15

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

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

  • 纯文本和HTML消息体的替代方案
  • 嵌入在HTML正文中的图像
  • 单独的非内联附件

MIME结构的设置如下:

代码语言:javascript
运行
复制
multipart/mixed
    multipart/alternative
        text/plain
        multipart/related
            text/html
            image/png - inline
    application/pdf - attachment

这似乎在我测试过的每个邮件客户端上都正常工作,除了Windows10邮件客户端的BlueMail之外,iOS邮件客户端、Roundcube} 都是如此。由于某些原因,Windows 10内置邮件客户端似乎很好地显示了内联映像,但没有显示其他附件的踪迹。

我在互联网上找到的有限信息表明,这是Windows 10邮件客户端的一个漏洞,但我个人在这个客户端收到了其他带有内联和附加附件的电子邮件,这些邮件显示得很好--因此显然有某种变通的/替代的消息结构可以工作。

因此,我的问题是:如何以不同的格式设置此消息,使其在所有相关邮件客户端中正确显示?

我用Python编写了这样的电子邮件:

代码语言:javascript
运行
复制
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())

更新:这里是来自Windows10邮件的消息数据(作为通过“保存”功能的输出-无法查看原始消息原始数据,我可以找到.)

代码语言:javascript
运行
复制
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_--

我不确定这是从应用程序中保存电子邮件的结果,还是应用程序实际存储的内容,但看来Windows10Mail应用程序正在删除multipart/related节之外的所有内容--也就是说,它只选择选择的alternative,而不存储任何其他内容。

作为比较,我已经找到并导出了一封显示正确的电子邮件,其中包含了图像、html和附件,但格式似乎要简单得多--该电子邮件仅由一个带有text/htmlapplication/pdf附件的application/pdf层组成。该电子邮件使用了HTML中引用的外部图像,而不是将其嵌入到消息中--我希望避免在每个电子邮件外部托管图像。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 20:08:36

与您不同的是,附件文件没有问题,相反,我在显示内联图像(Windows 10 Mail 16005.11629.20174.0)方面遇到了问题。

不幸的是,正确地处理MIME消息中的非标准方法是一项功能,期望它具有良好的电子邮件客户端。显然,Windows 10 Mail还没有那么“好”。

我建议您使用的结构是:

代码语言:javascript
运行
复制
multipart/mixed
├─── multipart/related
│   ├─── multipart/alternative
│   │   ├─── text/plain
│   │   └─── text/html
│   └─── image/png - inline image
└─── application/pdf - attachment

在以下客户端中,我对此结构没有任何问题。

  • Windows 10邮件
  • Gmail Web和Android
  • Outlook Web & Android和Windows桌面
  • 蓝色邮件Android
  • 圆立方体网
  • MailEnable网站

因此,让下面的代码试着看看它是否适合您。

代码语言:javascript
运行
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56379483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档