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

Adr*_*ian 18 java email jakarta-mail internationalization java-8

我想发送一封电子邮件到非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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Bil*_*non 5

Pawe\xc5\x82 基本上是正确的,如果您的服务器支持 SMTPUTF8 扩展,则地址应编码为 UTF-8。\nJavaMail 1.6 版本中支持 SMTPUTF8。

\n\n

要启用此支持,您需要将 JavaMail Session 属性\n 设置mail.mime.allowutf8true。请务必当邮件服务器支持 UTF-8 时才设置它。

\n\n

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

\n\n

例如:

\n\n
address = new String(address.getBytes("utf-8"), "iso-8859-1");\n
Run Code Online (Sandbox Code Playgroud)\n

  • 如果您有兴趣测试包含非 ASCII 标头支持的 JavaMail 版本,请通过 javamail_ww@oracle.com 与我联系。 (2认同)

Paw*_*yda 3

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

\n

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

\n
    \n
  • D\xc3\xb6rte@S\xc3\xb6rensen.de
  • \n
  • D\xc3\xb6\xd0\xb3t\xd0\xb5@S\xc3\xb6rensen.de
  • \n
\n