smtp.office365.com主题编码问题

时间:2018-04-13 13:54:37

标签: c# office365 smtpclient mailmessage

我尝试使用我的专用office365帐户发送电子邮件,但我遇到主题编码问题 - 我的所有特殊字符都替换为“?”。

我使用的代码非常简单,可以在smtp-mail.outlook.com上使用不同的测试帐户。

using (var mailMsg = new MailMessage(sender, recipient))
{
    mailMsg.IsBodyHtml = true;
    mailMsg.Subject = "Hello world żółćąź";
    mailMsg.Body = body;

    using (var smtpClient = new SmtpClient())
    {
        smtpClient.Credentials = new NetworkCredential("email", "password");
        smtpClient.EnableSsl = true;
        smtpClient.Host = "smtp.office365.com";
        smtpClient.Port = 587;

        await smtpClient.SendMailAsync(mailMsg);
    }
}

我尝试设置所有可能的主题编码而没有运气。将主题字符串转换为Base64String也不起作用。还尝试设置Content-Type标题字符集...我发现的所有分辨率都没有帮助我。也许这只是一个特定的SmtpClient问题,只与office365有关?

并且设置身体编码也无济于事

mailMsg.BodyEncoding = Encoding.UTF8;

3 个答案:

答案 0 :(得分:1)

设置邮件的编码,使其支持您使用的字符,因为默认值为us-ascii

mailMsg.BodyEncoding = Encoding.UTF8;

答案 1 :(得分:1)

我公司的帐户存在相同的问题。到目前为止,这是我的发现:

看起来像the Office365 e-mail servers enabled the SMTPUTF8 extension a few months ago,它将System.Net.Mail.SmtpClient类的行为更改为发送不同的SMTP命令和不同的DATA有效负载。

就我而言,该消息在发送到另一个Office365帐户时总是可以正常到达,但是对于其他帐户,我们从远程SMTP服务器接收了电子邮件退回通知,该邮件接受了Office365中继的电子邮件。该错误类似于“接收到无效数据,预期为7位安全字符”。因此,我可以想象,来自OP的远程SMTP服务器可能会用问号静默替换7位低范围之外的所有字符。

通过GMail(也具有SMTPUTF8扩展名)发送邮件没有问题。

到目前为止,我尚未调试SmtpClient参考源,以查看将什么发送到Office365服务器。因此,根本原因可能是SmtpClient发送了一个好消息,即Office365在中继之前“损坏了”,而GMail却没有问题地继续发送;或SmtpClient建立一个错误的消息/ SMTP会话,Office365默默地接受并转发到远程SMTP服务器,但GMail会在中继之前即时接收并修复该会话。

无论哪种方式,我都使用NuGet提取了MailKitMimeKit库,并使用它们来发送电子邮件。它们提供了SMTP协议日志记录来解决问题,并且似乎可以通过正确发送RFC 6531中定义的SMTPUTF88BITMIME标志来解决上述问题。read configuration from the usual Web.config or App.config location确实需要额外的工作,但是图书馆可以完成这项工作。

如果您想继续使用SmtpClient,则应该与Microsoft(这是他们的服务和.NET Runtime)联系,或者运行没有SMTPUTF8扩展名的私人SMTP服务器,该扩展名会中继到远程服务器。在后一种情况下,SmtpClient应该正确编码所有标头和有效负载(尽管这确实意味着当您想发送给别人时,您可能无法使用International属性的DeliveryFormat值以及国际化的电子邮件地址)。

答案 2 :(得分:0)

我们使用vmime库在Office365 SMTP服务器上遇到了同样的问题。我们通过禁用SMTPUTF8来解决该问题,因此始终会编码非ASCII字符。

如JBert所述,GMail SMTP服务器使用相同的协议。