2010-03-15 5 views
5

J'utilise .NET SmtpClient pour envoyer un courrier électronique lorsque le sujet peut contenir des caractères en dehors de la plage ASCII. Le RFC 2047 définit comment le texte de courrier électronique doit être codé lorsqu'il contient des caractères spéciaux. Voici un exemple d'un sujet dans un en-tête e-mail:SmtpClient (.NET) n'encode pas l'en-tête de courrier conformément à RFC 2047

Subject: Votre enregistrement numéro 123

Cela devrait devenir, après l'encodage ISO-8859-1:

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

où tous les caractères spéciaux, y compris ?, = (et autres) et espace, sont codés en utilisant la séquence d'échappement =xx.

Cependant, quand je regarde ce que SmtpClient produit, je découvre qu'il n'échappe pas les espaces blancs, ce qui signifie que le client de messagerie reçoit cet en-tête:

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

sens que le codage est cassé par rapport à (ma lecture de) RFC 2047. Certains clients de messagerie sont parfaitement satisfaits de cet encodage incorrect (la plupart d'entre eux, en fait, y compris Outlook et Gmail), mais un (wanadoo.fr) affiche le en-tête dans son format brut. Ce n'est pas ce que l'utilisateur doit se voir :-(

Y at-il de solution connue pour ce problème

Remarque: la mise en œuvre .NET 4.0 de SmtpClient code le sujet comme prévu, ce qui donne cette sortie , ce qui est correct:

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

+0

Je n'ai pas une solution pour vous, mais je vais confirmer votre interprétation de la RFC 2047, section spécifique 4.2 (3): "En particulier, ESPACE et TAB NE DOIVENT PAS être représentés comme eux-mêmes dans les mots codés." (Notez qu'au lieu de = 20, vous pouvez également utiliser un trait de soulignement) – Joe

+0

+1 pour une grande question/problème soulevé et que vous citez en fait le RFC correspondant, vous avez fait vos devoirs et avez encore un problème à résoudre – curtisk

+0

Spécifiez-vous encodage de message ou laissez-vous fonctionner SmtpClient de la manière par défaut? – Timores

Répondre

3

le problème est que l'expéditeur SMTP utilise un enc générique cité imprimable ou qui ne sait rien sur le mode spécial pour les en-têtes, donc je soupçonne qu'il n'y aura pas de solution de contournement simple. Ce que je ferais est de vérifier s'il y a des caractères non-ASCII tels que le sujet sera codé, et si c'est le cas remplacer tous les espaces avec des traits de soulignement (ASCII 95). Cela devrait fonctionner parce que le caractère de soulignement devrait être interprété comme un espace par le lecteur de courrier mais ne devrait pas être codé par l'encodeur naïf. Peut-être que ce code fonctionnera:

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

Une autre possibilité est de définir l'encodage de votre e-mail à Unicode ou UTF-8 parce que cela semble déclencher Base64 des en-têtes au lieu de cité imprimable. L'utilisation d'un encodeur différent devrait éviter complètement le bug.

+0

En effet, remplacer l'espace par le trait de soulignement dans le sujet produit un en-tête correct. –

+1

Ce hack n'est plus nécessaire avec .NET 4.0. –

1

Cela a été corrigé dans l'implémentation NET 4.0 de SmtpClient.Il code le sujet comme prévu, ce qui donne cette sortie, ce qui est correct:

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