发送电子邮件的代码如下:
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)
答案 0 :(得分:14)
JavaMail的MimeMessage使用InternetAddress:
此类表示使用语法的Internet电子邮件地址 RFC822。典型的地址语法格式为“user@host.domain”或 “个人姓名< user@host.domain>”。
请注意,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字符,则不进行编码,并按名称使用名称。