2010-03-15 10 views
5

Sto utilizzando .NET SmtpClient per inviare e-mail in cui il soggetto potrebbe contenere caratteri al di fuori dell'intervallo ASCII. Il RFC 2047 definisce come il testo di posta elettronica deve essere codificato quando contiene caratteri speciali. Ecco un esempio di un soggetto in un'intestazione di posta elettronica:SmtpClient (.NET) non codifica l'intestazione della posta in conformità con RFC 2047

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?=

dove tutti i caratteri speciali, incluso ?, = (e altri) e wh ite space, sono codificati usando la sequenza di escape =xx.

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?=

senso che la codifica è interrotta rispetto a (la mia lettura di) RFC 2047. Alcuni client di posta elettronica sono perfettamente soddisfatti di questa codifica errata (la maggior parte di essi, infatti, inclusi Outlook e Gmail), ma uno (wanadoo.fr) visualizza il intestazione nel suo formato raw. Questo non è ciò che l'utente deve arrivare a vedere :-(

C'è qualche 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?=

+0

Non ho una soluzione per voi, ma io corroborare la tua interpretazione della RFC 2047, in particolare il paragrafo 4.2 (3): "In particolare, SPACE e TAB NON DEVONO essere rappresentati come se stessi all'interno di parole codificate." (Nota che invece di = 20 puoi usare anche un carattere di sottolineatura) – Joe

+0

+1 per una grande domanda/problema sollevato e che in realtà citi la RFC in questione, hai fatto i compiti e hai ancora un problema da risolvere – curtisk

+0

Specifica codifica dei messaggi o lasci che SmtpClient funzioni nel modo predefinito? – Timores

risposta

3

il problema è che il mittente SMTP utilizza un generico quoted-printable enc o che non sa nulla della modalità speciale per le intestazioni, quindi ho il sospetto che non ci sarà una soluzione semplice.

Quello che vorrei fare è controllare se ci sono caratteri non ASCII tali che il soggetto venga codificato, e in tal caso sostituire spazi con caratteri di sottolineatura (ASCII 95). Questo dovrebbe funzionare perché il carattere di sottolineatura dovrebbe essere interpretato come spazio dal lettore di posta, ma non dovrebbe essere codificato dal codificatore naive. Forse questo codice funziona:

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. L'uso di un codificatore differente dovrebbe evitare del tutto l'errore.

+0

Infatti, la sostituzione dello spazio con il carattere di sottolineatura nel soggetto produce un'intestazione corretta. –

+1

Questo hack non è più necessario con .NET 4.0. –

1

Questo è stato risolto nell'implementazione NET 4.0 di SmtpClient.Essa codifica il soggetto come previsto, cedendo questa uscita, che è corretto:

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

Problemi correlati