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