[英]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分隔)。”
// 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.
檢查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]"
**公然被盜/改編自:
<?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.