2015-05-04 11 views
7

Podczas odbierania wiadomości e-mail wysłanych z numerem System.Net.Mail.MailMessage wydaje się, że niektórzy odbiorcy mają problemy z kodowaniem wiadomości e-mail. Na przykład charachter ä jest wyświetlany jako ä. Ustawiłem właściwości kodowania:Nieprawidłowe kodowanie w wiadomościach e-mail wysłanych za pomocą System.Net.Mail.MailMessage

System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); 
... 
msg.BodyEncoding = System.Text.Encoding.UTF8; 
msg.SubjectEncoding = System.Text.Encoding.UTF8; 

Co jeszcze mogę zrobić?

Aktualizacja:

Gdybym użyć właściwości Body e-mail jest wyświetlany poprawnie, ale kiedy użyć właściwości AlternateViews e-mail jest wyświetlany nieprawidłowo.

Kompletny kod:

SmtpClient smtpClient = new SmtpClient("some.host.com"); 
MailMessage msg = new MailMessage(); 
msg.To.Add("[email protected]"); 
msg.From = new MailAddress("[email protected]", "Name Name"); 
msg.Subject = "Test"; 

//Displays as ä 
//msg.Body = "ä"; 

// Displays as ä 
AlternateView htmlView = AlternateView.CreateAlternateViewFromString("ä", new ContentType(MediaTypeNames.Text.Html)); 
msg.AlternateViews.Add(htmlView); 

smtpClient.Send(msg); 

Wysyłając do Gmaila adres e-mail jest wyświetlany poprawnie, ale przy wysyłaniu do serwera Exchange e-mail jest wyświetlany nieprawidłowo. Testowałem w .NET 3.5 i 4.5.

+0

Która wersja .NET używasz? –

+0

Czy możesz dodać swój pełny kod pocztowy, aby spróbować odtworzyć to? –

+0

Pytanie zaktualizowane. –

Odpowiedz

8

spróbuj dodać typ zawartości do Alternatywnego Widok:

AlternateView htmlView = AlternateView.CreateAlternateViewFromString("ä", new ContentType(MediaTypeNames.Text.Html)); 
htmlView.ContentType.CharSet = Encoding.UTF8.WebName; 
+0

Teraz działa. Dzięki! –

+0

Nie wiem, czy to odnosi się do PO, ale wystarczy przyjrzeć się zawartości nieprzeczytanej wiadomości, aby zrozumieć, dlaczego ta odpowiedź ma sens. Mój tekst wiadomości został w końcu zakodowany jako AlternateView, więc ustawienie BodyEncoding wykonuje swoją pracę, ale jest to ciało beztekstowe: nie masz tekstu w ciele, ale w alternatywnym widoku. –

+0

mail.Headers.Dodaj ("Content-Type", "content = text/html; charset = \" UTF-8 \ ""); To powinno działać również bez alternatywnego widoku (ustawienie ecoding z metatagiem w nagłówku treści html nie działa, coz klasa MailMessage usuwa metatagi z treści). – SalientBrain

1

Nie sądzę, że BodyEncoding i SubjectEncoding wpływają na odczyt wiadomości w jakikolwiek sposób - ma to zastosowanie w przypadku wysyłania wiadomości i ustawia kodowanie tekstu dla wiadomości i nagłówków podczas wysyłania wiadomości.

SmtpClient odczyta kodowanie typu zawartości i zestawu znaków z wiadomości wysłanych i zdekodowanych treść wiadomości i tematu zgodnie z kodowaniem znalezionym w nagłówkach.

Jeśli twoja wiadomość nie jest dekodowana, wygląda na to, że wiadomości prawdopodobnie nie są poprawnie zakodowane (lub potencjalnie podwójnie zakodowane zakodowane w UTF-8 ciągi zakodowane ponownie przez enkoder wiadomości), nagłówki żądań w wiadomości nie właściwie pasuje do rzeczywistego kodowania wiadomości lub formatu zestawu znaków, który nie jest obsługiwany w .NET.

Jedynym sposobem uzyskania informacji jest sprawdzenie rzeczywistego nieprzetworzonego śledzenia żądań wiadomości, która nie może zobaczyć, co faktycznie jest wysyłane.

Możesz chcieć skonfigurować śledzenie System.NET dla wiadomości e-mail (zobacz http://codepaste.net/j52ktp) lub monitorować strumień TCP/IP za pomocą czegoś podobnego do Wireshark, aby zobaczyć, co faktycznie przechodzi przez przewód i co nagłówki instruują klienta do zrobić z danymi.

FWIW, nie ma powodu, dla którego wiadomość jest poprawnie zakodowana w systemie UTF-8, aby SmtpClient nie odczytał poprawnie tych wiadomości.

Powiązane problemy