SmtpClient (NET) non codifica intestazione di posta elettronica in conformità con la RFC 2047

StackOverflow https://stackoverflow.com/questions/2447509

  •  20-09-2019
  •  | 
  •  

Domanda

Sto usando .NET SmtpClient per inviare e-mail in cui il soggetto potrebbe contenere caratteri al di fuori del range ASCII. Il RFC 2047 definisce come testo dell'e-mail deve essere codificato quando contiene caratteri speciali. Ecco un esempio di un soggetto in un'intestazione e-mail:

  

Subject: Votre enregistrement numéro 123

Questo dovrebbe diventare, dopo la codifica ISO-8859-1:

  

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

in cui tutti i caratteri speciali, tra cui ?, = (e altri) e lo spazio bianco, sono codificati utilizzando la sequenza =xx fuga.

Tuttavia, quando guardo quello SmtpClient produce, scopro che non sfugge gli spazi bianchi, il che significa che il client di posta elettronica riceve questa intestazione:

  

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

il che significa che la codifica è rotto rispetto al (la mia lettura del) RFC 2047. Alcuni client di posta elettronica sono perfettamente felici con questa codifica non corretta (la maggior parte di loro, infatti, tra cui Outlook e Gmail), ma uno (Wanadoo .fr) visualizza l'intestazione nel formato grezzo. Questo non è ciò che l'utente deve arrivare a vedere: - (

C'è una soluzione nota per questo problema?

Nota: l'attuazione di SmtpClient NET 4.0 codifica il soggetto come previsto, cedendo questa uscita, che è corretto:

  

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

È stato utile?

Soluzione

Il problema è che il mittente SMTP utilizza un generico quoted-printable encoder che non sa nulla circa la modalità speciale per le intestazioni, quindi ho il sospetto che non ci sarà alcuna soluzione semplice.

Quello che vorrei fare è controllare per vedere se ci sono dei caratteri non-ASCII in modo tale che il soggetto otterrà codificati, e in tal caso sostituire eventuali spazi con caratteri di sottolineatura (ASCII 95). Questo dovrebbe funzionare perché il carattere di sottolineatura deve essere interpretato come uno spazio da parte del lettore di posta, ma non dovrebbe avere codificato dal codificatore ingenuo. Forse questo codice funzionerà:

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

Un'altra possibilità è quella di impostare la codifica del vostro e-mail a Unicode o UTF-8 perché sembra far scattare la codifica Base64 di intestazioni invece di quoted-printable. Utilizzando un encoder diverso dovrebbe evitare del tutto il bug.

Altri suggerimenti

Questo è stato fissato nella NET 4.0 applicazione delle SmtpClient. Essa codifica il soggetto come previsto, cedendo questa uscita, che è corretto:

  

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top