2016-02-02 37 views
8

Za pomocą klas SmtpClient, MailMessage i MailAddress, nie mogę wysyłać na adresy e-mail, takie jak å[email protected] Pojawi się błąd/wyjątki, jak pokazano poniżej:Nie można wysyłać wiadomości e-mail na adresy ze skandynawskimi znakami

W nagłówku wiadomości znaleziono nieprawidłowy znak: "å".

--------------------------- Błąd podczas wysyłania wiadomości e-mail --------------- ------------ System.Net.Mail.SmtpException: Klient lub serwer jest skonfigurowany tylko dla adresów e-mail z ASCII lokalnych części: å[email protected]

w System.Net.Mail.MailAddress.GetUser (logiczna allowUnicode)

w System.Net.Mail.MailAddress.GetAddress (logiczna allowUnicode)

w System.Net.Mail.MailAddress.Encode (Int32 charsConsumed, logiczna allowUnicode)

w System.Net.Mail.MailAddressCollection.Encode (Int32 charsConsumed, logiczna allowUnicode) w System.Net.Mail.Message.PrepareHeaders (logiczna sendEnvelope, logiczna allowUnicode) na System.Net.Mail.Message.Send (BaseWriter pisarza, Boolean sendEnvelope, Boolean allowUnicode) na System.Net.Mail.SmtpClient.Send (komunikat MailMessage)

te znaki w moim ciele przedmiotu/są w porządku, ale nie w adresach e-mail.

Próbowałem ustawić SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International lub MailMessage.HeadersEncoding = Encoding.Unicode (lub UTF8) i wydaje się, że nic nie zmienia. To są prawdziwe adresy e-mail osób, z którymi musimy się komunikować, więc to trochę problem.

Przeszukałem kod źródłowy .Net, ale nigdzie go nie dostałem. Wyszukałem właściwość ServerSupportsEai, a Google mówi mi, że EAI oznacza internacjonalizację adresów e-mail (https://tools.ietf.org/html/rfc5336), ale jest dość niejasne, czy jest to ograniczenie w moim kodzie, czy też serwer, z którym rozmawiam, po prostu nie obsługuje tego. .. ponieważ używam serwera testowego, aby uniknąć wysyłania e-maili do niczego nie podejrzewających Szwedów!

Czy ktoś może mi pomóc to wyjaśnić - czy .Net obsługuje to, jeśli tak, to cokolwiek powinien zrobić mój kod klienta, aby go włączyć?

+0

Myślę, że problem może nie być w kodzie .NET, ale w konfiguracji serwera poczty e-mail. Czy możesz spróbować użyć innego serwera? – Pikoh

+0

(5336 jest zastąpiony przez 6531/2) Ta funkcja wymaga serwera SMTP do obsługi SMTPUTF8, spróbuj z Gmailem, który działa, jeśli działa na twoim serwerze, to jest problem. –

+0

Dzięki. Po walce z Gmailem "aplikacja nie używa aktualnych zabezpieczeń i została zablokowana" testuję to - choć nadal nie mogę wysłać do prawdziwej osoby bardzo grzecznie –

Odpowiedz

9

Aby móc wysyłać znaki UTF-8 zgodnie z RFC6531 zarówno klient, jak i serwer, muszą go obsługiwać.

Jeśli korzystasz z implementacji .NET w wersji SmtpClient, musisz ustawić docelową wersję środowiska 4.5, ponieważ ta implementacja obsługuje rozszerzenie SMTPUTF8.

Jeśli ustawisz właściwość DeliveryFormat masz zrobić to, co jest potrzebne dla swojego klienta do obsługi znaków 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); 
} 

Gdybyśmy inżynierii wstecznej metodę Send możemy łatwo śledzić stosu ślad od Twojego pytania .Znajdziesz ten realizacji:

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

To allowUnicode logiczna jest dostarczany z metody Send:

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

Teraz tutaj jest serwer na zdjęciu. Kiedy prywatny boolean ServerSupportsEai staje się prawdziwy? Okazuje się, że na wysyłając komendę EHLO z SmptConnection połączeń ParseExtensions:

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

Jeśli chcesz wiedzieć z góry, jeśli serwer poczty elektronicznej jest wspieranie tego rozszerzenia można po prostu połączyć się z klientem telnet (używam kit) do swoich smtp server i wyślij komendę EHLO somename i sprawdź wyniki.

Łączenie smtp.gmail.com na porcie 587 daje mi ten komunikat:

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 

Zawiadomienie ostatnia linia: posiada ona naszą wymaganą SMTPUTF8

tl; dr

Aby móc używać znaków międzynarodowych w adresach e-mail upewnij się, że ustawisz DeliveryFormat na SmtpDeliveryFormat.International i korzystasz z serwera SMTP, który obsługuje rozszerzenie SMTPUTF8 i reklamuje je w swoim poleceniu EHLO.