Java: Send email to a Non-ASCII email address

时间:2016-10-19 13:36:13

标签: java email internationalization java-8 javamail

I want to send an email to a Non-ASCII email address and I am not sure what is the recommended procedure using JDK8.

How should I deal with the following email addresses?

  1. Dörte@example.com
  2. test@Sörensen.de
  3. Dörte@Sörensen.de

Are there any security considerations to be aware of?

Would this sample code be enough?

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

}

3 个答案:

答案 0 :(得分:3)

如果您的服务器支持SMTPUTF8扩展名,Paweł基本上是正确的,地址应编码为UTF-8。 支持SMTPUTF8的是JavaMail 1.6版本。

要启用此支持,您需要设置JavaMail会话属性 mail.mime.allowutf8true。确保在邮件时设置它 服务器支持UTF-8。

对于旧版本的JavaMail, 一种可能的解决方法是将Java Unicode字符串转换为UTF-8编码的字节数组,然后创建Java Unicode字符串,其中每个字节都是一个单独的iso-8859-1字符。我没试过这个,所以我不知道它是否会遇到其他问题。

例如:

address = new String(address.getBytes("utf-8"), "iso-8859-1");

答案 1 :(得分:2)

由于RFC6530,您实际上应该将电子邮件编码为UTF-8。这意味着你不应该在这里使用IDN 如果您的外发SMTP服务器支持EAI(国际化电子邮件),那应该不是问题。

请记住,EAI可能会带来严重的安全风险。如果您决定处理您的应用程序(服务?),请务必阻止用户注册类似的电子邮件地址,即使用不同脚本的电子邮件地址。例如,其中一个人应该被拒绝:

  • Dörte@Sörensen.de
  • Döгtе@Sörensen.de

答案 2 :(得分:1)

对于电子邮件的标题,解决方法是RFC-2047,它定义了电子邮件中非ISO-646字符的特定编码协议。 Java Mail有一个使用它的类:MimeUtility。 Punicode / IDNS不适合使用标头。

正如此处的另一位回答者Bill Shannon在this answer中指出的那样,Java Mail通常会自动将MimeUtil应用于您的标题。至于关于干预邮件服务器的评论中的问题,我只回答你关于标题中文本的问题,没有什么会打扰的。至于实际将消息发送到正确位置所需的SMTP协议消息,我不会声称知道。