c# - que - codificación del asunto del correo electrónico japonés
que poner en asunto en un mail de trabajo ejemplos (9)
Consulte 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 "? =" Al final de tu tema.
Aparentemente, codificar correos electrónicos japoneses es algo desafiante, y poco a poco me descubro a mí mismo. En caso de que haya expertos (incluso aquellos con experiencia limitada), ¿puedo por favor 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) sé hasta ahora es lo siguiente:
- Los correos electrónicos japoneses deben codificarse en ISO-2022-JP, la página de códigos japoneses JIS 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?" (no sé lo que se supone que significa) He intentado codificar el tema con
"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))
que básicamente da la cadena codificada como se esperaba, pero no se presenta como ningún texto japonés en un programa de correo electrónico
- He probado en Outlook 2003, Outlook Express y GMail
Cualquier ayuda sería muy apreciada
Ok, entonces, 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 asemeja al tema correcto:
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=
Sin embargo, el mismo correo electrónico en Outlook Express da un tema como este:
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=
Además, cuando se ve en la vista Bandeja de entrada en Outlook Express, el tema del correo electrónico es aún más extraño, como este:
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=
Parece que Gmail funciona de forma similar a Outlook, lo que parece correcto.
Simplemente no puedo entender esto.
=? 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.
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 ...? = Indica 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á utilizando UTF-16 para codificar, pero especificando ISO-2022-JP para decodificar. Evidentemente, estas son dos codificaciones diferentes, 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 que UTF-8 es un ciudadano de segunda clase. Siempre que el cliente de correo receptor entienda UTF-8 y pueda convertirlo a la configuración local japonesa actual, todo está bien.
Tengo algo de experiencia en redactar y enviar correos electrónicos en japonés ... Normalmente, debe tener cuidado con la codificación utilizada para el sistema operativo y la forma de almacenar sus cadenas japonesas. Mis objetos de Mail 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
Entonces tengo un método de extensión al cual 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
}
He estado lidiando con codificaciones japonesas durante casi 20 años y puedo simpatizar con tus dificultades. Los sitios web en los que he trabajado envían cientos de correos electrónicos diarios a clientes japoneses para que pueda compartir con ustedes lo que funcionó para nosotros.
En primer lugar, no use Shift-JIS. Personalmente recibo toneladas de correos electrónicos japoneses y casi nunca están codificados usando Shift-JIS. Creo que una versión antigua (circa Win 98?) De Outlook Express codificó el correo saliente utilizando Shift-JIS, pero hoy en día simplemente no lo ves.
Como has descubierto, necesitas usar ISO-2022-JP como tu codificación para al menos cualquier cosa que vaya en el encabezado del correo. Esto incluye la línea Asunto, A línea y CC. UTF-8 también funcionará en la mayoría de los casos, pero no funcionará en el correo de Yahoo Japan, y como se puede imaginar, muchos usuarios japoneses usan el correo de 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 ponga en el cuerpo en lugar de texto UTF-8 sin formato. Sin embargo, en la práctica, creo que el texto crudo UTF-8 funcionará bien en estos días, para el cuerpo del correo electrónico.
Como mencioné anteriormente, debe probar al menos en Outlook (Exchange), Outlook Express (IMAP / POP3) y el correo web de Yahoo Japan. 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 de haber codificado en ISO-2022-JP y base64, no 75 caracteres antes de la conversión. Si supera los 75 caracteres, debe dividir el sujeto codificado en varias líneas, comenzando con "=? Iso-2022-jp? B?" y terminando con "? =" en cada línea. Si no lo hace, su tema podría verse truncado (dependiendo del lector de correo electrónico, y también del contenido del texto del tema). De acuerdo con RFC 2047:
"Una ''palabra codificada'' no puede tener más de 75 caracteres, incluidos ''charset'', ''encoding'', ''encoded-text'' y delimitadores. Si es conveniente codificar más texto de lo que cabrá en un ''encoded- se puede usar la palabra ''de 75 caracteres, múltiples'' palabras codificadas (separadas por CRLF SPACE).
- Aquí hay un ejemplo de código PHP 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.
algo así 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:
<?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 sucedió en JUNET (red nacional basada en UUCP) a principios de los 90.
En ese momento, se definió RFC1468. Si sigues RFC1468 en el correo de texto plano, no habría ningún problema.
Si desea manejar correo html, RFC1468 es inútil a excepción de 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");