代码之家  ›  专栏  ›  技术社区  ›  danijels

日文电子邮件主题编码

  •  14
  • danijels  · 技术社区  · 16 年前

    另外,对日文电子邮件进行编码有些挑战,我正在慢慢地发现这一点。如果有专家(即使是经验有限的专家也可以),我能提供一些指导方针,说明如何做、如何测试以及如何验证吗?

    请记住,我从未涉足过日本附近的任何地方,这只是因为我正在开发的产品在日本和其他地方都有使用。


    -日文电子邮件应采用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中进行了测试

    任何帮助都将不胜感激



    =?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???????=

    我就是想不起这件事。

    9 回复  |  直到 13 年前
        1
  •  23
  •   保田ジェフリー    16 年前

    我已经处理日文编码将近20年了,所以我可以同情你的困难。我工作过的网站每天都会向日本客户发送数百封电子邮件,这样我就可以与您分享我们的工作成果。

    • 如您所知,您至少需要使用ISO-2022-JP作为邮件头中任何内容的编码。这包括主题、收件人行和抄送行。UTF-8在大多数情况下也适用, 它在Yahoo Japan mail上不起作用,正如您可以想象的,许多日本用户使用Yahoo Japan mail。

    • 正如我上面提到的,您至少需要在Outlook(Exchange)、Outlook Express(IMAP/POP3)和Yahoo Japan web mail上进行测试。Yahoo Japan是最棘手的,因为我相信他们使用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.
    
    • 有关如何对电子邮件标题进行编码的完整说明,请参阅RFC 2047。
        2
  •  5
  •   Bombe    16 年前

    检查 http://en.wikipedia.org/wiki/MIME#Encoded-Word 有关如何在MIME兼容消息中编码头字段的说明。你似乎错过了一个题目的结尾。

        3
  •  2
  •   dmajkic    16 年前

    B表示字符串是bese64编码的

    在您的示例中,您应该只提供ISO-2022-JP格式的字符串,而不是Unicode格式的字符串。

        4
  •  1
  •   Th3Fix3r Th3Fix3r    16 年前

    我的邮件对象通常编码如下:

        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            
            }
    
        5
  •  1
  •   si28719e    15 年前

    类似这样的操作应该可以在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

        6
  •  0
  •   liggett78    16 年前

    Encoding.GetEncoding("ISO-2022-JP")

    目前,您使用UTF-16进行编码,但指定ISO-2022-JP进行解码。我想这显然是两种不同的编码,就像ISO-8859-1不同于Unicode一样(大多数扩展西欧字符在ISO-XXX中用一个字节表示,而在Unicode中用两个字节表示)。

        7
  •  0
  •   sth    15 年前
    <?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;
    }
    
        8
  •  0
  •   kmugitani    14 年前

    90年代初,JUNET(基于UUCP的全国性网络)将日文编码引入电子邮件。

    如果您想处理html邮件,RFC1468除了标题部分之外是无用的。

        9
  •  0
  •   James John McGuire 'Jahmic'    13 年前

    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");