Skip to main content
 首页 » 编程设计

c#之Mailkit之收到从苹果邮件发送的邮件时没有附件或 html 正文

2024年06月20日39JeffreyZhao

我一直在使用 Mailkit 库来接收电子邮件,到目前为止效果非常好。但是,我们发现通过 Mac 上的“邮件”应用程序发送的邮件存在问题。例如,我们发送的带有 pdf 附件和 html 格式正文的消息正在被接收(通过 IMailFolder.GetMessage)作为没有任何附件的对象,并且只有 HtmlBody 为 null(仅接收 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 时遇到过此类问题吗?或者它可能不依赖于图书馆,只是特定的苹果邮件?

请您参考如下方法:

MimeMessage.TextBody 和 MimeMessage.HtmlBody 属性是便利属性,它们使用常见做法来确定消息的适当文本正文部分是什么。不幸的是,“这1部分和1部分只是文本主体,另外1部分是html主体”没有严格的定义。

这条消息的结构如下:

multipart/alternative 
  text/plain 
  multipart/mixed 
    text/html 
    application/pdf 
    text/html 

通常,在 multipart/alternative 中,您将遇到以下 2 种情况中的一种:

multipart/alternative 
  text/plain 
  text/html 

或

multipart/alternative 
  text/plain 
  multipart/related 
    text/html 
    application/pdf 

multipart/alternative定义替代 View (我知道,我在这里说的很明显)。 MimeKit 找到 text/plain部分是因为它遵循一般惯例。但下一个选择是 multipart/mixed .那不是 HTML,因此 MimeKit 无法将其作为 HtmlBody 返回. MimeKit 确定 HtmlBody 的逻辑只懂multipart/related在 multipart/alternative 里面因为 multipart/related 的规范定义哪一部分是根文档(通常是 HTML 文档)。

对于您的消息,这意味着 multipart/mixed 是您的备用 View 和发送代理,旨在将这 3 个部分按顺序呈现为备用消息正文。您不能真的只选择这 2 个 html 部分中的一个并将其用作 html 正文,因为如果没有另一个(并且没有 pdf),它将是不完整的。

也就是说,MimeKit 并不限制您使用 TextBody和 HtmlBody属性来获取您的消息正文。 MimeKit 提供了多种方法来自行迭代 MIME 结构,以使用您自己的逻辑来获取您需要的内容。

引用以下文档:

FAQ / MessageBody

Working With Messages