Pergunta

Aparentemente, codificando-mails japonesa é um pouco um desafio, que estou lentamente me descobrindo. No caso de existirem quaisquer especialistas (mesmo aqueles com experiência limitada vai fazer), pode por favor me dizer algumas orientações sobre a forma de fazê-lo, como testá-lo e como verificar isso?

Tenha em mente que eu nunca jogo em qualquer lugar pé perto do Japão, é simplesmente que o produto que estou desenvolvendo é usado lá, entre outros lugares.

O que (eu acho) eu sei até agora é o seguinte:
- e-mails japonesas deve ser codificado na norma ISO-2022-JP, japonesa JIS codePage 50220 ou possivelmente SHIFT_JIS página de código 932
- codificação de transferência E-mail deve ser definido como Base64 para texto simples e 7BIT para Html
- E-mail assunto deve ser codificado separadamente para começar com "= ISO-2022-JP B??" (Não sei o que isto é suposto dizer). Tentei codificar o assunto com

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

que dá basicamente a string codificada como esperado, mas ele não é apresentado como qualquer texto japonês em um programa de e-mail
- Eu testei no Outlook 2003, Outlook Express e GMail

Qualquer ajuda seria muito apreciada


Ok, então para deixar um curto atualização, graças às duas respostas úteis, eu consegui obter o formato e codificação direita. Agora, o Outlook dá algo que se assemelha o assunto correto:
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=

No entanto, exatamente o mesmo e-mail no Outlook Express dá assunto assim:
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=

Além disso, quando visto na visão Caixa de entrada no Outlook Express, o assunto do email é ainda mais estranho, como este:
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=

Gmail parece estar funcionando na forma semelhante ao Outlook, o que parece correto.

Eu não posso colocar minha cabeça em torno de um presente.

Foi útil?

Solução

Eu tenho lidado com codificações japonesas por quase 20 anos e que eu possa compadecer-se das suas dificuldades. Sites que eu trabalhei em enviar centenas de e-mails diariamente para clientes japoneses para que eu possa compartilhar com você o que funcionou para nós.

  • Em primeiro lugar, não use Shift-JIS. Eu, pessoalmente, receber toneladas de e-mails japoneses e quase nunca são codificados usando Shift-JIS. Eu acho que um velho (cerca de Win 98?) Versão do Outlook Express codificada de correio de saída usando Shift-JIS, mas hoje em dia você apenas não vê-lo.

  • Como você já descobriu, você precisa usar ISO-2022-JP como sua codificação, pelo menos, qualquer coisa que vai no cabeçalho da mensagem. Isso inclui o tema, linha Para, e linha de CC. UTF-8 também irá funcionar na maioria dos casos, e não vai funcionar no correio de Yahoo Japão, e como você pode imaginar, muitos usuários japoneses usar o correio de Yahoo Japão.

  • Você pode usar UTF-8 no corpo do e-mail, mas é recomendável que você Base64 codificar o texto em japonês UTF-8 codificado e colocar isso no corpo em vez de matéria-UTF-8 texto. No entanto, na prática, acredito que a matéria-UTF-8 texto irá funcionar bem estes dias, para que o corpo do e-mail.

  • Como mencionado acima, você precisa pelo menos teste no Outlook (Exchange), Outlook Express (IMAP / POP3), e Yahoo Japan web mail. Yahoo Japão é o mais complicado, porque eu acredito que eles usam EUC para a codificação de suas páginas da web, e por isso você precisa seguir as normas corretas para seus e-mails ou eles não trabalho (ISO-2022-JP é o padrão para o envio de e-mails japoneses ).

  • Além disso, sua linha de assunto não deve exceder 75 caracteres por linha. Ou seja, 75 caracteres após que você codificado em ISO-2022-JP e base64, não 75 caracteres antes da conversão. Se exceder 75 caracteres, você precisa quebrar o assunto codificado em várias linhas, começando com "=? Iso-2022-jp? B?" e terminando com "? =" em cada linha. Se você não fizer isso, o assunto pode ficar truncado (dependendo do leitor de e-mail, e também o conteúdo do seu texto do assunto). De acordo com a RFC 2047:

"Uma 'palavra-codificado' não pode ser mais de 75 caracteres, incluindo 'charset', 'encoding', 'em texto codificado', e delimitadores. Se é desejável para codificar mais texto do que vai caber em uma 'codificado-palavra' de 75 caracteres, podem ser utilizados múltiplos 'da palavra-codificado (separados por CRLF ESPAÇO). "

  • Aqui está algum código PHP de amostra para codificar o assunto:

 // 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.
  • Veja RFC 2047 para uma descrição completa de como codificar o cabeçalho de e-mail.

Outras dicas

Verifique http://en.wikipedia.org/wiki/MIME#Encoded-Word para uma descrição sobre como codificar campos de cabeçalho em mensagens MIME-compliant. Você parece estar faltando um “? =” No final do seu assunto.

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

meios ISO_2022-JP que corda é codificado na norma ISO-2022-JP página de código (por exemplo, não. Unicode) meio B que String é bese64 codificado

No seu exemplo, você deve apenas fornecer sua seqüência na ISO-2022-JP em vez de Unicode.

Tenho alguma experiência compor e enviar e-mail em japonês ... Normalmente você tem que tomar cuidado que codificação usada para o sistema operacional e como você armazenar suas cordas japoneses! Meus objetos de correio são normalmente codificados como segue:

    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

Então eu tenho um método de extensão a que faz a conversão para mim:

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 isso deve começar o trabalho feito em 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 roubado / adaptado de:

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

Em primeiro lugar você deve usar:

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

para converter sua linha de assunto em bytes que serão processados ??por Convert.ToBase64String ().

=? ISO-2022-JP? B? Texttext ...? = Informa o cliente de email receptor que codificação foi usada no lado do remetente para converter "letras" japonês em um fluxo de bytes.

Atualmente você está usando UTF-16 para codificar, mas especificando ISO-2022-JP para decodificar. Estes são, obviamente, duas codificações diferentes, eu acho, assim como ISO-8859-1 é diferente de Unicode (mais estendido caracteres Oeste Europeu são representados por um byte em ISO-XXX, mas dois bytes em Unicode).

Eu não tenho certeza o que dizer sobre UTF-8 sendo de segunda classe cidadão. Enquanto o cliente de correio de recepção compreende o UTF-8 e é capaz de convertê-lo para o local japonês atual, está tudo bem.

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

Introdução de codificação japonês para e-mail aconteceu no JUNET (rede nacional baseada UUCP) no início dos anos 90.

Nesse momento, RFC1468 foi definida. Se você seguir RFC1468 no correio de texto simples, não haveria problema.

Se você quiser correio pega html, RFC1468 é inútil, exceto para as partes de cabeçalho.

Aqui está o que eu uso para enviar e-mails japoneses. linha de assunto parece bem no Outlook 2010, gmail e no 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top