views:

342

answers:

2

I am writing a piece of Java code that needs to send mail to users with non-ASCII names. I have figured out how to use UTF-8 for the body, subject line, and generic headers, but I am still stuck on the recipients.

Here's what I'd like in the "To:" field: "ウィキペディアにようこそ" <[email protected]>. This lives (for our purposes today) in a String called recip.

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip) gives "忙俾ェ▎S]" <[email protected]>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B")) throws AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

How the heck am I supposed to send this message?


Here's how I handled the other components:

  • Body HTML: msg.setText(body, "UTF-8", "html");
  • Headers: msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));
  • Subject: msg.setSubject(subject, "utf-8");
+3  A: 

Ugh, got it using a stupid hack:

/**
 * Parses addresses and re-encodes them in a way that won't cause {@link MimeMessage}
 * to freak out. This appears to be the only robust way of sending mail to recipients
 * with non-ASCII names. 
 * 
 * @param addresses  The usual comma-delimited list of email addresses.
 */
InternetAddress[] unicodifyAddresses(String addresses) throws AddressException {
    InternetAddress[] recips = InternetAddress.parse(addresses, false);
    for(int i=0; i<recips.length; i++) {
        try {
            recips[i] = new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8");
        } catch(UnsupportedEncodingException uee) {
            throw new RuntimeException("utf-8 not valid encoding?", uee);
        }
    }
    return recips;
}

I hope this is useful to somebody.

phyzome
A: 

Can you post your code to do UTF-8 for the body, subject line, and generic headers as well ?

trix
Sure, I've updated the post.
phyzome