Frage

Aparently, japanische E-Mails codiert, ist etwas schwierig, die ich langsam bin selbst zu entdecken. Falls es irgendwelche Experten (auch solche mit wenig Erfahrung tun wird), kann ich bitte einige Richtlinien, wie es zu tun, wie es zu testen und wie es zu überprüfen?

Beachten Sie, dass ich noch nie einen Fuß irgendwo in der Nähe Japan festgelegt haben, ist es einfach, dass das Produkt, das ich entwickeln werde verwendet wird, unter anderem.

Was (glaube ich) Ich weiß, so weit folgt:
- Japanische E-Mails sollten in ISO-2022-JP, Japanisch JIS-Codepage 50220 oder möglicherweise SHIFT_JIS Codepage 932
codiert werden - E-Mail Transfer-Codierung sollte für Klartext und 7Bit zu Base64 gesetzt für Html
- Email-Betreff sollte separat codiert werden, mit zu beginnen "= ISO-2022-JP B??" (Weiß nicht, was das bedeuten soll). Ich habe versucht, mit dem Thema kodiert

"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))

, die im Grunde die codierte Zeichenfolge gibt wie erwartet, aber es ist nicht wie jeder japanischer Text in einem E-Mail-Programm
präsentiert bekommen - ich in Outlook 2003 getestet haben, Outlook Express und GMail

Jede Hilfe wäre sehr dankbar


Ok, also ein kurzes Update zu veröffentlichen, dank der beiden hilfreichen Antworten, ich habe es geschafft, das richtige Format und die Codierung zu erhalten. Nun gibt Outlook etwas, das das richtige Thema ähnelt:
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=

Allerdings gibt die genau die gleiche E-Mail in Outlook Express Thema wie folgt aus:
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=

Wenn weiterhin in der Ansicht Posteingang in Outlook Express betrachtet, ist die E-Mail-Thema noch seltsam, wie folgt aus:
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=

Google Mail scheint Outlook auf ähnliche Art und Weise zu arbeiten, die korrekt aussieht.

Ich kann nicht meinen Kopf um diese.

War es hilfreich?

Lösung

Ich habe seit fast 20 Jahren mit japanischen Kodierungen beschäftigt und so kann ich mit Schwierigkeiten sympathisieren. Websites, die ich täglich Hunderte von so kann ich mit Ihnen senden an E-Mails gearbeitet haben zu japanischen Kunden zu teilen, was für uns gearbeitet hat.

  • Zu allererst nicht Shift-JIS verwenden. Ich erhalte persönlich Tonnen japanischer E-Mails und so gut wie nie sind sie codiert Shift-JIS verwendet. Ich denke, ein altes (circa Win 98?) Version von Outlook Express verschlüsselte ausgehende Mail-Shift-JIS verwendet, aber heutzutage einfach sieht es nicht.

  • Wie Sie herausgefunden haben, müssen Sie für mindestens etwas ISO-2022-JP als Codierung verwenden, die im Mail-Header geht. Dazu gehört auch den Betreff, Zeile An und CC Linie. UTF-8 wird auch in den meisten Fällen funktionieren, und es wird nicht auf Yahoo Japan Mail arbeiten, und wie Sie sich vorstellen können, viele japanische Benutzer verwenden Yahoo Japan Mail.

  • Sie können UTF-8 in dem Körper der E-Mail verwenden, aber es wird empfohlen, base64 den UTF-8 kodierten japanischen Text und setzen mich in dem Körper anstelle von rohem UTF-8-Text kodieren. Doch in der Praxis, wie ich glaube, dass roher UTF-8-Text fein in diese Tage arbeiten, für den Körper der E-Mail.

  • Wie ich oben erwähnt, müssen Sie mindestens Test auf Outlook (Exchange), Outlook Express (IMAP / POP3) und Yahoo Japan Web-Mail. Yahoo Japan ist die heikelste, weil ich sie glauben, EUC verwenden für die Codierung ihrer Web-Seiten, und so müssen Sie die richtigen Standards für Ihre E-Mails folgen oder sie wird nicht funktionieren (ISO-2022-JP ist der Standard für das Senden von E-Mails Japanisch ).

  • Auch die Betreffzeile nicht mehr als 75 Zeichen pro Zeile nicht überschreiten sollte. Das heißt, 75 Zeichen nach Sie haben codiert in ISO-2022-JP und base64, nicht mehr als 75 Zeichen vor der Konvertierung. Wenn Sie 75 Zeichen nicht überschreiten, müssen Sie Ihr codiertes Thema in mehrere Zeilen brechen, beginnend mit „=? Iso-2022-jp? B?“ und endend mit „? =“ in jeder Zeile. Wenn Sie dies nicht tun, könnte Ihr Thema abgeschnitten werden (abhängig von der E-Mail-Leser, und auch den Inhalt des Motivs Text). Laut RFC 2047:

"Ein‚codiert-Wort‘darf nicht mehr als 75 Zeichen lang sein, darunter‚charset‘,‚Codierung‘,‚codiert-Text‘und Trennzeichen. Wenn es wünschenswert ist, mehr Text zu kodieren, als in einem passten ‚codiert-Wort‘ von 75 Zeichen, mehrere ‚codiert-Wort (getrennt durch CRLF SPACE) verwendet werden kann."

  • Hier einige Beispiel-PHP-Code, das Thema zu kodieren:

 // Convert Japanese subject to ISO-2022-JP (JIS is essentially ISO-2022-JP)

 $subject = mb_convert_encoding ($subject, "JIS", "SJIS");

 // Now, base64 encode the subject

 $subject = base64_encode ($subject);

 // Add the encoding markers to the subject

 $subject = "=?iso-2022-jp?B?" . $subject . "?=";

 // Now, $subject can be placed as-is into the raw mail header.
  • Siehe RFC 2047 für eine vollständige Beschreibung, wie Sie Ihren E-Mail-Header kodieren.

