我们最近从javax.mail:mail
切换到com.sun.mail:javax.mail
。
从那时起,以下代码失败:
new InternetAddress("chr@möllers.de", false).validate();
Caught: javax.mail.internet.AddressException: Domain contains control or whitespace in string ``chr@möllers.de''
javax.mail.internet.AddressException: Domain contains control or whitespace in string ``chr@möllers.de''
InternetAddress#validate()
的实施明显改变了。关于CRLF检查的一些其他内容遵循此代码段:
else if (c <= 040 || c >= 0177) {
throw new AddressException(
"Domain contains control or whitespace", addr);
每个char&gt; = 177被视为控件或空格 - 这是错误的,例如对于变音符号(ö= 246)。 因此异常消息具有误导性。
validate()的更改是否引入了错误?
到目前为止,Internet电子邮件地址可能包含以punycode编码的变音符号。这就是为什么我希望通过变音符号传递字符串是安全的。
在这种情况下,InternetAddress是否与编码字符串一起使用?
提前致谢
我的评论中提到的格式很好的Groovy脚本:
@GrabResolver(name='snapshots', root='https://maven.java.net/content/repositories/snapshots/', m2Compatible='true')
@Grab("com.sun.mail:javax.mail:1.6.0-SNAPSHOT")
import javax.mail.internet.InternetAddress
new InternetAddress("chr@möllers.de", false)
import org.junit.Test;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
public class ValidateEmailTest {
@Test
public void test() throws AddressException {
new InternetAddress("chr@möllers.de", true).validate();
new InternetAddress("chr@möllers.de", false).validate();
}
}
测试成功运行(不抛出AddressException),最新的快照1.6.0-SNAPSHOT目前来自2月21日星期二。
答案 0 :(得分:3)
在域名中使用非ASCII字符需要支持RFC 6530,RFC 6531和RFC 6532。客户端和服务器都需要支持这些新标准。我已经为JavaMail 1.6添加了这样的支持;您可以按照JavaMail web page中的说明下载开发SNAPSHOT版本。您需要确保服务器支持SMTPUTF8扩展,并且您需要将会话属性mail.mime.allowutf8
设置为true
。
如果您能够使用真实的邮件服务器测试这种对国际化电子邮件地址的新支持,请通过javamail_ww@oracle.com告诉我您的体验,无论好坏。感谢。