Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaMail: "Domain contains control or whitespace in string" errormessage because of domain with Danish characters

Domains with special danish characters such as æ ø å are now allowed, but I can't force java mail to accept this.

    @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();
}

All of the tests fail in either the constructor of InternetAddress or in the validate() method. How can I handle these special danish characters in the domain. I bet that other countries have the same issue with their domains vs emails in javamail InternetAddress.

like image 532
Allan Avatar asked Mar 30 '11 08:03

Allan


2 Answers

Currently mail servers generally don't accept non-ASCII characters in the local part, only the domain part (following the '@' sign) is supported with IDN.

To encode only the domain part with the java.net.IDN class, i use the following Util.

(Code not tested in production, but it should work)

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);
    }

}
like image 195
felix Avatar answered Sep 30 '22 15:09

felix


Java Mail doesn't support i18n domain names, so you must use the standard rules to escape them using the IDNA rules.

like image 20
Aaron Digulla Avatar answered Sep 30 '22 17:09

Aaron Digulla