如何对互联网地址进行编码


发送电子邮件

的代码如下:

    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)

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

JavaMail的MimeMessage使用InternetAddress:

此类表示一个因特网电子邮件地址,其语法为 RFC822.典型的地址语法是"user@host.domain"或 "个人姓名<user@host.域名>"。

RFC822格式 说:

请注意,RFC 822 将字符库限制为 ASCII。在 练习,其他字符(如 ä 或 é)通常在引用内工作 用于注释目的(和注释)的字符串,但不得 在适当的地址中使用。

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

互联网地址使用个人姓名:

如果名称包含非 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()。

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

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

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

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 字符,则不会进行任何编码,并且将按原样使用该名称。

最新更新