японское почтовое кодирование предмета

14
задан Makoto 29 April 2012 в 17:11
поделиться

8 ответов

Я имел дело с японской кодировкой в течение почти 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) могут использоваться".

  • Вот некоторый демонстрационный код 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 для полного описания того, как закодировать Ваш почтовый заголовок.
23
ответ дан 1 December 2019 в 08:43
поделиться

Проверьте http://en.wikipedia.org/wiki/MIME#Encoded-Word для описания о том, как закодировать поля заголовка в совместимых MIME сообщениях. Вы, кажется, пропускаете “? =” в конце Вашего предмета.

5
ответ дан 1 December 2019 в 08:43
поделиться

=? ISO-2022-JP? B? TEXTTEXT...

ISO_2022-мировой-судья подразумевает, что строка кодируется в кодовой странице ISO-2022-JP (например, не Unicode) B означает, что строка является bese64, закодированным

В Вашем примере, необходимо просто предоставить строку в ISO-2022-JP вместо Unicode.

2
ответ дан 1 December 2019 в 08:43
поделиться

В первую очередь, необходимо использовать:

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 и может преобразовать его в текущую японскую локаль, все прекрасно.

0
ответ дан 1 December 2019 в 08:43
поделиться

У меня есть некоторый опыт при создании и отправке электронного письма на японском языке... Обычно необходимо остерегаться того, что кодирование использовало для операционной системы и как Вы храните свои японские строки! Мои Почтовые объекты обычно кодируются следующим образом:

    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            
        }
1
ответ дан 1 December 2019 в 08:43
поделиться

что-то подобное должно выполнить работу на 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

1
ответ дан 1 December 2019 в 08:43
поделиться
<?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;
}
0
ответ дан 1 December 2019 в 08:43
поделиться

Введение японской кодировки в электронную почту произошло в JUNET (общенациональная сеть на основе UUCP) в начале 90-х.

В то время был определен RFC1468. Если вы будете следовать RFC1468 в обычном текстовом письме, проблем не будет.

Если вы хотите обрабатывать html-почту, RFC1468 бесполезен, за исключением частей заголовка.

0
ответ дан 1 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: