日本电子邮件主题编码
显然,编码日语电子邮件有点挑战性,我正在慢慢发现自己。 如果有任何专家(即使是那些经验有限的专家),我可以请一些指导如何做,如何测试以及如何validation它?
请记住,我从未踏足日本附近的任何地方,只是我正在开发的产品在其他地方使用。
到目前为止我知道的是什么(我认为)如下:
– 日语电子邮件应使用ISO-2022-JP,日本JIS代码页50220或可能的SHIFT_JIS代码页932进行编码
– 电子邮件传输编码应设置为Base64用于纯文本,7Bit用于Html
– 电子邮件主题应单独编码,以“=?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年的日语编码,所以我可以同情你的困难。 我参与过的网站每天向日本客户发送数百封电子邮件,以便我与您分享对我们有用的信息。
“”编码字’长度不得超过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.
请查看https://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 [encoding]"
**公然被盗/改编自:
https://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与Unicode不同(大多数扩展的西欧字符在ISO-XXX中用一个字节表示,但在Unicode中用两个字节表示)。
我不确定你对UTF-8是二等公民的意思。 只要接收邮件客户端理解UTF-8并且能够将其转换为当前的日语语言环境,一切都很好。
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上看起来很好。
上述就是C#学习教程:日本电子邮件主题编码分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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");
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1043345.html