JavaMail:“;域包含字符串“中的控件或空格”;错误消息,因为域中包含丹麦字符

JavaMail:“;域包含字符串“中的控件或空格”;错误消息,因为域中包含丹麦字符,java,email,dns,jakarta-mail,Java,Email,Dns,Jakarta Mail,现在允许使用特殊丹麦字符(如æå)的域,但我不能强迫java mail接受这一点 @Test() public void testMailAddressWithDanishCharacters1() throws AddressException, UnsupportedEncodingException { InternetAddress cAddress = new InternetAddress( "test@testæxample12345123.com", null,

现在允许使用特殊丹麦字符(如æå)的域,但我不能强迫java mail接受这一点

    @Test()
public void testMailAddressWithDanishCharacters1() throws AddressException, UnsupportedEncodingException {
    InternetAddress cAddress = new InternetAddress( "test@testæxample12345123.com", null, "utf-8" );
    System.out.println( cAddress.toString() );
    cAddress.validate();
}

@Test()
public void testMailAddressWithDanishCharacters2() throws AddressException, UnsupportedEncodingException {
    InternetAddress cAddress = new InternetAddress( "test@testæxample12345123.com", false );
    System.out.println( cAddress.toString() );
    cAddress.validate();
}

@Test()
public void testMailAddressWithDanishCharacters3() throws AddressException, UnsupportedEncodingException {
    InternetAddress cAddress = new InternetAddress( "test@testæxample12345123.com", true );
    System.out.println( cAddress.toString() );
    cAddress.validate();
}

所有测试都在InternetAddress的构造函数或validate()方法中失败。如何处理域中的这些特殊丹麦字符。我打赌其他国家的域与javamail InternetAddress中的电子邮件存在相同的问题。

Java Mail不支持i18n域名,因此您必须使用标准规则来转义它们。

当前邮件服务器通常不接受本地部分的非ASCII字符,只接受域部分IDN支持(在“@”符号之后)

为了仅使用java.net.IDN类对域部分进行编码,我使用以下Util

(代码未在生产中测试,但应该可以工作)

导入java.net.IDN;
公共类IDNMailHelper{
公共静态字符串toIdnAddress(字符串邮件){
if(mail==null){
返回null;
}
int idx=mail.indexOf('@');
if(idx<0){
回信;
}
返回localPart(mail,idx)+“@”+IDN.toASCII(domain(mail,idx));
}
私有静态字符串localPart(字符串邮件,int-idx){
return mail.substring(0,idx);
}
私有静态字符串域(字符串邮件,int-idx){
返回邮件子字符串(idx+1);
}
}

我确实使用Java 7、javax.mail 1.4(来自Maven repository)运行了它。 在那里它起作用了

java源代码是UTF-8,操作系统是Linux。 或者原因可能是您使用的是jee罐

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jeggen.test2.AppTest
test@testæxample12345123.com
test@testæxample12345123.com
test@testæxample12345123.com
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 sec

Results :

Tests run: 4, Failures: 0, Errors: 0, Skipped: 0

Java Mail 1.6支持国际化电子邮件地址

它仍在开发中,您可以尝试使用快照版本

-Dmail.mime.allowutf8=true 

您使用的是哪个版本的javamail?也许这是一个愚蠢的想法,但是如果您对域名进行URL编码,会发生什么?或者如果失败,可能会使用子类
InternetAddress
并重写构造函数和
validate()
函数来执行您想要的操作?谢谢。我正在使用java.net.IDN.toASCII()要做到这一点。规则应该只应用于域部分还是应用于整个电子邮件地址?有趣的问题;RFC说“在
@
右侧的部分”但我看不出这是否意味着你不能在名称部分使用unicode,或者这将被忽略。我的直觉是:电子邮件地址中只有ASCII码,所以你可能应该对两者都进行编码。也许这有帮助,但它仍然是一个草稿:哪个JDK?这里只运行了第一个。当然还有
toString()的合同
不支持只返回ASCII码。
-Dmail.mime.allowutf8=true