如何编码Internet地址

时间:2012-05-31 09:22:07

标签: 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);

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

2 个答案:

答案 0 :(得分:14)

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

JavaMail的MimeMessage使用InternetAddress

  

此类表示使用语法的Internet电子邮件地址   RFC822。典型的地址语法格式为“user@host.domain”或   “个人姓名< user@host.domain>”。

RFC822 format说:

  

请注意,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);
}

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

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

答案 1 :(得分:3)

我这样做,其中addressString是一个包含NLS字符的电子邮件地址:

InternetAddress address = new InternetAddress(addressString);
String personal = address.getPersonal();
if(personal != null) {
  address.setPersonal(personal, "utf-8");
}

getPersonal()获取原始个人姓名(如果有),因为如果您使用单个字符串构建InternetAddress,或者使用InternetAddress.parse(),则您不会拥有个人姓名部分单独的字符串:

  

public java.lang.String getPersonal()

     

获取个人姓名。如果根据RFC 2047对名称进行编码,则将其解码并转换为Unicode。如果解码或转换失败,原始数据将按原样返回。

然后setPersonal()再次设置字符串,但这次告诉InternetAddress对其进行编码:

  

public void setPersonal(java.lang.String name,java.lang.String charset)

     

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