【问题标题】:Java: Send email to a Non-ASCII email addressJava:向非 ASCII 电子邮件地址发送电子邮件
【发布时间】:2017-03-01 04:28:29
【问题描述】:

我想向非 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);
    }

}

【问题讨论】:

    标签: java email internationalization java-8 jakarta-mail


    【解决方案1】:

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

    要启用此支持,您需要设置 JavaMail Session 属性 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");
    

    【讨论】:

    • 如果您有兴趣测试支持非 ASCII 标头的 JavaMail 版本,请通过 javamail_ww@oracle.com 与我联系。
    • 上述方法你试过了吗?是否要测试 JavaMail 的固定版本?
    • 我从未收到您的回复,所以我假设这对您来说并不重要。
    • @Adrian 你忘了接受比尔的回答。但由于您上次活动是在 3 年前,您可能停止使用 SO 或退休了......
    【解决方案2】:

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

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

    【讨论】:

    • 您能否详细说明我将如何使用 MimeUtility 类对非 ASCII 电子邮件地址进行编码?另外,什么保证我的电子邮件不会被其路由上的电子邮件服务器拒绝?
    【解决方案3】:

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

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

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

    【讨论】:

    • 6530 仍然是草稿,不是吗?
    • “PROPOSED STANDARD”和“Category: Standards track”暗示了别的东西。这是它应该如何实现的,我非常相信那里有支持这个扩展的 SMTP 服务器。
    猜你喜欢
    • 2014-07-20
    • 2013-01-24
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多