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:
msg.setText(body, "UTF-8", "html");
msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));
msg.setSubject(subject, "utf-8");
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With