切换到com.sun.mail:javax.mail后,不能再使用带有变音的InternetAddress



我们最近从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);

每个字符>=177都被视为控件或空白-这是错误的,例如元音变音符(ö=246)。因此,异常消息具有误导性。

validate()的更改是否引入了错误

到目前为止,互联网电子邮件地址可能包含双关语编码的变音。这就是为什么我希望用变音来传递字符串是安全的。

在这种情况下,InternetAddress是否用于编码字符串

提前感谢

Bill Shannons答案更新

我的评论中提到的格式很好的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日星期二。

在域名中使用非ASCII字符需要支持RFC 6530、RFC 6531和RFC 6532。客户端和服务器都需要支持这些新标准。我在JavaMail 1.6中添加了这样的支持;您可以下载开发SNAPSHOT版本,如JavaMail网页上所述。您需要确保服务器支持SMTPUTF8扩展,并且需要将Session属性mail.mime.allowutf8设置为true

如果您能够使用真实的邮件服务器测试这种对国际化电子邮件地址的新支持,请在javamail_ww@oracle.com.谢谢

最新更新