Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:将电子邮件发送到非ASCII电子邮件地址_Java_Email_Internationalization_Java 8_Jakarta Mail - Fatal编程技术网

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

Java:将电子邮件发送到非ASCII电子邮件地址,java,email,internationalization,java-8,jakarta-mail,Java,Email,Internationalization,Java 8,Jakarta Mail,我想向非ASCII电子邮件地址发送电子邮件,但我不确定使用JDK8的建议步骤 我应该如何处理以下电子邮件地址 德奥rte@example.com test@S奥伦森·德 德奥rte@S奥伦森·德 是否有任何安全注意事项需要注意 这个示例代码足够了吗 import java.net.IDN; public class IDNMailHelper { public static String toIdnAddress(String mail) { if (mail ==

我想向非ASCII电子邮件地址发送电子邮件,但我不确定使用JDK8的建议步骤

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

  • 德奥rte@example.com
  • test@S奥伦森·德
  • 德奥rte@S奥伦森·德
  • 是否有任何安全注意事项需要注意

    这个示例代码足够了吗

    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.net.IDN;
    公共类IDNMailHelper{
    公共静态字符串toIdnAddress(字符串邮件){
    if(mail==null){
    返回null;
    }
    int idx=mail.indexOf('@');
    if(idx<0){
    回信;
    }
    返回localPart(mail,idx)+“@”+IDN.toASCII(domain(mail,idx));
    }
    私有静态字符串localPart(字符串邮件,int-idx){
    return mail.substring(0,idx);
    }
    私有静态字符串域(字符串邮件,int-idx){
    返回邮件子字符串(idx+1);
    }
    }
    
    因为您实际上应该将电子邮件编码为UTF-8。这意味着您不应在此处使用IDN。
    如果您的发送SMTP服务器支持EAI(国际化电子邮件),这应该不会是一个问题

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

    • 德奥rte@S奥伦森·德
    • DöΓtö@Sörensen.de

    • 如果您的服务器支持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");
      

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


      正如另一位回答者Bill Shannon在中指出的那样,Java Mail通常会自动将MimeUtil应用于您的邮件头。至于评论中关于介入邮件服务器的一个问题,我只是回答你关于标题中文本的问题,没有什么麻烦。至于实际将邮件发送到正确位置所需的SMTP协议邮件,我并不声称知道。

      如果您对测试包含非ASCII头支持的JavaMail版本感兴趣,请通过JavaMail与我联系_ww@oracle.com.Did你能试试上面的吗?您想测试JavaMail的固定版本吗?我从未收到您的回复,所以我认为这对您来说并不重要。6530仍然是一个草案,不是吗?“建议的标准”和“类别:标准跟踪”建议了其他内容。这是它应该如何实现的,我非常确信有SMTP服务器支持此扩展。您能详细说明我将如何使用MimeUtility类对非ASCII电子邮件地址进行编码吗?此外,我有什么保证电子邮件不会被其路径上的电子邮件服务器拒绝?