当前位置: 首页 > 编程语言 > C#

System.Net.Mailand=-utf-8?乙?XXXXX...标题分享

时间:2023-04-10 20:01:33 C#

System.Net.Mailand=?utf-8?乙?XXXXX...header我正在尝试使用下面的代码通过System.Net.Mail发送消息,有时我会收到类似“=?utf-8?B?W3AxM25dIEZpbGV...”的主题(已修剪)。这是调用的代码:MailMessagemessage=newMailMessage(){From=newMailAddress("someone@somewhere.com","Service"),BodyEncoding=Encoding.UTF8,Body=body,IsBodyHtml=true,ReplyTo=newMailAddress("do.not.reply@somewhere.com"),SubjectEncoding=Encoding.UTF8};foreach(地址中的字符串电子邮件地址){message.To.Add(newMailAddress(emailAddress.Trim(),"Person"));}message.Subject=主题;我想强调的是,这不会一直发生。我究竟做错了什么?当您的主题包含ASCII范围之外的字符时,邮件软件必须对其进行编码(RFC2822邮件不允许标头中包含非ASCII字符)。有两种方法可以做到这一点:似乎框架已经决定Base64编码比引用的可打印编码更有效(=更短)。当主题包含相对多的ASCII范围之外的字符时,这是有意义的。回答你的问题:你没有做错任何事。这就是带有非ASCII字符的Internet邮件的样子。当然,读取此类邮件的软件应该检测并解码此类主题字段。当我调试同样的问题时,我发现了这篇文章,根据我的进一步调查,我可以为Andreas提供另一种解释:问题可能是您的电子邮件客户端软件(在我的例子中是Outlook2003)错误地解码了主题行。换句话说,这是Outlook中的错误,而不是.NET或您的程序中的错误。如果您使用这样的主题值(字母“c”重复256次),它在Outlook中显示正常:subject=NewString("c"c,256)同样,如果您使用这样的主题(字母“c”重复178次,附加Unicode不间断空格字符),它也在Outlook中按预期显示:subject=NewString("c"c,178)+System.Text.Encoding.UTF8.GetChars(NewByte(){194,160})但是,以下主题在Outlook中显示为“=?utf-8?B”-预填充垃圾:subject=NewString("c"c,179)+System.Text.Encoding.UTF8.GetChars(NewByte(){194,160})区别在于第三个主题行在UTF-8编码时是256字节。我假设Outlook必须在显示主题行之前将其截断为255个字符......除了它通过将编码字符串截断为255个字节(这会切断编码终止符(“?=”))来做到这一点很好,让它不可解码。这是Outlook中的错误,而不是您的邮件提供商或.NET中的错误;通过右键单击邮件列表中的邮件并从上下文菜单中选择“选项...”,然后在“Internet标头”框中向下滚动,可以在Outlook中看到完整的、未截断的UTF-8编码主题行.您会看到以“主题:”开头的行。与Andreas所建议的相反,问题不仅出现在有很多非ASCII字符的情况下,而且出现在有一个或多个非ASCII字符并且主题行很长的情况下。解决方法可能是使用较短的主题行或删除主题中的所有非ASCII字符。(这个错误对我来说特别棘手,因为如上所述,问题数据中没有明显的非ASCII字符-只有几个不间断的空格。当你打印它们时,它们看起来与常规ASCII空格相同。此外,如果在VisualStudio调试器中更改字符串变量的值,它将静态地用常规空格替换它们。)答案可能在修剪线程的其余部分-你提供的部分解码为“[p13n]文件”,但你在那里有任何非ASCII字符,那么我希望它可以像上面那样编码:System.Net.Mail和=?utf-8?乙?XXXXX...标题分享的全部内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: