Я имел дело с японской кодировкой в течение почти 20 лет и таким образом, я могу сочувствовать Вашим трудностям. Веб-сайты, что я продолжил работать, ежедневно посылают сотни электронных писем японским клиентам, таким образом, я могу совместно использовать с Вами, что работало на нас.
, В первую очередь, не используйте Shift JIS. Я лично получаю тонны японских электронных писем и почти никогда не являюсь ими закодированный Shift JIS использования. Я думаю старое (приблизительно Win 98?) версия Outlook Express закодировала исходящую почту с помощью Shift JIS, но в наше время Вы просто не видите его.
, Поскольку Вы выяснили, необходимо использовать ISO-2022-JP в качестве кодирования по крайней мере для чего-либо, что входит в почтовый заголовок. Это включает Предмет К строке и строке CC. UTF-8 будет также работать в большинстве случаев, , но он не будет работать над почтой Yahoo Япония, и как можно предположить, многие японские пользователи используют почту Yahoo Япония.
можно использовать UTF-8 в теле электронной почты, но рекомендуется, чтобы Вы, base64 кодируют UTF-8, закодировали японский текст и поместили это в тело вместо необработанного текста UTF-8. Однако на практике я полагаю, что необработанный текст UTF-8 будет хорошо работать в эти дни для тела электронной почты.
, Поскольку я сослался на вышеупомянутый, необходимо, по крайней мере, протестировать на Outlook (Exchange), Outlook Express (IMAP/POP3) и веб-почта Yahoo Япония. Yahoo Япония является самым хитрым, потому что я полагаю, что они используют EUC для кодирования их веб-страниц, и таким образом, необходимо следовать корректным стандартам для электронных писем, или они не будут работать (ISO-2022-JP является стандартом для отправки японских электронных писем).
кроме того, Ваша строка темы не должна превышать 75 символов на строку. Таким образом, 75 символов после Вы закодировали в ISO-2022-JP и base64, не 75 символах перед преобразованием. При превышении 75 символов необходимо ли повредить закодированный предмет в несколько строк, начиная с "=? iso-2022-jp? B?" и окончание"? =" на каждой строке. Если Вы не делаете этого, Ваш предмет мог бы стать усеченным (в зависимости от почтового читателя и также содержания Вашего подчиненного текста). Согласно RFC 2047:
"'закодированное слово' не может быть больше чем 75 символами долго, включая 'набор символов', 'кодирование', 'закодированный текст' и разделители. Если желательно закодировать больше текста, чем поместится в 'закодированное слово' 75 символов, несколько 'закодированное слово (разделенный ПРОСТРАНСТВОМ CRLF) могут использоваться".
// 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-мировой-судья подразумевает, что строка кодируется в кодовой странице ISO-2022-JP (например, не Unicode) B означает, что строка является bese64, закодированным
В Вашем примере, необходимо просто предоставить строку в ISO-2022-JP вместо Unicode.
В первую очередь, необходимо использовать:
Encoding.GetEncoding("ISO-2022-JP")
для преобразования строки темы в байты, которые будут обработаны Преобразованием. ToBase64String ().
=? ISO-2022-JP? B? TEXTTEXT...? = говорит получающему почтовому клиенту, какое кодирование использовалось на стороне отправителя для преобразования японских "букв" в поток байтов.
В настоящее время Вы используете UTF-16 для кодирования, но указываете ISO-2022-JP для декодирования. Это, очевидно, две различных кодировки, я предполагаю, точно так же, как ISO-8859-1 отличается от Unicode (самые расширенные символы Западной Европы представлены на один байт в ISO-XXX, но два байта в Unicode).
я не уверен, что Вы имеете в виду о UTF-8 быть второразрядным гражданином. Пока получающий почтовый клиент понимает UTF-8 и может преобразовать его в текущую японскую локаль, все прекрасно.
У меня есть некоторый опыт при создании и отправке электронного письма на японском языке... Обычно необходимо остерегаться того, что кодирование использовало для операционной системы и как Вы храните свои японские строки! Мои Почтовые объекты обычно кодируются следующим образом:
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;
}
Введение японской кодировки в электронную почту произошло в JUNET (общенациональная сеть на основе UUCP) в начале 90-х.
В то время был определен RFC1468. Если вы будете следовать RFC1468 в обычном текстовом письме, проблем не будет.
Если вы хотите обрабатывать html-почту, RFC1468 бесполезен, за исключением частей заголовка.