【问题标题】:MailKit smtp.office365.com special character encoding issueMailKit smtp.office365.com 特殊字符编码问题
【发布时间】:2020-09-13 01:24:17
【问题描述】:

首先,我不知道我的问题是由于 Mailkit 使用不当(顺便说一句,这是一款很棒的软件)还是 smtp.office365.com 的配置错误。

MailKit 的版本是:2.6.0

我尝试在主题和正文中使用此字符串Test d'ênvoïe d'èmail avec des àccénts 发送消息。

当我使用smtp.office365.com账号发送邮件时,当我在office 365邮箱中收到邮件时,主题很好,但是正文看起来像Test d'�nvo�e d'�mail avec des �cc�nts

我尝试使用另一个公司的另一个 smtp.office365.com 帐户,当我在我的 office 365 盒子中收到它时,主题和正文都很好。

我尝试使用第一个 smtp 帐户向 GMAIL 邮箱发送相同的电子邮件。主体和身体都很好。

所以我不知道是第一个 smtp 帐户配置错误,还是 Outlook(桌面和网页)有问题?

发送电子邮件的代码非常简单,没有使用任何花哨的东西。该代码每天都用于从我们的软件发送电子邮件,这是我们第一次遇到此类 smtp 问题。让我困扰的是,它是一个 office 365 smtp,就像我们每天使用的一样,没有任何问题。

--- 编辑 根据@jstedfast 的要求,这里是 MimeKit/MailKit 生成的原始 MIME

From: email@domain.com
Date: Tue, 26 May 2020 14:16:13 +0000
Subject: Test =?utf-8?b?ZCfDqm52b8OvZSBkJ8OobWFpbCBhdmVjIGRlcyDDoGNjw6ludHM=?=
Message-Id: <54G3D036QAU4.3G654QDV2MVS2@4b245b0f83f4>
To: some@email.com
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="=-xjuWE0kh6/lmMc7JIcMJ3g=="

--=-xjuWE0kh6/lmMc7JIcMJ3g==
Content-Type: text/plain; charset=utf-8

Test d'ênvoïe d'èmail avec des àccénts ça, ~ $ #{][*µµ$£= +
--=-xjuWE0kh6/lmMc7JIcMJ3g==
Content-Type: text/html; charset=utf-8
Content-Id: <RUL3D036QAU4.Y7K3UPECLV0Q3@4b245b0f83f4>

Test d'ênvoïe d'èmail avec des àccénts ça, ~ $ #{][*µµ$£= +
--=-xjuWE0kh6/lmMc7JIcMJ3g==--

【问题讨论】:

  • 您正在使用特殊字符,因此您需要使用 System.Net.WebUtility.HtmlEncode(string) 对字符串进行编码。然后在接收端解码:System.Net.WebUtility.HtmlDecode(string)。如果这不是问题,那么要么您使用文本模式发送仅处理 ASCII 字符(除非您更改默认编码),要么您没有安装处理消息中使用的字符集(编码)的字体.我已经看到了所有 3 种类型的问题,很难区分是哪一种导致了这个问题。
  • 不,不要使用 HtmlEncode/Decode 进行编码 - 这是针对 HTML 而不是电子邮件,它使用不同的编码规则。

标签: c# email smtp office365 mailkit


【解决方案1】:

正如jdweng 在他的评论中建议的那样,这可能是接收 Outlook 客户端中的字体问题(换句话说,Outlook 使用的字体没有êïè 的字形、àé)。

由于每个字符没有得到 2 个像 ��(或 À�)这样的垃圾符号,这表明 MailKit 正在使用像 iso-8859-1(或 iso-8859-15?)这样的字符编码,并且接收 Outlook 客户端也使用单字节字符编码对其进行解码...或者 MailKit 使用 UTF-8 并且接收 Outlook 客户端正确地将其识别为 UTF-8(UTF -8 在拉丁字母中每个重音字符使用 2 个字节),但由于字体问题而无法显示字形。

如果您没有明确设置 MailKit 在邮件正文中使用的字符编码,则默认为 UTF-8(这表明存在字体问题)。

这是一个示例,说明如何指定要在 MimeKit/MailKit 中使用的字符编码:

var body = new TextPart ("plain");
body.SetText ("Test d'ênvoïe d'èmail avec des àccénts", Encoding.GetEncoding ("iso-8859-1"));

所以我想这给我们留下了一个问题,即您如何创建消息(尤其是消息正文)?

如果您可以分享 MimeKit/MailKit 生成的原始 MIME,那将很有帮助。

为此,您可以使用MimeMessage.WriteTo(string fileName) 方法,然后使用您喜欢的文本编辑器打开文件并复制和粘贴内容。

【讨论】:

  • 我已经编辑了我的问题以添加由 MimeKit/MailKit 生成的原始 MIME,
  • 好的,我的建议是:在通过 SmtpClient.Send()/SendAsync() 发送消息之前,调用message.Prepare (EncodingConstraint.SevenBit);
【解决方案2】:

正如jstedfast所解释的,解决这个愚蠢问题的方法是在发送电子邮件之前添加message.Prepare (EncodingConstraint.SevenBit);

感谢 jstedfast 的解决方案!你拯救了我的一天。

【讨论】:

    【解决方案3】:

    如果你从appsetting.json获取设置,尝试用编码保存,我还在MailBoxAddresEnconding.UTF8中添加了 strong>来自

            var mimeMessage = new MimeMessage();
            mimeMessage.From.Add(new MailboxAddress(Encoding.UTF8, _emailSettings.SenderName, _emailSettings.SenderEmail));
    

    这解决了我的问题。

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多