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

Posted

技术标签:

【中文标题】JavaMail:“域包含字符串中的控件或空格”错误消息,因为域包含丹麦字符【英文标题】:JavaMail: "Domain contains control or whitespace in string" errormessage because of domain with Danish characters 【发布时间】:2011-07-25 22:01:48 【问题描述】:

现在允许使用带有特殊丹麦字符(例如 æ ø å)的域,但我不能强制 java 邮件接受这个。

    @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 中的电子邮件存在相同的问题。

【问题讨论】:

您使用的是哪个版本的 javamail? 也许这是一个愚蠢的想法,但是如果你对域名进行 URLEncode 会发生什么? 或者失败了,可能是子类InternetAddress并覆盖构造函数和validate()函数来做你想做的事? 【参考方案1】:

目前邮件服务器一般不接受本地部分的非 ASCII 字符,IDN 仅支持域部分(“@”符号后)。

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

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

import java.net.IDN;


public class IDNMailHelper 

    public static String toIdnAddress(String mail) 
        if (mail == null) 
            return null;
        
        int idx = mail.indexOf('@');
        if (idx < 0) 
            return mail;
        
        return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx));
    

    private static String localPart(String mail, int idx) 
        return mail.substring(0, idx);
    

    private static String domain(String mail, int idx) 
        return mail.substring(idx + 1);
    


【讨论】:

【参考方案2】:

Java Mail 不支持 i18n 域名,因此您必须使用标准规则使用 the IDNA rules 对其进行转义。

【讨论】:

谢谢。我正在使用 java.net.IDN.toASCII() 来执行此操作。 应该将规则仅应用于域部分还是应用于整个电子邮件地址? 有趣的问题; RFC 说“@ 右侧的部分”,但我看不出这是否意味着您不允许在名称部分使用 unicode,或者这将被忽略。我的直觉告诉我:电子邮件地址中只有 ASCII,所以你应该对两者都进行编码。也许这有帮助,但它仍然是一个草稿:tools.ietf.org/html/draft-teint-xidna-email-00【参考方案3】:

我确实使用 Java 7、javax.mail 1.4(来自 Maven 存储库)运行了它。 它起作用了

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

-------------------------------------------------------
 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

【讨论】:

哪个 JDK?这里只有第一次运行。当然,toString() 的合同只返回 ASCII 是不兑现的。【参考方案4】:

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

https://java.net/projects/javamail/forums/forum/topics/81613-Does-JavaMail-support-Internationalized-Domain-Names-IDN-

它仍在开发中,您可以试用快照版本。还要添加 JVM 参数

-Dmail.mime.allowutf8=true 

【讨论】:

以上是关于JavaMail:“域包含字符串中的控件或空格”错误消息,因为域包含丹麦字符的主要内容,如果未能解决你的问题,请参考以下文章

spring管理javamail发邮件时我把MyEclipse里的activation和那个mail包删了,可以发邮件,但是action又报错

JavaMail:利用JavaMail发送复杂邮件

JavaMail 读取消息

JavaMail| JavaMail配置属性

JavaMail发送简单邮件

在android开发中如何使用JavaMail程序