Subjektcodierung für SmtpClient / MailMessage

8

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:

  • Warum ist das utf-8? B? Teil wiederholt? Sollte die QP-Kodierung nicht vor dem Aufteilen der Zeile passieren und daher sollte der Header nicht wiederholt werden?
  • Sollten wir nach der QP-Decodierung nicht mit einer gültigen 1-Zeilen-Base64-Zeichenfolge enden?
  • Es gibt ein Leerzeichen am Anfang der zweiten Zeile außerhalb der QP-Kodierung. Könnte das das Problem sein?
  • Ist der Encoder defekt oder der Decoder?

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.

    
Xavier Poinas 16.04.2013, 04:22
quelle

3 Antworten

5

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.

    
Xavier Poinas 24.07.2013, 08:37
quelle
0

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.

    
Saeed Mousavi 26.02.2016 01:01
quelle
0

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.

    
Pablo Montilla 15.10.2016 02:26
quelle

Tags und Links