我尝试使用专用的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提取了MailKit和MimeKit库,并使用它们来发送我的电子邮件。它们提供了SMTP协议日志记录来解决问题,并且似乎可以通过正确发送RFC 6531中定义的SMTPUTF8
和8BITMIME
标志来解决上述问题。read configuration from the usual Web.config or App.config location确实需要额外的工作,但是库却可以完成此工作。
如果要继续使用SmtpClient
,则应该与Microsoft(这是他们的服务和.NET Runtime)联系,或者运行没有SMTPUTF8
扩展名的私人SMTP服务器,该扩展名会中继到远程服务器。在后一种情况下,SmtpClient
应该正确编码所有标头和有效负载(尽管这确实意味着当您想通过国际化电子邮件发送给他人时,您可能无法使用International
值作为DeliveryFormat
属性)地址)。