Mailkit - 接收从苹果邮件发送的消息时没有附件或 html 正文
Posted
技术标签:
【中文标题】Mailkit - 接收从苹果邮件发送的消息时没有附件或 html 正文【英文标题】:Mailkit - no attachments or html body when receiving message sent from apple mail 【发布时间】:2015-08-28 07:43:14 【问题描述】:我一直在使用 Mailkit 库来接收电子邮件,到目前为止它一直很棒。但是,我们发现通过 Mac 上的邮件应用程序发送的消息存在问题。例如,我们发送的带有 pdf 附件和 html 格式正文的消息被作为没有任何附件的对象接收(通过 IMailFolder.GetMessage),并且只有 HtmlBody 为空(仅接收 TextBody)
我正在从网络电子邮件客户端附上这封邮件的源代码(没有一些个人信息标题)(邮件在那里显示正常)
Content-Type: multipart/alternative; boundary="Apple-Mail=_CA0BDF81-AE2A-4E1A-9D37-8B30B5220C77"
Subject: Test
Date: Thu, 11 Jun 2015 07:00:29 -0700
Mime-Version: 1.0 (Mac OS X Mail 8.0 \(1990.1\))
X-Mailer: Apple Mail (2.1990.1)
--Apple-Mail=_CA0BDF81-AE2A-4E1A-9D37-8B30B5220C77
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
Hello goodbye pdf
--Apple-Mail=_CA0BDF81-AE2A-4E1A-9D37-8B30B5220C77
Content-Type: multipart/mixed;
boundary="Apple-Mail=_FA44F8C6-5F68-44EF-9537-8E8651DAAC0C"
--Apple-Mail=_FA44F8C6-5F68-44EF-9537-8E8651DAAC0C
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset=us-ascii
<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word;
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class=""><b class=""><i class="">Hello</i></b></div><div class=""><b class=""><i class="">goodbye pdf</i></b></div></body></html>
--Apple-Mail=_FA44F8C6-5F68-44EF-9537-8E8651DAAC0C
Content-Disposition: inline;
filename*=utf-8''Zamo%CC%81wienie%20ZAM21%2D150528%2D01.pdf
Content-Type: application/pdf;
x-unix-mode=0644;
name="=?utf-8?Q?Zamo=CC=81wienie_ZAM21-150528-01=2Epdf?="
Content-Transfer-Encoding: base64
(here is a base64-encoded pdf that is being decoded correctly)
--Apple-Mail=_FA44F8C6-5F68-44EF-9537-8E8651DAAC0C
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset=us-ascii
<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word;
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""></body></html>
--Apple-Mail=_FA44F8C6-5F68-44EF-9537-8E8651DAAC0C--
--Apple-Mail=_CA0BDF81-AE2A-4E1A-9D37-8B30B5220C77--
有人在使用 Mailkit 时遇到过这种问题吗?或者它可能不依赖于库,只是特定的苹果邮件?
【问题讨论】:
原始消息实际上是这样的吗?没有粘贴错误意外删除 Content-Type 和 Content-Transfer-Encoding 标头之前的换行符? 是的,确实应该有换行符,它们在邮件的源视图中没问题,很抱歉 @matt137 你如何查找苹果电子邮件的文本和附件,我面临同样的问题。我寻找 htmlbody 或 texbody。有没有办法解决这个问题 【参考方案1】:MimeMessage.TextBody 和 MimeMessage.HtmlBody 属性是使用常见做法来确定消息的适当文本正文部分的便利属性。遗憾的是,对于“这1部分和1部分只是文本正文,而这另外1部分是html正文”并没有严格的定义。
这条消息的结构如下:
multipart/alternative
text/plain
multipart/mixed
text/html
application/pdf
text/html
通常,在multipart/alternative
中,您会遇到以下两种情况中的一种:
multipart/alternative
text/plain
text/html
或
multipart/alternative
text/plain
multipart/related
text/html
application/pdf
multipart/alternative
定义了替代视图(我知道,我在这里说明的是显而易见的)。 MimeKit 会找到 text/plain
部分,因为它遵循一般约定。但下一个选择是multipart/mixed
。那不是 HTML,所以 MimeKit 不能将它作为 HtmlBody
返回。 MimeKit 确定HtmlBody
的逻辑只理解multipart/alternative
内部的multipart/related
,因为multipart/related
的规范定义了哪个部分是根文档(通常是HTML 文档)。
就您的消息而言,这意味着multipart/mixed
是您的备用视图,并且发送代理旨在将这三个部分按顺序呈现为备用消息正文。你真的不能只选择这 2 个 html 部分中的一个并将其用作 html 正文,因为如果没有另一个(并且没有 pdf),它将是不完整的。
也就是说,MimeKit 并不限制您使用 TextBody
和 HtmlBody
属性来获取您的消息正文。 MimeKit 提供了多种方法来自己迭代 MIME 结构,以使用自己的逻辑来获得所需的内容。
请参阅以下文档:
FAQ / MessageBody
Working With Messages
【讨论】:
感谢您的回答,特别是澄清了此消息的结构,但我无法做到。在第二篇文章的帮助下,我设法实现了不再像以前那样依赖 HtmlBody 和 TextBody 字段的代码 太棒了!很高兴我能提供帮助! @jstedfast 我有一封苹果电子邮件,其中我没有收到 textbody 或 html 正文中的电子邮件内容,如果我遍历 bodypart 中的 textpart,我得到 2 个 text/plain,我是否必须连接里面的文字。它总是包含电子邮件内容吗? 这是所有邮件客户端开发人员最终都会面临的问题,必须自己决定。做出这个决定没有硬性规定。 如果您在 MimeKit 中创建了此消息,那么您需要确保首先将 HTML 部分添加到 multipart/related 或使用MultipartRelated.Root
属性进行设置。以上是关于Mailkit - 接收从苹果邮件发送的消息时没有附件或 html 正文的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件
如何使用 mailkit/mimekit IMAP 下载/保存所有收件箱/发送的电子邮件?