我尝试使用专用的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标头字符集...我发现的所有分辨率都无济于事。也许这是仅通过office365实现的某些特定SmtpClient问题?

而且设置主体编码也无济于事

mailMsg.BodyEncoding = Encoding.UTF8;

最佳答案

我公司的帐户也有同样的问题。到目前为止,这是我的发现:

看起来像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会在接收之前即时修复并修复该错误消息/ SMTP会话。

无论哪种方式,我都使用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属性)地址)。

10-08 19:25