代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

SmtpClient(.NET)不按照RFC 2047编码邮件头

  •  5
  • Pierre Arnaud  · 技术社区  · 15 年前

    SmtpClient 发送主题可能包含ASCII范围以外字符的电子邮件。这个 RFC 2047 定义电子邮件文本包含特殊字符时应如何编码。以下是电子邮件头中主题的示例:

    Subject: Votre enregistrement numéro 123

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

    ? , = (和其他)和空白,使用 =xx 转义序列。

    然而,当我看什么 SMTP客户端 生成时,我发现它没有逃逸空格,这意味着邮件客户端接收到以下标头:

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

    注: SMTP客户端 按预期对主题进行编码,产生正确的输出:

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

    2 回复  |  直到 12 年前
        1
  •  3
  •   Gabe Timothy Khouri    15 年前

    我要做的是检查是否有任何非ASCII字符,这样主题就会被编码,如果是这样,用下划线替换任何空格(ascii95)。这应该起作用,因为下划线字符应该由邮件阅读器解释为空格,但不应该由naive编码器编码。也许这个代码会起作用:

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

    另一种可能是将电子邮件的编码设置为Unicode或UTF-8,因为这似乎会触发邮件头的Base64编码,而不是带引号的可打印邮件头。使用不同的编码器应该可以完全避免这个错误。

        2
  •  1
  •   Pierre Arnaud    12 年前

    这在net4.0的实现中得到了修复 SmtpClient

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