문제

냉담하게, 일본 이메일을 인코딩하는 것은 다소 어려운 일이며, 나는 천천히 자신을 발견하고 있습니다. 전문가가있는 경우 (경험이 제한된 전문가조차도) 수행 방법, 테스트 방법 및 확인 방법에 대한 지침을 갖게 될 수 있습니까?

나는 일본 근처에 발을 내딛지 않았다는 것을 명심하십시오. 단순히 내가 개발하고있는 제품이 다른 곳에서 사용된다는 것입니다.

지금까지 알고있는 것은 다음과 같습니다.
-일본 이메일은 ISO-2022-JP, 일본 JIS CodePage 50220 또는 아마도 shift_jis codepage 932로 인코딩해야합니다.
- 이메일 전송 인코딩은 일반 텍스트의 경우 Base64로 설정하고 HTML의 경우 7BIT로 설정해야합니다.
-"=? iso-2022-jp? b?"로 시작하려면 이메일 주제를 별도로 인코딩해야합니다. (이것이 무엇을 의미하는지 모르겠습니다). 주제를 인코딩하려고 시도했습니다

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

기본적으로 인코딩 된 문자열을 예상대로 제공하지만 이메일 프로그램에서 일본어 텍스트로 제시되지 않습니다.
- Outlook 2003, Outlook Express 및 Gmail에서 테스트했습니다.

모든 도움은 대단히 감사하겠습니다


자, 짧은 업데이트를 게시하기 위해 두 가지 유용한 답변 덕분에 올바른 형식과 인코딩을 얻었습니다. 이제 Outlook은 올바른 주제와 비슷한 것을 제공합니다.
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=

그러나 Outlook Express의 동일한 이메일은 다음과 같은 주제를 제공합니다.
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=

또한 Outlook Express의받은 편지함보기에서 볼 때 이메일 주제는 다음과 같이 더 이상합니다.
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=

Gmail은 Outlook과 비슷한 방식으로 작동하는 것 같습니다.

나는 단지 이것으로 내 머리를 잡을 수 없다.

도움이 되었습니까?

해결책

나는 거의 20 년 동안 일본인 인코딩을 다루어 왔으므로 당신의 어려움에 동정 할 수 있습니다. 내가 작업 한 웹 사이트는 매일 수백 개의 이메일을 일본 고객에게 보내므로 우리를 위해 일한 것을 공유 할 수 있습니다.

  • 우선, Shift-Jis를 사용하지 마십시오. 나는 개인적으로 수많은 일본 이메일을 받고 거의 Shift-Jis를 사용하여 인코딩되지 않습니다. Outlook Express의 오래된 (Circa Win 98?) 버전의 Outlook Express가 Shift-Jis를 사용하여 나가는 메일을 인코딩했다고 생각하지만 요즘에는 보지 못합니다.

  • 알아 낸 것처럼, ISO-2022-JP를 메일 헤더에 들어가는 모든 것을 인코딩으로 사용해야합니다. 여기에는 주제, 라인 및 CC 라인이 포함됩니다. UTF-8은 대부분의 경우에도 작동합니다. 하지만 Yahoo Japan Mail에서는 작동하지 않으며 상상할 수 있듯이 많은 일본 사용자가 Yahoo Japan Mail을 사용합니다.

  • 이메일 본문에서 UTF-8을 사용할 수 있지만 Base64는 UTF-8 인코딩 된 일본어 텍스트를 인코딩하여 RAW UTF-8 텍스트 대신 본문에 넣는 것이 좋습니다. 그러나 실제로는 RAW UTF-8 텍스트가 요즘 이메일 본문에서 잘 작동한다고 생각합니다.

  • 위에서 언급했듯이 Outlook (Exchange), Outlook Express (IMAP/POP3) 및 Yahoo Japan Web Mail에서 최소한 테스트해야합니다. 야후 일본은 웹 페이지를 인코딩하는 데 EUC를 사용한다고 생각하기 때문에 가장 까다 롭기 때문에 이메일의 올바른 표준을 따라야하거나 작동하지 않습니다 (ISO-2022-JP는 일본 이메일을 보내는 표준입니다. ).

  • 또한 제목 줄은 한 줄 당 75자를 초과해서는 안됩니다. 즉, 75 자입니다 ~ 후에 변환 전에 75자가 아닌 ISO-2022-JP 및 Base64로 인코딩했습니다. 75자를 초과하면 "=? iso-2022-jp? b?"로 시작하여 인코딩 된 피사체를 여러 줄로 나누어야합니다. 각 줄에서 "? ="로 끝납니다. 이 작업을 수행하지 않으면 주제가 잘릴 수 있습니다 (이메일 리더 및 주제 텍스트의 내용에 따라 다름). RFC 2047에 따르면 :

