Java:将电子邮件发送到非 ASCII 电子邮件地址

我想向非 ASCII 电子邮件地址发送电子邮件,但我不确定使用 JDK8 的推荐过程是什么。

我应该如何处理以下电子邮件地址?

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

是否有任何需要注意的安全注意事项?

此示例代码就足够了吗?

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

}

答案 1

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

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

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

例如:

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

答案 2

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

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

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

推荐