2008-12-04 10 views
6

Ich bin eine E-Mail n00b, aber ich arbeite an einer Anwendung, die HTML-E-Mail mit Unicode-Zeichen sendet (wie mein Freund "Enjoy Encoding Hell" bemerkt).Wie behandelt man UTF-8 E-Mail-Header (wie Subject :) mit Ruby?

Der Header Subject: stammt von Benutzereingaben und kann deshalb Unicode-Zeichen enthalten. Einige E-Mail-Clients (wie GMail und Outlook 2007) sind damit einverstanden, aber aus meiner Sicht scheint es der richtige Weg zu sein, MIME Encoded-Word encoding für die Header zu verwenden.

Ich kann eine Ruby-Bibliothek dazu nicht finden. Ist dort eines?

Gibt es außerdem eine Kopfzeile, die E-Mail-Clients die Verwendung von UTF-8 beim Anzeigen der Nachricht anzeigen soll? Wir senden mehrteilige E-Mails, so dass unsere Content-Typemultipart/mixed ist. Insbesondere Apple Mail.app verwendet nicht die richtige Kodierung, obwohl sie in den einzelnen Teilen als UTF-8 spezifiziert ist.

Antwort

5

Ahah! ActionMailer::Quoting hat eine quoted_printable Methode.

Also hier ist, was ich tat:

def my_email(foo) 
    ... 
    @subject = quoted_printable(foo.some_subject_with_accented_chars, 'utf-8') 
    ... 
end 

Dadurch Mail.app überzeugt, den Rest der E-Mail angezeigt werden unter Verwendung von UTF-8. Jetzt, um den Rest zu testen!

+0

Sollte auch gut sein. – Tomalak

+0

Diese Methode existiert nicht in Schienen 4 :(- irgendeine Alternative? – Hackeron

9

Sie können unter Verwendung derselben Base64-Kodierung optional tun:

require "base64" 

value = Base64.encode64("Your UTF-8 string") 
header = "=?UTF-8?B?" + value + "?=" 

Notiere die "B", die Base64 codierten Nutzdaten markiert, wie mit dem "Q" gegenüber, die "Q-codierten" Payload markiert. Letzteres könnte durch URL-Codierung der Zeichenfolge gefälscht werden und alle "%" Zeichen durch "=" ersetzen.

Mit "Fälschen" meine ich das: Es würde ein gültiges Ergebnis erzeugen, aber vielleicht werden mehr Zeichen kodiert als nötig. Die Spezifikation ermöglicht die Kodierung jedes Zeichens mit "=" + ByteCodeAsHex, es beeinträchtigt lediglich die menschliche Lesbarkeit der Raw-Header. UrlEncode ist + .gsub(/%/, "=") kein schlechter Kompromiss, wenn nichts anderes verfügbar ist.

+0

Danke!Ich begann mit der Verwendung von Base64, aber ich machte mir Sorgen, dass Spam-Filter dies anzeigten, also wechselte ich zu zitierter Druckversion. Ich habe eine Methode in ActionMailer :: Quoting gefunden. Sieht so aus, als ob es auch funktioniert! –

+0

Ich glaube nicht, Spam-Filter würden dies kennzeichnen, dies ist ein gültiger Header-Wert. – Tomalak

+0

Ja, ich habe keinen Beweis dafür. Ich dachte, Spammer könnten versuchen, naive Content-Filter zu umgehen. –

3

Da keine der Antworten über die gesamte Nachricht mit reinem Ruby sagt, hier ist es.

Hier öffnen Sie die Verbindung zu localhost. Die Verwendung eines externen SMTP-Servers ist ebenfalls möglich, siehe Dokumentation von net/smtp.

Erste Zeile setzt den in der Nachricht verwendeten Zeichensatz. Die restlichen Zeilen sind getrennt definierte Variablen:

von ist eine Adresse in Form von From: Name here <[email protected]>. Wenn kein Name gewünscht wird, kann nur die Adresse angegeben werden, z. B. From: [email protected].

verwendet dieselbe Syntax, mit Ausnahme From: geändert zu To:.

Thema ist in Form von Thema: Thema hier. Für UTF-8 muss es Base64-codiert sein, damit es für Clients korrekt angezeigt wird.

subject = "Subject: =?UTF-8?B?" + Base64.strict_encode64(subject) + "?=" 

Nachricht ist eine Klartextnachricht, die in UTF-8 codiert ist, ohne Präfix. net/smtp kümmert sich um die richtige Mail.