質問
明らかに、日本の電子メールをエンコードすることはやや挑戦的であり、私はゆっくりと自分自身を発見しています。専門家がいる場合(経験の浅い人でもできます)、それを行う方法、テストする方法、検証する方法に関するガイドラインを教えてください。
日本近郊に足を踏み入れたことは一度もないということを念頭に置いてください。開発中の製品を他の場所で使用しているだけです。
私がこれまでに知っていることは次のとおりです(
-日本語のメールは、ISO-2022-JP、日本語JISコードページ50220、または場合によってはSHIFT_JISコードページ932
でエンコードする必要があります
-メール転送のエンコードは、プレーンテキストの場合はBase64、Htmlの場合は7ビットに設定する必要があります
-メールの件名は、「=?ISO-2022-JP?B?」で始まるように個別にエンコードする必要があります。 (これが何を意味するのかわからない)。件名を
"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))
基本的にエンコードされた文字列を期待どおりに提供しますが、電子メールプログラムで日本語のテキストとして表示されません
-Outlook 2003、Outlook Express、GMailでテストしました
ご協力いただければ幸いです
了解、短い更新を投稿するために、2つの有用な回答のおかげで、適切な形式とエンコードを取得できました。今、Outlookは正しい主題に似たものを提供します:
=?iso-2022-jp?B?6日本語テストに各々の視点で語&# 12387;てもらった。 6相当の防水?=
ただし、Outlook Expressでまったく同じメールを送信すると、次のような件名になります。
=?iso-2022-jp?B?6日本語テスト縺ォ蜷・・・隕也&# 12379;縺ァ隱槭▲縺ヲ繧ゅi縺」 縺溘・ 6逶ク蠖薙・髦イ豌エ?=
さらに、Outlook Expressの受信トレイビューで表示すると、次のように電子メールの件名がさらに奇妙になります。
=?iso-2022-jp?B?6日本語テスト??????????????? 6 ??????? =
GmailはOutlookと同じように動作しているようです。これは正しいようです。
この問題を回避できません。
解決
私は20年近く日本語エンコーディングを扱ってきたので、皆さんの困難に同情できます。私が取り組んでいるウェブサイトは、日本の顧客に毎日何百通ものメールを送信しているので、私たちのために働いていることをあなたと共有できます。
-
まず、Shift-JISを使用しないでください。私は個人的に大量の日本のメールを受け取りますが、Shift-JISを使用してエンコードされることはほとんどありません。 Outlook Expressの古い(Win 98くらいですか?)バージョンはShift-JISを使用して送信メールをエンコードしたと思いますが、最近は表示されません。
-
理解したように、少なくともメールヘッダーに含まれるすべてのもののエンコーディングとしてISO-2022-JPを使用する必要があります。これには、件名、宛先行、およびCC行が含まれます。 UTF-8はほとんどの場合でも機能しますが、 Yahoo Japanメールでは機能しません。ご想像のとおり、多くの日本人ユーザーはYahoo Japanメールを使用しています。
-
電子メールの本文でUTF-8を使用できますが、UTF-8でエンコードされた日本語テキストをbase64でエンコードし、未加工のUTF-8テキストではなく本文に配置することをお勧めします。ただし、実際には、電子メールの本文については、未加工のUTF-8テキストが最近うまく機能すると考えています。
-
上記で言及したように、少なくともOutlook(Exchange)、Outlook Express(IMAP / POP3)、およびYahoo Japan Webメールでテストする必要があります。ヤフーは、WebページのエンコードにEUCを使用していると考えているため、最も厄介です。したがって、メールの正しい標準に従う必要があります。 )。
-
また、件名は1行あたり75文字を超えないようにしてください。つまり、変換前の75文字ではなく、ISO-2022-JPおよびbase64でエンコードした後の75文字です。 75文字を超える場合は、エンコードされた件名を" =?iso-2022-jp?B?"で始まる複数行に分割する必要があります。 "?="で終わる各行に。これを行わないと、件名が切り捨てられる場合があります(メールリーダーと件名テキストの内容によっては)。 RFC 2047によると:
"「エンコードされた単語」の長さは、「文字セット」、「エンコード」、「エンコードされたテキスト」、区切り文字を含めて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コードページでエンコードされていることを意味します(Unicodeではないなど) Bは、文字列がbese64でエンコードされていることを意味します
この例では、文字列をUnicodeではなく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
}
このようなものは、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]"
**露骨に盗まれた/適応:
最初に使用する必要のあるもの:
Encoding.GetEncoding(&quot; ISO-2022-JP&quot;)
件名をConvert.ToBase64String()で処理されるバイトに変換します。
=?ISO-2022-JP?B?TEXTTEXT ...?=は、日本語の「文字」を変換するために送信者側でどのエンコードが使用されたかを受信メールクライアントに伝えます。バイトストリームに。
現在、エンコードにUTF-16を使用していますが、デコードにはISO-2022-JPを指定しています。これらは明らかに2つの異なるエンコーディングです、ISO-8859-1がUnicodeと異なるように推測します(ほとんどの拡張西ヨーロッパ文字はISO-XXXでは1バイト、Unicodeでは2バイトで表されます)。
UTF-8がセカンドクラスの市民であることについてあなたが何を言っているのかわかりません。受信メールクライアントが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");