我尝试使用我的专用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;
答案 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提取了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
值以及国际化的电子邮件地址)。
答案 2 :(得分:0)
我们使用vmime库在Office365 SMTP服务器上遇到了同样的问题。我们通过禁用SMTPUTF8来解决该问题,因此始终会编码非ASCII字符。
如JBert所述,GMail SMTP服务器使用相同的协议。