2016-02-02 1 views
8

En utilisant les classes SmtpClient, MailMessage et MailAddress, je ne peux pas envoyer des adresses électroniques telles que å[email protected] Je reçois les erreurs/exceptions comme indiqué ci-dessous:Impossible d'envoyer des e-mails à des adresses avec des caractères scandinaves

Un caractère non valide a été trouvé dans l'en-tête du message: 'å'.

--------------------------- Erreur lors de l'envoi de l'e-mail --------------- ------------ System.Net.Mail.SmtpException: Le client ou le serveur est uniquement configuré pour les adresses de messagerie avec les parties locales ASCII : å[email protected]

à System.Net.Mail.MailAddress.GetUser (Boolean allowUnicode)

à System.Net.Mail.MailAddress.GetAddress (Boolean allowUnicode)

à System.Net.Mail.MailAddress.Encode (Int32 charsConsumed, Boolean allowUnicode)

à System.Net.Mail.MailAddressCollection.Encode (Int32 charsConsumed, Boolean allowUnicode) à System.Net.Mail.Message.PrepareHeaders (Boolean sendEnvelope, booléenne allowUnicode) à System.Net.Mail.Message.Send (écrivain BaseWriter, Boolean sendEnvelope, Boolean allowUnicode) à System.Net.Mail.SmtpClient.Send (message MailMessage)

Ces caractères dans mon sujet/corps vont bien, mais pas dans les adresses e-mail.

J'ai essayé d'installer SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International, ou MailMessage.HeadersEncoding = Encoding.Unicode (ou UTF8) et il ne semble pas changer quoi que ce soit. Ce sont de vraies adresses e-mail des personnes avec lesquelles nous devons communiquer, donc c'est un peu un problème.

J'ai creusé à travers le code source .Net mais pas vraiment obtenu n'importe où. J'ai repéré une propriété ServerSupportsEai, et Google me dit EAI signifie Email Address Internationalization (https://tools.ietf.org/html/rfc5336) mais il est assez difficile de savoir si c'est une limitation dans mon code, ou si le serveur spécifique à qui je parle ne supporte pas cela. .. puisque j'utilise un serveur de test pour éviter d'envoyer des emails à des suédois sans méfiance!

Est-ce que quelqu'un peut m'aider à éclaircir cela? Est-ce que .Net le supporte? Si oui, que faire de mon code client pour l'activer?

+0

Je pense que le problème n'est peut-être pas dans le code .NET, mais dans la configuration de votre serveur de messagerie. Pouvez-vous essayer d'utiliser un autre serveur? – Pikoh

+0

(5336 est remplacé par 6531/2) Cette fonctionnalité nécessite le serveur SMTP pour soutenir SMTPUTF8, essayez avec Gmail qui fait, si cela fonctionne votre serveur c'est le problème. –

+0

Merci. Après avoir lutté avec gmail "votre application n'utilise pas la sécurité à jour et a été bloquée" Je suis en train de tester ceci - bien que je ne puisse toujours pas envoyer à une personne très poliment –

Répondre

9

Pour pouvoir envoyer des caractères UTF-8 selon le code RFC6531, le client et le serveur doivent le prendre en charge. Si vous utilisez l'implémentation .NET de SmtpClient, vous devez cibler la version 4.5 du framework car cette implémentation prend en charge l'extension SMTPUTF8.

Si vous définissez la DeliveryFormat propriété que vous avez fait ce qui est nécessaire pour votre client pour supporter les caractères UTF8:

using (var smtp = new SmtpClient()) 
{ 
    smtp.DeliveryFormat = SmtpDeliveryFormat.International; 

    var message = new MailMessage(
     "[email protected]", 
     "ëçïƒÖ@example.com", 
     "UTF8", 
     "Is UTF8 supported?"); 

    smtp.Send(message); 
} 

Si nous l'ingénierie inverse la méthode Send nous pouvons facilement suivre la pile trace de votre question .Vous trouverez cette implémentation:

if (!allowUnicode && !MimeBasePart.IsAscii(this.userName, true)) 
{ 
    throw new SmtpException(SR.GetString("SmtpNonAsciiUserNotSupported", new object[] 
    { 
     this.Address 
    })); 
} 

Ce allowUnicode booléen est fournie par la méthode Send:

if (this.DeliveryMethod == SmtpDeliveryMethod.Network) 
{ 
    return this.ServerSupportsEai && this.DeliveryFormat == SmtpDeliveryFormat.International; 
} 

Maintenant vient ici le serveur dans l'image. Quand le booléen privé ServerSupportsEai devient-il vrai? Il se trouve que sur l'envoi de la commande EHLO les SmptConnection appels ParseExtensions:

if (string.Compare(text, 0, "SMTPUTF8", 0, 8, StringComparison.OrdinalIgnoreCase) == 0) 
{ 
    ((SmtpPooledStream)this.pooledStream).serverSupportsEai = true; 
} 

Si vous voulez savoir dès le départ si votre serveur de messagerie soutient cette extension, vous pouvez simplement vous connecter avec un client telnet (j'utiliser du mastic) à votre serveur SMTP et envoyez la commande EHLO somename et inspectez les résultats.

Connexion à smtp.gmail.com sur le port 587 me donne cette sortie:

220 smtp.gmail.com ESMTP hx10sm19521922wjb.25 - gsmtp 
EHLO fubar 
250-smtp.gmail.com at your service, [2001:FFF:8bef:1:34d6:a247:FFFF:4620] 
250-SIZE 35882577 
250-8BITMIME 
250-STARTTLS 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-CHUNKING 
250 SMTPUTF8 

Avis de la dernière ligne: il tient notre nécessaire SMTPUTF8

tl; dr

Pour pouvoir utiliser des caractères internationaux Dans le mailaddres assurez-vous de mettre le DeliveryFormat à SmtpDeliveryFormat.International et d'utiliser un serveur SMTP qui supporte l'extension SMTPUTF8 et l'annonce dans sa commande EHLO.