2016-02-02 43 views
8

Utilizzando le classi SmtpClient, MailMessage e MailAddress, non è possibile inviare a indirizzi di posta elettronica come å[email protected] Ottengo l'errore/le eccezioni come mostrato di seguito:Impossibile inviare e-mail agli indirizzi con caratteri scandinavi

Nell'intestazione della posta è stato trovato un carattere non valido: "å".

--------------------------- Errore nell'invio di e-mail --------------- ------------ System.Net.Mail.SmtpException: il client o il server è configurato solo per gli indirizzi e-mail con ASCII parti locali: å[email protected]

a System.Net.Mail.MailAddress.GetUser (booleano allowUnicode)

a System.Net.Mail.MailAddress.GetAddress (booleano allowUnicode)

a System.Net.Mail.MailAddress.Encode (Int32 charsConsumed, booleano allowUnicode)

a System.Net.Mail.MailAddressCollection.Encode (Int32 charsConsumed, booleano allowUnicode) a System.Net.Mail.Message.PrepareHeaders (booleano sendEnvelope, booleano allowUnicode) a System.Net.Mail.Message.Send (BaseWriter scrittore, booleano sendEnvelope, booleano allowUnicode) a System.Net.Mail.SmtpClient.Send (messaggio MailMessage)

Questi personaggi del mio soggetto/corpo vanno bene, ma non negli indirizzi email.

Ho provato a impostare SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International o MailMessage.HeadersEncoding = Encoding.Unicode (o UTF8) e non sembra modificare nulla. Questi sono veri e propri indirizzi e-mail delle persone con cui dobbiamo comunicare, quindi è un po 'un problema.

Sto scavando attraverso il codice sorgente .Net ma non ho ottenuto alcun risultato. Ho rintracciato una proprietà ServerSupportsEai e Google mi dice EAI sta per Email Address Internationization (https://tools.ietf.org/html/rfc5336) ma non è chiaro se si tratta di una limitazione nel mio codice o se il server specifico con cui sto parlando non lo supporta. .. dal momento che sto usando un server di test per evitare l'invio di e-mail a ignari svedesi!

Qualcuno può aiutarmi a chiarire questo problema. Supporta questo. In caso affermativo, in caso affermativo, cosa dovrebbe fare il codice client per abilitarlo?

+0

Penso che il problema potrebbe non essere nel codice .NET, ma nella configurazione del server di posta elettronica. Puoi provare a usare un altro server? – Pikoh

+0

(5336 viene sostituito con 6531/2) Questa funzione richiede che il server smtp supporti SMTPUTF8, provare con Gmail che, se funziona sul proprio server, rappresenta il problema. –

+0

Grazie. Dopo aver combattuto con Gmail "l'app non utilizza la sicurezza aggiornata ed è stata bloccata" Sto verificando questo - anche se non riesco ancora a inviare una vera persona in modo molto educato –

risposta

9

Per poter inviare caratteri UTF-8 in base a RFC6531, sia il client che il server devono supportarlo.

Se si utilizza l'implementazione .NET di SmtpClient, è necessario utilizzare la versione 4.5 del framework di destinazione poiché tale implementazione supporta l'estensione SMTPUTF8.

Se si imposta la proprietà DeliveryFormat che avete fatto ciò che è necessario per il vostro cliente per supportare i caratteri 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); 
} 

Se invertiamo-ingegnerizzare il metodo Send possiamo facilmente seguire lo stack-trace dalla tua domanda .Troverete questa implementazione:

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

Che allowUnicode booleano viene fornita dal metodo Send:

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

Ora arriva il server nella foto. Quando la booleana privata ServerSupportsEai diventa vera? Si scopre che in invio del comando EHLO le SmptConnection chiamate ParseExtensions:

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

Se volete sapere in anticipo se il vostro server di posta è sostenere che l'estensione si può semplicemente connettersi con un client telnet (che uso stucco) al vostro smtp server e inviare il comando EHLO somename e ispezionare i risultati.

Collegamento a smtp.gmail.com sulla porta 587 mi da questa uscita:

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 

Avviso l'ultima riga: che detiene il nostro SMTPUTF8 richiesto

tl; dr

Per essere in grado di utilizzare i caratteri internazionali nell'e-mailaddres, assicurarsi di impostare DeliveryFormat su e utilizzare un server smtp che supporti l'estensione SMTPUTF8 e pubblicizzarlo nel suo comando EHLO.