SmtpClient(.NET)不对符合RFC 2047的邮件头进行编码

时间:2010-03-15 13:43:04

标签: .net encoding smtpclient

我正在使用.NET SmtpClient发送电子邮件,其中主题可能包含ASCII范围之外的字符。 RFC 2047定义了电子邮件文本在包含特殊字符时应如何编码。以下是电子邮件标题中主题的示例:

  

Subject: Votre enregistrement numéro 123

在编码为ISO-8859-1后,这应该成为:

  

Subject: =?iso-8859-1?Q?Votre=20enregistrement=20num=E9ro=20123?=

其中所有特殊字符(包括?=(以及其他)和空格均使用=xx转义序列进行编码。

但是,当我查看SmtpClient生成的内容时,我发现它不会逃避空格,这意味着邮件客户端会收到此标题:

  

Subject: =?iso-8859-1?Q?Votre enregistrement num=E9ro 123?=

意味着编码在(我的阅读)RFC 2047中被打破。一些电子邮件客户端对这种不正确的编码(其中大多数,实际上包括Outlook和gmail)非常满意,但是其中一个(wanadoo) .fr)以原始格式显示标题。这不是用户应该看到的: - (

此问题是否有任何已知的解决方法?

注意: SmtpClient的.NET 4.0实现按预期编码主题,产生此输出,这是正确的:

  

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=

2 个答案:

答案 0 :(得分:3)

问题是SMTP发件人使用的是通用的可引用打印编码器,它对标题的特殊模式一无所知,所以我怀疑没有简单的解决方法。

我要做的是检查是否有任何非ASCII字符,以便主题将被编码,如果是,则用下划线替换任何空格(ASCII 95)。这应该有效,因为下划线字符应该被邮件阅读器解释为空格,但不应该由朴素编码器编码。也许这段代码可行:

string FixSubject(string subject)
{
    foreach (char ch in subject)
        if (ch > '\x007f')
            return subject.Replace(" ", "_");
    return subject;
}

另一种可能性是将您的电子邮件的编码设置为Unicode或UTF-8,因为这似乎触发了标头的Base64编码而不是quoted-printable。使用不同的编码器应该完全避免这个错误。

答案 1 :(得分:1)

这已在SmtpClient的.NET 4.0实现中修复。它按预期编码主题,产生这个输出,这是正确的:

  

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=