【问题标题】:How to encode Internet address如何对 Internet 地址进行编码
【发布时间】:2012-06-05 13:02:15
【问题描述】:

发送邮件的代码如下:

    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)

【问题讨论】:

  • 为什么要对收件人地址进行编码?
  • @MichaelLaffargue:由于邮件是外文的,因此收件人地址
  • @Romi:你从哪里得到你的电子邮件地址?数据库或一些属性文件?是address 还是String

标签: java email mime-message


【解决方案1】:

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

JavaMail 的 MimeMessage 使用 InternetAddress:

该类表示一个 Internet 电子邮件地址,其语法为 RFC822。典型的地址语法格式为“user@host.domain”或 "个人姓名 "。

RFC822 format 说:

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

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

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()

【讨论】:

  • 什么是个人,我的地址中有特殊字符,显示不正确
  • @Romi 个人名称是电子邮件地址的名称,例如:"Евгений Мельник" ,其中第一部分是姓名,第二部分是地址。
【解决方案2】:

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

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

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

公共 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 字符,则不进行编码并按原样使用名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多