Question

Apparemment, encoder des emails japonais est un peu difficile, ce que je découvre lentement moi-même. Au cas où il y aurait des experts (même ceux avec une expérience limitée le feront), puis-je s'il vous plaît avoir quelques directives sur la façon de le faire, comment le tester et le vérifier?

N'oubliez pas que je n'ai jamais mis les pieds près du Japon, c'est simplement que le produit que je développe est utilisé entre autres.

Ce que (je pense) que je sais jusqu'ici est le suivant:
- Les courriers électroniques japonais doivent être codés au format ISO-2022-JP, la page de code JIS japonaise 50220 ou éventuellement la page de code SHIFT_JIS 932
- Le codage du transfert de courrier électronique doit être défini sur Base64 pour le texte brut et 7 bits pour le HTML
- Le sujet de l'e-mail doit être codé séparément pour commencer par "ISO? 2022-JP? B?" (Je ne sais pas ce que cela veut dire). J'ai essayé d'encoder le sujet avec

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

qui donne la chaîne encodée comme prévu mais qui ne se présente pas comme un texte japonais dans un programme de messagerie

- J'ai testé Outlook 2003, Outlook Express et GMail

Toute aide serait grandement appréciée

Ok, alors pour poster une brève mise à jour, grâce aux deux réponses utiles, j'ai réussi à obtenir le bon format et le bon encodage. Maintenant, Outlook donne quelque chose qui ressemble au bon sujet:
=? iso-2022-jp? B? 6 test japonais - Résultat de la recherche pour: 6 =

Cependant, le même email exactement dans Outlook Express donne un sujet comme celui-ci:
=? iso-2022-jp? B? 6 Test en japonais avec 6 secondes code>

De plus, lorsqu'il est affiché dans la vue Boîte de réception d'Outlook Express, le sujet de l'e-mail est encore plus étrange, comme ceci:
=? iso-2022-jp? B? 6 test de japonais ??????????????? 6 ??????? =

Gmail semble fonctionner de la même manière qu'Outlook, ce qui semble correct.

Je n'arrive pas à comprendre ce qui se passe.

Était-ce utile?

La solution

Je travaille avec les encodages japonais depuis près de 20 ans et je peux donc comprendre vos difficultés. Les sites Web sur lesquels j'ai travaillé envoient quotidiennement des centaines de courriels à des clients japonais afin que je puisse partager avec vous ce qui a fonctionné pour nous.

  • Tout d'abord, n'utilisez pas Shift-JIS. Personnellement, je reçois des tonnes d'e-mails japonais et ils ne sont presque jamais encodés à l'aide de Shift-JIS. Je pense qu’une ancienne version (environ Win 98?) De courrier sortant codé Outlook Express utilisant Shift-JIS, mais de nos jours, vous ne le voyez plus.

  • Comme vous l'avez compris, vous devez utiliser ISO-2022-JP comme encodage pour au moins tout ce qui se trouve dans l'en-tête du courrier. Ceci inclut les lignes Subject, To et CC. UTF-8 fonctionnera également dans la plupart des cas, mais il ne fonctionnera pas sur la messagerie Yahoo Japan et, comme vous pouvez l'imaginer, de nombreux utilisateurs japonais utilisent la messagerie Yahoo Japan.

  • Vous pouvez utiliser UTF-8 dans le corps du courrier électronique, mais il est recommandé de coder en base64 le texte japonais codé en UTF-8 et de le placer dans le corps au lieu du texte brut UTF-8. Cependant, dans la pratique, je pense que le texte brut UTF-8 fonctionnera correctement ces jours-ci, pour le corps du courrier électronique.

  • Comme je l’ai déjà mentionné, vous devez au moins tester les messages Web Outlook (Exchange), Outlook Express (IMAP / POP3) et Yahoo Japan. Yahoo Japan est le plus délicat, car je pense qu'ils utilisent EUC pour encoder leurs pages Web. Vous devez donc respecter les normes appropriées pour vos emails, sinon ils ne fonctionneront pas (ISO-2022-JP est la norme pour l'envoi d'e-mails en japonais. ).

  • De plus, votre ligne d'objet ne doit pas dépasser 75 caractères par ligne. Autrement dit, 75 caractères après que vous avez codé en ISO-2022-JP et en base64, et non 75 caractères avant la conversion. Si vous dépassez 75 caractères, vous devez diviser votre sujet codé en plusieurs lignes, en commençant par "=? Iso-2022-jp? B?". et se terminant par "? = " sur chaque ligne. Si vous ne le faites pas, votre sujet pourrait être tronqué (en fonction du lecteur de courrier électronique et du contenu du texte de votre sujet). Selon la RFC 2047:

" Un 'mot codé' ne doit pas dépasser 75 caractères, y compris 'jeu de caractères', 'codage', 'texte codé' et les délimiteurs. S'il est souhaitable de coder plus de texte que ne peut en contenir un "mot codé" de 75 caractères, vous pouvez utiliser plusieurs "mots codés" (séparés par CRLF SPACE). "

  • Voici un exemple de code PHP pour coder le sujet:

 // 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.
  • Voir la RFC 2047 pour une description complète de la procédure de codage de l'en-tête de votre courrier électronique.

Autres conseils

Vérifiez http://en.wikipedia.org/wiki/MIME#Encoded-Word pour une description sur la manière de coder les champs d'en-tête dans les messages compatibles MIME. Vous semblez manquer un "? =" À la fin de votre sujet.

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

ISO_2022-JP signifie que la chaîne est codée dans la page de codes ISO-2022-JP (par exemple, pas en Unicode) B signifie que la chaîne est codée bese64

Dans votre exemple, vous devez simplement fournir votre chaîne au format ISO-2022-JP au lieu de Unicode.

J'ai de l'expérience dans la composition et l'envoi de courriers électroniques en japonais ... Normalement, vous devez vous méfier de l'encodage utilisé pour le système d'exploitation et de la façon dont vous stockez vos chaînes japonaises! Les objets My Mail sont normalement codés comme suit:

    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

Ensuite, j'ai une méthode d'extension à laquelle la conversion est faite pour moi:

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            
        }

quelque chose comme ceci devrait faire le travail en python:


#!/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]"

** volé de manière flagrante / adapté de:

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

Tout d’abord, vous devriez utiliser:

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

pour convertir votre ligne d'objet en octets qui seront traités par Convert.ToBase64String ().

=? ISO-2022-JP? B? TEXTTEXT ...? = indique au client de messagerie destinataire quel encodage a été utilisé du côté de l'expéditeur pour convertir des "lettres" japonaises. dans un flux d'octets.

Actuellement, vous utilisez UTF-16 pour encoder, mais spécifiez ISO-2022-JP pour décoder. Je suppose que ce sont évidemment deux codages différents, tout comme ISO-8859-1 est différent de Unicode (les caractères les plus étendus d'Europe occidentale sont représentés par un octet dans ISO-XXX, mais deux octets dans Unicode).

Je ne suis pas sûr de comprendre ce que vous entendez par UTF-8 en tant que citoyen de deuxième classe. Tant que le client de messagerie destinataire comprend UTF-8 et est capable de le convertir aux paramètres régionaux japonais actuels, tout va bien.

<?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;
}

L’introduction du codage japonais dans les messages électroniques s’est produite chez JUNET (réseau national basé sur UUCP) au début des années 90.

À cette époque, la RFC1468 était définie.  Si vous suivez la RFC1468 en texte brut, il n’y aura pas de problème.

Si vous souhaitez gérer le courrier HTML, la RFC1468 est inutile sauf pour les en-têtes.

Voici ce que j'utilise pour envoyer des emails en japonais. La ligne d’objet a bonne apparence dans Outlook 2010, Gmail et sur 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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top