Andere Tipps

Überprüfen Sie http://en.wikipedia.org/wiki/MIME#Encoded-Word für eine Beschreibung, wie Header-Felder in MIME-konformen Nachrichten zu codieren. Sie scheinen ein „? =“ Am Ende des Motivs zu fehlen.

=? ISO-2022-JP? B? ... Texttext

ISO_2022-JP bedeutet, dass String in ISO-2022-JP Codepage codiert ist (z. B. nicht Unicode) B bedeutet, dass Zeichenfolge bese64 kodiert

In Ihrem Beispiel sollten Sie nur die Zeichenfolge in ISO-2022-JP statt Unicode liefern.

Ich habe einige Erfahrung Erstellen und Senden von E-Mail in der japanischen ... Normalerweise muss man aufpassen, welche Codierung für das Betriebssystem verwendet und wie Sie speichern Ihre japanischen Saiten! Meine E-Mail-Objekte normalerweise codiert sind wie folgt:

    string s = "V‚µ‚¢ŠwK–@‚Ì‚²’ñˆÄ"; // Our japanese are shift-jis encoded, so it appears like garbled
    MailMessage message = new MailMessage();
    message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.Subject = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is
    message.Body = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is

Dann habe ich eine Erweiterungsmethode, auf die sich durch die Umwandlung für mich:

public static string ToEncoding(this string s, Encoding targetEncoding)
        {   
            return s == null ? null : targetEncoding.GetString(Encoding.GetEncoding(1252).GetBytes(s)); //1252 is the windows OS codepage            
        }

So etwas sollte die Arbeit erledigt in Python bekommen:


#!/usr/bin/python                                                                                                            
# -*- mode: python; coding: utf-8 -*-                                                                                        
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def send_from_gmail( from_addr, to_addr, subject, body, password, encoding="iso-2022-jp" ):

    msg = MIMEText(body.encode(encoding), 'plain', encoding)
    msg['Subject'] = Header(subject.encode(encoding), encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo(); s.starttls(); s.ehlo()

    s.login(from_addr, password)
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
    return "Sent mail to: %s" % to_addr



if __name__ == "__main__":
    import sys
    for n,item in enumerate(sys.argv):
        sys.argv[n] = sys.argv[n].decode("utf8")

    if len(sys.argv)==6:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5] )
    elif len(sys.argv)==7:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], encoding=sys.argv[6] )
    else:
        raise "SYNTAX: %s <from_addr> <to_addr> <subject> <body> <password> [encoding]"

** eklatant gestohlen / angepasst aus:

http://mtokyo.blog9.fc2.com/blog-entry -127.html

Als erstes sollten Sie verwenden:

Encoding.GetEncoding("ISO-2022-JP")

Ihre Betreffzeilen in Bytes zu konvertieren, die von Convert.ToBase64String verarbeitet werden ().

=? ISO-2022-JP? B? Texttext ...? = Weist den empfangende Mail-Client, die Codierung auf der Seite des Senders verwendet wurde, japanisch "Buchstaben" in einen Byte-Stream zu konvertieren.

Zur Zeit sind Sie mit UTF-16 zu kodieren, aber der Angabe ISO-2022-JP zu dekodieren. Das sind natürlich zwei verschiedene Kodierungen, ich denke, genau wie ISO-8859-1 unterscheidet sich von Unicode (Ausgedehnteste Westeuropa Zeichen repräsentiert durch ein Byte in ISO-XXX, aber zwei Bytes in Unicode).

Ich bin nicht sicher, was du meinst über UTF-8 ist Bürger zweiter Klasse. Solange der Empfang Mail-Client versteht UTF-8 und ist in der Lage, es zu dem aktuellen japanischen Gebietsschema zu konvertieren, ist alles in Ordnung.

<?php

function sendMail($to, $subject, $body, $from_email,$from_name)
 {
$headers  = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";
$headers .= "Reply-To: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";


$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";


/* Convert body to same encoding as stated
in Content-Type header above */

$body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");

/* Mail, optional parameters. */
$sendmail_params  = "-f$from_email";

mb_language("ja");
$subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
$subject = mb_encode_mimeheader($subject);

$result = mail($to, $subject, $body, $headers, $sendmail_params);

return $result;
}

Einführung der japanischen Codierung an E-Mail in den frühen 90er Jahren bei JUNET (UUCP Basis landesweites Netz) passiert ist.

Zu diesem Zeitpunkt wurde RFC1468 definiert.  Wenn Sie RFC1468 im Klartext Mail folgen, gäbe es kein Problem sein.

Wenn Sie HTML-Mail behandeln wollen, RFC1468 ist nutzlos, außer für Kopfteile.

Hier ist, was ich japanische E-Mails senden verwenden. Betreffzeile sieht gut aus in Outlook 2010, gmail und auf dem iPhone.

Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
byte[] bytes  = encoding.GetBytes(subject);
string uuEncoded = Convert.ToBase64String(bytes);
subject = "=?iso-2022-jp?B?" + uuEncoded + "?=";

// not sure this is actually necessary...
mailMessage.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top