diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index f4b536bc50..afa9d922ac 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -49,6 +49,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.net.IDN; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; @@ -187,13 +188,13 @@ public class MessageHelper { } if (message.to != null && message.to.length > 0) - imessage.setRecipients(Message.RecipientType.TO, message.to); + imessage.setRecipients(Message.RecipientType.TO, convertAddress(message.to)); if (message.cc != null && message.cc.length > 0) - imessage.setRecipients(Message.RecipientType.CC, message.cc); + imessage.setRecipients(Message.RecipientType.CC, convertAddress(message.cc)); if (message.bcc != null && message.bcc.length > 0) - imessage.setRecipients(Message.RecipientType.BCC, message.bcc); + imessage.setRecipients(Message.RecipientType.BCC, convertAddress(message.bcc)); if (message.subject != null) imessage.setSubject(message.subject); @@ -202,7 +203,7 @@ public class MessageHelper { if (identity != null) { // Add reply to if (identity.replyto != null) - imessage.setReplyTo(InternetAddress.parse(identity.replyto)); + imessage.setReplyTo(convertAddress(InternetAddress.parse(identity.replyto))); // Add extra cc if (identity.cc != null) @@ -465,7 +466,7 @@ public class MessageHelper { result.addAll(Arrays.asList(existing)); Address[] all = imessage.getAllRecipients(); - Address[] addresses = InternetAddress.parse(email); + Address[] addresses = convertAddress(InternetAddress.parse(email)); for (Address address : addresses) { boolean found = false; if (all != null) @@ -481,6 +482,36 @@ public class MessageHelper { imessage.setRecipients(type, result.toArray(new Address[0])); } + private static Address[] convertAddress(Address[] addresses) { + // https://en.wikipedia.org/wiki/International_email + for (Address address : addresses) { + String email = ((InternetAddress) address).getAddress(); + int at = email.indexOf('@'); + if (at > 0) { + String user = email.substring(0, at); + String domain = email.substring(at + 1); + + try { + user = IDN.toASCII(user); + } catch (IllegalArgumentException ex) { + Log.e(ex); + } + + String[] parts = domain.split("\\."); + for (int p = 0; p < parts.length; p++) + try { + parts[p] = IDN.toASCII(parts[p]); + } catch (IllegalArgumentException ex) { + Log.e(ex); + } + + email = user + '@' + TextUtils.join(".", parts); + } + ((InternetAddress) address).setAddress(email); + } + return addresses; + } + static void build(Context context, EntityMessage message, List attachments, EntityIdentity identity, boolean send, MimeMessage imessage) throws IOException, MessagingException { if (message.receipt != null && message.receipt) { // https://www.ietf.org/rfc/rfc3798.txt