簡體   English   中英

日文電子郵件主題編碼

[英]japanese email subject encoding

顯然,對日文電子郵件進行編碼有些挑戰,我正在慢慢發現自己。 如果有專家(即使經驗有限的專家也會這樣做),請問我有一些有關如何做,如何測試和如何驗證的准則?

請記住,我從來沒有涉足過日本附近的任何地方,這僅僅是我正在開發的產品在日本以及其他地方使用的原因。

到目前為止,我所知道的(我認為)是:
-日語電子郵件應使用ISO-2022-JP,日語JIS代碼頁50220或可能的SHIFT_JIS代碼頁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使用Shift-JIS對舊版本的Outlook Express(大約是Win 98?)進行編碼,但如今您只是看不到它。

  • 如您所知,對於至少郵件頭中包含的所有內容,您都需要使用ISO-2022-JP作為編碼。 這包括主題,收件人行和抄送行。 UTF-8在大多數情況下也可以使用, 不適用於Yahoo Japan郵件,並且可以想象,許多日本用戶使用Yahoo Japan郵件。

  • 您可以在電子郵件的正文中使用UTF-8,但是建議您對UTF-8編碼的日語文本進行base64編碼,然后將其而不是原始的UTF-8文本放入正文中。 但是,實際上,我認為對於電子郵件正文而言,原始UTF-8文本現在可以正常工作。

  • 如上所述,您至少需要對Outlook(Exchange),Outlook Express(IMAP / POP3)和Yahoo Japan網絡郵件進行測試。 Yahoo Japan是最棘手的,因為我相信他們使用EUC對其網頁進行編碼,因此您需要遵循正確的電子郵件標准,否則它們將無法正常工作(ISO-2022-JP是發送日語電子郵件的標准)。

  • 另外,主題行每行不得超過75個字符。 也就是說,用ISO-2022-JP和base64編碼后的字符數是75,而不是轉換前的字符數是75。 如果超過75個字符,則需要將編碼的主題分成多行,以“ =?iso-2022-jp?B?”開頭 並在每行上以“?=“結尾。 如果您不這樣做,則您的主題可能會被截斷(取決於電子郵件閱讀器以及主題文本的內容)。 根據RFC 2047:

““編碼字”的長度不能超過75個字符,包括“字符集”,“編碼”,“編碼文本”和定界符。如果需要編碼的文本超出了“編碼文本” 75個字符的單詞”,可以使用多個“編碼單詞”(由CRLF SPACE分隔)。”

  • 這是一些用於編碼主題的示例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代碼頁編碼(例如,非Unicode)B表示字符串為bese64編碼

在您的示例中,您應該只在ISO-2022-JP中提供字符串,而不是Unicode。

我有一些用日語編寫和發送電子郵件的經驗...通常,您必須提防操作系統使用哪種編碼以及如何存儲日語字符串! 我的郵件對象通常編碼如下:

    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            
        }

這樣的事情應該可以在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]"

**公然被盜/改編自:

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

<?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除標題部分外沒有用。

首先,您應該使用:

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

將您的主題行轉換為將由Convert.ToBase64String()處理的字節。

=?ISO-2022-JP?B?TEXTTEXT ...... =告訴接收郵件客戶端,發送方使用哪種編碼將日語“字母”轉換為字節流。

當前,您正在使用UTF-16進行編碼,但是指定ISO-2022-JP進行解碼。 我想這顯然是兩種不同的編碼,就像ISO-8859-1與Unicode不同(大多數擴展的Western-Europe字符在ISO-XXX中用一個字節表示,而在Unicode中用兩個字節表示)。

我不確定您對UTF-8是二等公民的意思。 只要接收郵件的客戶端能夠理解UTF-8並將其轉換為當前的日語語言環境,一切都很好。

這是我用來發送日語電子郵件的方法。 在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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM