切换到com.sun.mail:javax.mail后,不能再使用InternetAddress和变音符号

时间:2017-02-08 10:13:18

标签: javamail

我们最近从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是否与编码字符串一起使用?

提前致谢

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日星期二。

1 个答案:

答案 0 :(得分:3)

在域名中使用非ASCII字符需要支持RFC 6530RFC 6531RFC 6532。客户端和服务器都需要支持这些新标准。我已经为JavaMail 1.6添加了这样的支持;您可以按照JavaMail web page中的说明下载开发SNAPSHOT版本。您需要确保服务器支持SMTPUTF8扩展,并且您需要将会话属性mail.mime.allowutf8设置为true

如果您能够使用真实的邮件服务器测试这种对国际化电子邮件地址的新支持,请通过javamail_ww@oracle.com告诉我您的体验,无论好坏。感谢。