24

我正在尝试使用下面的代码通过以下代码发送消息,System.Net.Mail并且有时会收到'=?utf-8?B?W3AxM25dIEZpbGV...'(修剪)之类的主题。这是被调用的代码:

MailMessage message = new MailMessage()
{
    From = new MailAddress("someone@somewhere.com", "Service"),
    BodyEncoding = Encoding.UTF8,
    Body = body,
    IsBodyHtml = true,
    ReplyTo = new MailAddress("do.not.reply@somewhere.com"),
    SubjectEncoding = Encoding.UTF8
};

foreach (string emailAddress in addresses)
{
    message.To.Add(new MailAddress(emailAddress.Trim(), "Person"));
}

message.Subject = subject;

我想强调的是,这种情况并不总是发生。

我究竟做错了什么?

4

3 回答 3

36

当您的主题包含 ASCII 范围之外的字符时,邮件软件必须对它们进行编码(RFC2822 邮件不允许标题中包含非 ASCII 字符)。有两种方法可以做到这一点:

  • 引用可打印(主题以 开头"=?utf-8?Q"
  • Base64(主题以 开头"=?utf-8?B"

该框架似乎已经发现 Base64 编码比引用可打印编码更有效(=更短)。当您的主题包含相对较多的 ASCII 范围之外的字符时,这是有道理的。

回答你的问题:你没有做错任何事。这就是带有非 ASCII 字符的 Internet 邮件的样子。当然,阅读此类邮件的软件应该检测和解码此类主题字段。

于 2009-01-18T09:08:27.757 回答
14

我在调试相同问题时遇到了这篇文章,根据我的进一步调查,我可以为 Andreas 提供另一种解释:

问题可能是您的电子邮件客户端软件(在我的例子中是 Outlook 2003)错误地解码了主题行。换句话说,这是 Outlook 中的错误,而不是 .NET 或您的程序中的错误。

如果您使用这样的主题值(字母“c”重复 256 次),它在 Outlook 中显示正常:

subject = New String("c"c, 256)

同样,如果您使用这样的主题(字母“c”重复 178 次,并附加了 Unicode 不间断空格字符),它也会在 Outlook 中按预期显示:

subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160})

但是,以下主题在 Outlook 中显示为“=?utf-8?B”-前置垃圾:

subject = New String("c"c, 179) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160})

不同之处在于第三个主题行在 UTF-8 编码时为 256 个字节。我假设 Outlook 必须在显示之前将主题行截断为 255 个字符......这很好,只是它通过将编码字符串截断为 255 个字节来执行此操作,这会切断编码终止符(“?=”) ,使其无法解码。

这是 Outlook 中的错误,而不是您的邮件提供商或 .NET;您可以通过右键单击邮件列表中的邮件并从上下文菜单中选择“选项...”,然后在“Internet 标题”框中向下滚动,直到在 Outlook 中看到完整的、未截断的 UTF-8 编码主题行您会看到以“主题:”开头的行。

与 Andreas 建议的情况相反,问题不仅在有很多非 ASCII 字符时出现,而且在有一个或多个非 ASCII 字符且主题行很长时会出现。解决方法可能是使用较短的主题行或删除主题中的所有非 ASCII 字符。

(这个错误对我来说特别棘手,因为如上所述,问题数据不包含明显的非 ASCII 字符——只有几个不间断的空格。当您将它们打印到控制台。此外,如果您在 Visual Studio 调试器中更改字符串变量的值,它会默默地将它们替换为常规空格。)

于 2009-07-31T20:25:58.270 回答
2

答案可能在修剪后的主题的其余部分——您提供的部分解码为“[p13n] 文件”,但您是否在其中有任何非 ASCII 字符,那么我希望它能够像它一样编码

于 2009-01-18T09:08:13.140 回答