2016-10-19 153 views
15

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

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

  1. [email protected]
  2. [email protected]örensen.de
  3. [email protected]ö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); 
    } 

} 

回答

2

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

请记住,EAI可能会造成严重的安全风险。如果您决定处理您的应用程序(服务?),请务必防止用户注册类似的电子邮件地址,即使用不同脚本的电子邮件地址。例如,这些球员之一,应予以拒绝:

+0

6530仍然是草稿,不是? – bmargulies

+0

“建议标准”和“类别:标准跟踪”建议了其他内容。它是如何实现的,我相信有支持这种扩展的SMTP服务器。 –

3

帕维尔基本上是正确的地址应该被编码为UTF-8如果你的服务器支持这个功能,但比这更复杂,因为目前JavaMail不支持允许使用UTF-8标头的服务器扩展。

可能的解决方法包括将Java Unicode字符串转换为UTF-8编码的字节数组,然后创建一个Java Unicode字符串,其中每个字节都是一个单独的iso-8859-1字符。我没有尝试过,因此我不知道它是否会遇到其他问题,但是如果没有JavaMail本身的必要支持,这可能是您最大的希望。

例如:

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

如果您有兴趣测试包含对非ASCII标头支持的JavaMail版本,请通过[email protected]与我联系。 –

+0

您是否尝试过上述方法?你想测试一个固定版本的JavaMail吗? –

+0

我从来没有收到过你的回复,所以我认为这对你来说并不重要。 –

1

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

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

+0

您能否详细说明我将如何使用MimeUtility类来编码非ASCII电子邮件地址?另外,有什么保证我有电子邮件不会被它的路线上的电子邮件服务器拒绝? – Adrian

相关问题