" '인코딩 된 단어'는 'charset', 'encoding', 'encoded-text'및 Delimiters를 포함하여 75 자 이상 길이가 될 수 있습니다. 75 자 중 단어 ', 여러'인코딩 된 단어 (CRLF 공간으로 분리)가 사용될 수 있습니다. "

  • 주제를 인코딩하기위한 샘플 PHP 코드는 다음과 같습니다.

 // 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.
  • 이메일 헤더를 인코딩하는 방법에 대한 자세한 설명은 RFC 2047을 참조하십시오.

다른 팁

확인하다 http://en.wikipedia.org/wiki/mime#encoded-word MIME 호환 메시지에서 헤더 필드를 인코딩하는 방법에 대한 설명을 보려면. 피사체의 끝에 "? ="가없는 것 같습니다.

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

ISO_2022-JP는 문자열이 ISO-2022-JP CodePage (예 : 유니 코드가 아님)에서 인코딩되어 있음을 의미합니다. b는 String이 bese64 인코딩 된 것을 의미합니다.

예에서는 유니 코드 대신 ISO-2022-JP에 문자열을 공급해야합니다.

일본어로 이메일을 작성하고 보내는 경험이 있습니다 ... 일반적으로 운영 체제에 사용 된 인코딩과 일본어 문자열을 저장하는 방법을 조심해야합니다! 내 메일 객체는 일반적으로 다음과 같이 인코딩됩니다.

    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

그런 다음 나에게 변환을 수행하는 확장 방법이 있습니다.

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            
        }

이와 같은 것은 파이썬에서 작업을 완료해야합니다.


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

** 뻔뻔스럽게 도난 당/적응 : :

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

우선 사용해야합니다.

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

제목 줄을 convert.tobase64string ()에 의해 처리 될 바이트로 변환합니다.

=? iso-2022-jp? b? textText ...? = 발신자 측에서 인코딩을 사용하여 일본어 "문자"를 바이트 스트림으로 변환하는 데 인코딩이 사용 된 수신 메일 클라이언트를 알려줍니다.

현재 UTF-16을 사용하여 인코딩하지만 ISO-2022-JP를 디코딩하기 위해 지정합니다. 이것들은 분명히 두 가지 다른 인코딩입니다. ISO-8859-1은 유니 코드와 다릅니다 (대부분의 확장 된 서부 유럽 숯은 ISO-XXX에서 1 바이트로 표시되지만 유니 코드의 2 바이트).

UTF-8이 2 등 시민이라는 것이 무엇을 의미하는지 잘 모르겠습니다. 수신 메일 클라이언트가 UTF-8을 이해하고 현재 일본의 로케일로 변환 할 수있는 한 모든 것이 정상입니다.

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

전자 메일에 대한 일본인 인코딩의 소개는 90 년대 초의 Junet (UUCP 기반 국가 전역 네트워크)에서 발생했습니다.

당시 RFC1468이 정의되었습니다. 일반 텍스트 메일로 RFC1468을 팔로우하면 아무런 문제가 없습니다.

HTML 메일을 처리하려면 RFC1468은 헤더 부품을 제외하고 쓸모가 없습니다.

다음은 일본식 이메일을 보내는 데 사용하는 것입니다. 제목은 Outlook 2010, Gmail 및 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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top