2009-01-18 5 views
22

Ich versuche, den folgenden Code zu verwenden, um Nachrichten über System.Net.Mail zu senden und bin manchmal bekommen Themen wie '=? Utf- 8? B? W3AxM25dIEZpbGV ... '(getrimmt). Dies ist der Code, genannt:System.Net.Mail und =? Utf-8? B? XXXXX .... Header

MailMessage message = new MailMessage() 
{ 
    From = new MailAddress("[email protected]", "Service"), 
    BodyEncoding = Encoding.UTF8, 
    Body = body, 
    IsBodyHtml = true, 
    ReplyTo = new MailAddress("[email protected]"), 
    SubjectEncoding = Encoding.UTF8 
}; 

foreach (string emailAddress in addresses) 
{ 
    message.To.Add(new MailAddress(emailAddress.Trim(), "Person")); 
} 

message.Subject = subject; 

Ich mag möchte betonen, dass dies nicht die ganze Zeit passiert.

Was mache ich falsch?

Antwort

33

Wenn Ihr Betreff Zeichen außerhalb des ASCII-Bereichs enthält, muss die Mailing-Software diese kodieren (RFC2822-Mail erlaubt keine Nicht-ASCII-Zeichen in Kopfzeilen). Es gibt zwei Möglichkeiten, dies zu tun:

  • Quoted Printable (Betreff beginnt mit "= utf-8 Q?")
  • Base64 (Thema beginnt mit "= utf-8 B?")

Es scheint, dass das Framework hat festgestellt, dass die Base64-Codierung ist effizienter (= kürzer) als die quoted-druckbare Codierung. Dies ist sinnvoll, wenn Ihr Betreff relativ viele Zeichen außerhalb des ASCII-Bereichs enthält.

Um Ihre Frage zu beantworten: Sie machen nichts falsch. So soll Internet-Mail mit Nicht-ASCII-Zeichen aussehen. Natürlich sollte die Software, die solche Post liest, solche Subjektfelder erkennen und decodieren.

+3

So sieht eine rohe Nachricht aus, aber wenn Sie sie in einem E-Mail-Client erhalten, ist sie falsch. Ich habe kürzlich herausgefunden, dass es einen Fehler in .NET gibt, der Themen, die mit UTF-8 codiert sind, falsch formatiert. Ich habe diesen Fehler bereits bei Microsoft eingereicht. Während der Recherche habe ich festgestellt, dass einige E-Mail-Clients eine rohe Base64-Zeichenfolge anzeigen, wenn sie fehlerhaft ist. Leider gibt es keine Problemumgehung. Dotnet erlaubt es nicht, das Thema manuell zu codieren, wenn Sie es tun, wird es es neu codieren und neue Fehler einführen. – Harry

+1

@Harry: Ich denke, wir haben gerade über das gleiche Problem gestolpert - haben Sie einen Link zu einem Connect-Bug und/oder einen Workaround? –

+0

Die einzige Problemumgehung, die ich dafür gefunden habe, ist nicht UTF-8-Kodierung zu verwenden und sprachspezifische zu wählen, wie ISO oder CP. Was ich herausgefunden habe, war eindeutig ein Fehler in .NET selbst aufgrund der ungültigen Subjektcodierung. Ich habe dies jedoch nicht mit neuen .NET-Versionen überprüft. AFAIR es war in .NET 4.5.0 vorhanden, nicht sicher, ob ich es mit 4.5.1 und 4.5.2 getestet habe. – Harry

2

Die Antwort könnte im Rest des getrimmten Subjekts sein - der von Ihnen zur Verfügung gestellte Abschnitt entschlüsselt als "[p13n] File", aber haben Sie irgendwelche Nicht-ASCII-Zeichen dort, dann würde ich erwarten, dass es kodiert

1

Obwohl ich mir nicht sicher bin, vielleicht kann diese article über MIME auf Wikipedia helfen, einige Hintergrundinformationen zu erhalten.

14

Ich kam in diesem Beitrag, wenn ich ein identisches Problem wurde Debuggen, und basierte auf meinen weiteren Untersuchungen ich Andreas eine alternative Erklärung liefern:

Das Problem, dass Ihre E-Mail-Client-Software sein kann (Outlook 2003 , in meinem Fall) ist die Betreffzeile falsch dekodieren. Mit anderen Worten, es ist ein Fehler in Outlook, nicht in .NET oder Ihrem Programm.

Wenn Sie einen Betreff Wert wie folgt (der Buchstabe „c“ 256-mal wiederholt) verwenden, zeigt es in Outlook fein:

subject = New String("c"c, 256) 

Ebenso, wenn Sie ein Thema wie diesen (den Buchstaben „c "178-mal wiederholt, mit einer Unicode non-breaking Raumzeichen angehängt), es zeigt auch, wie in Outlook erwartet:

subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

jedoch die folgenden Themen Displays als "= UTF-8-B" garbage -prepended? in Outlook:

subject = New String("c"c, 179) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

Der Unterschied ist, dass diese dritte Betreffzeile 256 Bytes bei UTF-8-Codierung ist. Ich gehe davon aus, dass Outlook die Betreffzeile auf 255 Zeichen abschneiden muss, bevor sie angezeigt wird ... was gut wäre, außer dass es die codierte Zeichenfolge auf 255 Byte abschneidet, wodurch der Codierungsabschluss ("? =") Abgeschnitten wird. und macht es nicht entzifferbar.

Dies ist ein Fehler in Outlook und nicht Ihr Mail-Provider oder .NET; Sie können die vollständige, nicht abgeschnittene UTF-8-codierte Betreffzeile in Outlook sehen, indem Sie mit der rechten Maustaste auf die Nachricht in Ihrer Nachrichtenliste klicken und "Optionen ..." im Kontextmenü auswählen und dann im Feld "Internet-Header" nach unten scrollen Sie sehen die Zeile, die mit "Betreff:" beginnt.

Im Gegensatz zu der Situation, die Andreas vorschlägt, manifestiert sich das Problem nicht nur bei vielen Nicht-ASCII-Zeichen, sondern auch bei einem oder mehreren Nicht-ASCII-Zeichen, und die Betreffzeile ist lang. Eine Problemumgehung könnte sein, eine kürzere Betreffzeile zu verwenden oder alle Nicht-ASCII-Zeichen in Ihrem Betreff auszublenden.

(Dieser Fehler war besonders schwierig für mich zu finden, weil, wie oben, die Problemdaten keine offensichtlichen Nicht-ASCII-Zeichen enthalten - nur ein paar nicht-brechende Leerzeichen. Diese zeigen die gleichen wie normale ASCII-Leerzeichen drucken Sie sie an die Konsole aus Außerdem, wenn Sie den Wert des String-Variable in den Visual Studio-Debugger zu ändern, es ersetzt sie leise mit regelmäßigen Leerzeichen)

+2

Brilliant Detektivarbeit jcl - wir hatten genau das gleiche Problem und Ihr Beitrag hat mich viele Stunden gerettet. Wenn jemand anderes dieses Problem hat, gibt es einen Fix, der auf Exchange Server 2007 angewendet werden kann, [hier] (http://blogs.technet.com/stuartp/archive/2009/02/17/subjects-appearing-garbled- oder-beschädigt-wenn-sie-sind-codiert.aspx) –

Verwandte Themen