如何编码Internet地址

Rom*_*omi 8 java email mime-message

发送电子邮件的代码如下:

    MimeMessage msg = new MimeMessage(session);
    msg.setSubject("subject", "UTF-8"); // here you specify your subject encoding
    msg.setContent("yourBody", "text/plain; charset=utf-8");

    msg.setFrom("senderAddress");
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(address));
    Transport.send(msg);
Run Code Online (Sandbox Code Playgroud)

我的探针是因为我在utf-8中编码了主题,我如何编码收件人地址,即. new InternetAddress(address)

JMe*_*nik 14

电子邮件地址应遵循RFC822标准

JavaMail的MimeMessage使用InternetAddress:

此类表示使用RFC822语法的Internet电子邮件地址.典型的地址语法格式为"user@host.domain"或"Personal Name <user@host.domain>".

RFC822格式说:

请注意,RFC 822将字符库限制为ASCII.在实践中,其他字符(例如ä或é)通常在用于注释目的(和注释)的引用字符串内工作,但它们不能在正确的地址中使用.

地址的个人名称支持不同的字符集

InternetAddress使用个人名称:

如果名称包含非US-ASCII字符,则将根​​据RFC 2047使用指定的字符集对名称进行编码.如果名称仅包含US-ASCII字符,则不进行编码,并按名称使用名称.

要设置编码的字符集,有一个InternetAddress#constructor.看来源:

public InternetAddress(String address, String personal, String charset)
        throws UnsupportedEncodingException {
    this.address = address;
    setPersonal(personal, charset);
}
Run Code Online (Sandbox Code Playgroud)

它只是调用setPersonal(..),因此选择最方便的方式.

要查找字符集,请使用Charset.forName().