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

22

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

}
3个回答

5
Paweł的观点基本正确,如果您的服务器支持SMTPUTF8扩展,则应将地址编码为UTF-8。 在JavaMail 1.6版本中支持SMTPUTF8。
要启用此支持,您需要将JavaMail会话属性mail.mime.allowutf8设置为true。请确保仅在邮件服务器支持UTF-8时设置它。
对于旧版本的JavaMail,可能的解决方法涉及将Java Unicode字符串转换为UTF-8编码的字节数组,然后创建一个Java Unicode字符串,其中每个字节都是单独的iso-8859-1字符。我没有尝试过这样做,因此不知道是否会遇到其他问题。
例如:
address = new String(address.getBytes("utf-8"), "iso-8859-1");

2
如果您有兴趣测试支持非ASCII标题的JavaMail版本,请通过javamail_ww@oracle.com与我联系。 - Bill Shannon
你尝试过上述方法吗?你想测试一个修复后的JavaMail版本吗? - Bill Shannon
我从未收到你的回复,所以我认为这对你来说并不重要。 - Bill Shannon
@Adrian 你忘记采纳Bill的答案了。但是,由于你上次活动是3年前,你可能已经停止使用SO或退休了... - Lonzak

3
由于 RFC6530 规定,您应该将电子邮件编码为UTF-8。这意味着您不应在此处使用IDN。
如果您的发件SMTP服务器支持EAI(国际化电子邮件),那就不是问题。
请记住,EAI可能会带来严重的安全风险。如果您决定在您的应用程序(服务?)中处理它,请确保防止用户注册类似的电子邮件地址,即使用不同脚本的电子邮件地址。例如,其中一个应该被拒绝:
  • Dörte@Sörensen.de
  • Döгtе@Sörensen.de

6530 还是草稿,是吗? - bmargulies
"拟议标准"和"类别:标准轨道"暗示了其他内容。这是它应该被实现的方式,我相信有一些SMTP服务器支持这个扩展。 - Paweł Dyda

1
对于电子邮件的标题,解决方案是 RFC-2047,它为电子邮件中的非 ISO-646 字符定义了特定的编码协议。Java Mail 有一个用于使用此协议的类:MimeUtility。Punicode/IDNS 不适合用于标题。如 Bill Shannon 在 this answer 中指出的那样,Java Mail 通常会自动将 MimeUtil 应用于您的标题。至于评论中关于干预邮件服务器的问题,我只回答您关于标题文本的问题,没有什么会影响它。至于实际将消息发送到正确位置所需的 SMTP 协议消息,我不敢说我知道。

你能详细说明一下我如何使用MimeUtility类来编码非ASCII的电子邮件地址吗?另外,我如何确保这封电子邮件在传输过程中不会被邮件服务器拒收? - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接