Ich versuche, mit den Klassen SmtpClient
und MailMessage
E-Mails zu versenden, die Nicht-ASCII-Zeichen enthalten.
Ich verwende einen externen Mailing-Service ( MailChimp ) und einige meiner E-Mails wurden von ihrem SMTP-Server abgelehnt. Ich habe sie kontaktiert und sie haben geantwortet:
Es scheint, dass die Betreffzeile Base64-kodiert und dann Quoted-Printable codiert ist, was im Allgemeinen gut sein sollte, aber eines der Zeichen wird über zwei Zeilen unterbrochen. Wenn die Betreffzeilen etwas länger sind, werden sie in zwei Zeilen aufgeteilt, um korrekt verarbeitet zu werden. Wenn UTF-8 in einer Betreffzeile druckbar verwendet wird, dürfen Zeichenketten nicht zwischen Zeilen unterbrochen werden. Stattdessen sollte eine Zeile kurzgeschlossen werden, damit die vollständige Zeichenkette zusammen bleibt. In diesem Fall passiert das nicht, daher wird die Zeichenkette, die ein einzelnes Zeichen darstellt, über mehrere Zeilen hinweg unterbrochen und ist daher nicht gültig in UTF-8-Anführungszeichen druckbar codiert.
Das problematische Thema ist das folgende:
%Vor%Was ist, in UTF-8 / Base64:
%Vor%Da dieser Header eine bestimmte maximale Länge überschreiten würde (ich bin mir nicht sicher, ob es die Quoted-Printable-Kodierung und die Begrenzung von 76 Zeichen pro Zeile oder das SMTP-Headerlimit ist), wird der Header nach dem Kodieren und Teilen:
%Vor%Offensichtlich verursacht dies ein Problem beim Dekodieren (weil die erste Zeile nicht zu einer gültigen Zeichenkette dekodiert werden kann). Ich bin mir nicht sicher, ob ich das Problem vollständig verstehe und habe folgende Fragen:
Beachten Sie auch, dass einige andere SMTP-Server diese Nachricht akzeptieren, obwohl dies nicht bedeutet, dass sie gültig ist.
Als Umgehungsmöglichkeit habe ich versucht, die Base64-Codierung zu deaktivieren, was offensichtlich unnötig ist, aber die MailMessage-Klasse hat eine BodyTransferEncoding -Eigenschaft, die diese Codierung steuert, jedoch nur für den Nachrichtenteil. Keine Eigenschaft scheint die "Transfer" -Codierung des Subjekts zu kontrollieren.
Dies wurde in den MSDN-Foren als Fehler bestätigt:
Ссылка
Und ein Fehler wurde auf Microsoft Connect gemeldet: Ссылка
Ein Problem besteht darin, die SubjectEncoding-Funktion von MailMessage auf eine andere Codierung wie ISO-8859-1 zu setzen. In diesem Fall wird das Subjekt in Quoted Printable (nicht Base64) codiert, wodurch das Problem vermieden wird.
Meine Lösung für dieses Problem ist eine Art Trick!
Ich benutze persische Sprache im Betreff der Mail und ich sende meine Mail mit SmtpClient im .Net Framework 4.5.2. der empfangene Nachrichtengegenstand zeigt einige Müllwörter an bestimmten Positionen, z. B. das 18. und das 38. Zeichen in der Betreffzeile. was auch immer das Thema ist.
Dann habe ich versucht, einige Leerzeichen (Zeichen 32) an diesen Stellen einzufügen und nach dem erneuten Versenden der Mail war das Ergebnis sehr gut. Das Unicode-Thema zeigte wie erwartet.
Also habe ich eine Funktion geschrieben, um 6 Leerzeichen an meinen gewünschten Stellen einzufügen (so dass Leerzeichen in Wörter nicht eingefügt werden):
%Vor%Dann habe ich Mail Betreff mit dieser Funktion konvertiert:
%Vor%Der interessante Punkt ist, dass Google Mail und Yahoo Mail (und möglicherweise andere webbasierte Mail-Systeme) die zusätzlichen Leerzeichen ignorieren und den Betreff wie erwartet anzeigen.
Eine bessere Lösung ist die Verwendung von Encoding.Unicode
anstelle von Encoding.UTF8
für SubjectEncoding
.
Es scheint, dass die Microsoft-Implementierung einfach die Tatsache ignoriert, dass UTF-16 Zeichen in mehr als zwei Bytes codieren kann (wie auf Warum benutzt C # UTF-16 für Strings? ), hilft die stabile Zeichengröße.
Ich habe gesehen, dass dies auf Ссылка verwendet wurde.