5

SmtpClient件名に ASCII 範囲外の文字が含まれている可能性がある電子メールを送信するために.NET を使用しています。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 を含みます) が、1 つ (wanadoo.fr)ヘッダーを生の形式で表示します。これは、ユーザーが見るべきものではありません:-(

この問題に対する既知の回避策はありますか?

注:の .NET 4.0 実装SmtpClientは、サブジェクトを期待どおりにエンコードし、正しい次の出力を生成します。

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

4

2 に答える 2

3

問題は、SMTP 送信者が、ヘッダーの特別なモードについて何も知らない一般的な quoted-printable エンコーダーを使用していることです。そのため、簡単な回避策はないと思います。

私がすることは、サブジェクトがエンコードされるような非 ASCII 文字があるかどうかを確認し、ある場合はスペースをアンダースコア (ASCII 95) に置き換えることです。アンダースコア文字はメール リーダーによってスペースとして解釈されるはずですが、ナイーブ エンコーダーによってエンコードされるべきではないため、これは機能するはずです。たぶん、このコードはうまくいくでしょう:

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

もう 1 つの可能性は、メールのエンコードを Unicode または UTF-8 に設定することです。これは、quoted-printable ではなくヘッダーの Base64 エンコードをトリガーするように思われるためです。別のエンコーダーを使用すると、バグを完全に回避できます。

于 2010-03-16T04:44:21.503 に答える
1

これは、のNET4.0実装で修正されましたSmtpClient。サブジェクトを期待どおりにエンコードし、次の出力を生成します。これは正しいです。

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

于 2012-04-11T05:28:19.643 に答える