Pregunta

Aparentemente, codificar correos electrónicos japoneses es un tanto desafiante, que poco a poco me estoy descubriendo. En caso de que haya algún experto (incluso aquellos con experiencia limitada lo harán), ¿puedo tener algunas pautas sobre cómo hacerlo, cómo probarlo y cómo verificarlo?

Tenga en cuenta que nunca he puesto un pie cerca de Japón, es simplemente que el producto que estoy desarrollando se usa allí, entre otros lugares.

Lo que (creo) que sé hasta ahora es lo siguiente:
- Los correos electrónicos japoneses deben codificarse en ISO-2022-JP, la página de códigos JIS japonesa 50220 o posiblemente la página de códigos SHIFT_JIS 932
- La codificación de transferencia de correo electrónico debe establecerse en Base64 para texto sin formato y 7 bits para HTML
- El asunto del correo electrónico debe codificarse por separado para comenzar con " =? ISO-2022-JP? B? & Quot; (No sé qué se supone que significa esto). He intentado codificar el tema con

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

que básicamente proporciona la cadena codificada como se esperaba pero no se presenta como ningún texto en japonés en un programa de correo electrónico
- He probado en Outlook 2003, Outlook Express y GMail

Cualquier ayuda sería muy apreciada


Bien, para publicar una breve actualización, gracias a las dos respuestas útiles, he logrado obtener el formato y la codificación correctos. Ahora, Outlook da algo que se parece al tema correcto:
=? iso-2022-jp? B? 6 Prueba japonesa ? ? ? ? ?? ? ? ? ? ? ? ? ?? 6 ?? ? ??? =

Sin embargo, exactamente el mismo correo electrónico en Outlook Express da un asunto como este:
=? iso-2022-jp? B? 6 Prueba de japonés ?código>

Además, cuando se ve en la vista de la Bandeja de entrada en Outlook Express, el asunto del correo electrónico es aún más extraño, como esto:
=? iso-2022-jp? B? 6 Prueba japonesa ??????????????? 6 ??????? =

Gmail parece estar funcionando de manera similar a Outlook, lo que parece correcto.

Simplemente no puedo entender esto.

¿Fue útil?

Solución

He estado lidiando con codificaciones japonesas durante casi 20 años, por lo que puedo simpatizar con sus dificultades. Los sitios web en los que he trabajado envían diariamente cientos de correos electrónicos a clientes japoneses para que pueda compartir con ustedes lo que nos ha funcionado.

  • En primer lugar, no use Shift-JIS. Personalmente recibo toneladas de correos electrónicos japoneses y casi nunca están codificados con Shift-JIS. Creo que una versión antigua (¿alrededor de Win 98?) Del correo saliente codificado de Outlook Express usando Shift-JIS, pero hoy en día simplemente no lo ves.

  • Como se ha dado cuenta, necesita usar ISO-2022-JP como su codificación para al menos cualquier cosa que vaya en el encabezado del correo. Esto incluye el Asunto, la línea Para y la línea CC. UTF-8 también funcionará en la mayoría de los casos, pero no funcionará en el correo Yahoo Japan, y como se puede imaginar, muchos usuarios japoneses usan el correo Yahoo Japan.

  • Puede usar UTF-8 en el cuerpo del correo electrónico, pero se recomienda que base64 codifique el texto japonés codificado en UTF-8 y lo coloque en el cuerpo en lugar del texto UTF-8 sin procesar. Sin embargo, en la práctica, creo que el texto UTF-8 sin formato funcionará bien en estos días, para el cuerpo del correo electrónico.

  • Como mencioné anteriormente, necesita al menos probar en Outlook (Exchange), Outlook Express (IMAP / POP3) y el correo web de Yahoo Japón. Yahoo Japan es el más complicado porque creo que usan EUC para la codificación de sus páginas web, por lo que debe seguir los estándares correctos para sus correos electrónicos o no funcionarán (ISO-2022-JP es el estándar para enviar correos electrónicos japoneses ).

  • Además, su línea de asunto no debe exceder los 75 caracteres por línea. Es decir, 75 caracteres después que haya codificado en ISO-2022-JP y base64, no 75 caracteres antes de la conversión. Si excede los 75 caracteres, debe dividir el sujeto codificado en varias líneas, comenzando con " =? Iso-2022-jp? B? & Quot; y terminando con "? = " en cada linea Si no hace esto, su asunto podría truncarse (según el lector de correo electrónico y también el contenido del texto del asunto). De acuerdo con RFC 2047:

" Una 'palabra codificada' no puede tener más de 75 caracteres, incluidos 'juego de caracteres', 'codificación', 'texto codificado' y delimitadores. Si es deseable codificar más texto del que cabe en una 'palabra codificada' de 75 caracteres, se pueden usar múltiples 'palabras codificadas (separadas por CRLF SPACE).' '

  • Aquí hay un código PHP de muestra para codificar el tema:

 // 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.
  • Consulte RFC 2047 para obtener una descripción completa de cómo codificar el encabezado de su correo electrónico.

Otros consejos

Compruebe http://en.wikipedia.org/wiki/MIME#Encoded-Word para obtener una descripción sobre cómo codificar campos de encabezado en mensajes compatibles con MIME. Parece que te falta un & # 8220;? = & # 8221; al final de su tema.

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

ISO_2022-JP significa que la cadena está codificada en la página de códigos ISO-2022-JP (por ejemplo, no Unicode) B significa que la cadena está codificada en bese64

En su ejemplo, solo debe suministrar su cadena en ISO-2022-JP en lugar de Unicode.

Tengo algo de experiencia al redactar y enviar correos electrónicos en japonés ... ¡Normalmente, debes tener cuidado con la codificación utilizada para el sistema operativo y la forma en que guardas tus cadenas japonesas! Mis objetos de correo normalmente están codificados de la siguiente manera:

    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

Luego tengo un método de extensión al cual me hace la conversión:

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            
        }

algo como esto debería hacer el trabajo 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]"

** descaradamente robado / adaptado de:

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

Antes que nada deberías estar usando:

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

para convertir su línea de asunto en bytes que serán procesados ??por Convert.ToBase64String ().

=? ISO-2022-JP? B? TEXTTEXT ...? = le dice al cliente de correo receptor qué codificación se utilizó en el lado del remitente para convertir letras japonesas '' en un flujo de bytes.

Actualmente estás usando UTF-16 para codificar, pero especificando ISO-2022-JP para decodificar. Obviamente, estas son dos codificaciones diferentes, supongo, al igual que ISO-8859-1 es diferente de Unicode (la mayoría de los caracteres extendidos de Europa occidental están representados por un byte en ISO-XXX, pero dos bytes en Unicode).

No estoy seguro de lo que quieres decir con UTF-8 como ciudadano de segunda clase. Siempre y cuando el cliente de correo receptor entienda UTF-8 y pueda convertirlo al sitio japonés actual, todo está 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;
}

La introducción de la codificación japonesa al correo electrónico ocurrió en JUNET (red nacional basada en UUCP) a principios de los 90.

En ese momento, se definió RFC1468.  Si sigue RFC1468 en el correo de texto sin formato, no habría ningún problema.

Si desea manejar el correo html, RFC1468 es inútil excepto por las partes del encabezado.

Esto es lo que uso para enviar correos electrónicos japoneses. La línea de asunto se ve bien en Outlook 2010, gmail y en 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top