域包含字符串中的非法字符 - Java Mail

时间:2015-09-29 09:29:50

标签: java javamail

在我们的应用程序中,我们使用java邮件发送电子邮件。一切都运行良好,直到一个新的要求来发送一个电子邮件到一个ID的形式 testUser@em_company.com(导致JavaMail抛出异常的部分是电子邮件地址在域名中包含_的事实。(em_company.com)。

在我们的代码中,我正在初始化InternetAddress,如:

  //harding coding toAddress for simplicity
 String toAddress = "testUser@em_company.com";
 InternetAddress address = new InternetAddress(toAddress);

查看代码(Java Mail 1.4.4)后

课程:InternetAddress

方法:private static void checkAddress(String addr, boolean routeAddr, boolean validate) throws AddressException

我看到一个导致此异常的检查:

  if (!(Character.isLetterOrDigit(c) || c == '-' || c == '.'))
        throw new AddressException(
                "Domain contains illegal character", addr);

所以问题是,有没有办法可以绕过这个检查 并要求java Mail不要对域名进行验证检查。

3 个答案:

答案 0 :(得分:2)

这有点奇怪的要求......域名通常只包含字母,数字,短划线或点字符(请参阅here)。

无论如何,InternetAddress类有二级构造函数,它接受第二个布尔参数strict,它强制执行RFC822语法。但它始终使用检查调用第一个构造函数,因此它无法按预期工作。

InternetAddress address = new InternetAddress("testUser@em_company.com", false);

// from API sources:
public InternetAddress(String address, boolean strict) throws AddressException {
   this(address); // THIS CAUSES EXCEPTION ANYWAY
   if (strict) {
      if (isGroup())
         getGroup(true);    // throw away the result
      else
        checkAddress(this.address, true, true);
   }
}

因此,代码调查之后我想到的唯一解决方案就是这个,但你必须尝试一下:

InternetAddress address = new InternetAddress();
address.setAddress("testUser@em_company.com");

不幸的是,使用此代码会丢失InternetAddress的所有解析逻辑。但是,如果您只想使用此类来符合Java Mail API,那么这可能是最佳选择。

答案 1 :(得分:0)

您也可以尝试: -

String addressString="ars.kov@gmail.com";
String personalString="??????? ?????????";
InternetAddress address=new InternetAddress(addressString,personalString,"UTF-8");

答案 2 :(得分:0)

我遇到了同样的问题,我正在使用postman Post电话:

我将参数设置为key = recipient value ='abc@gmail.com'

从值中删除单引号后,它开始工作。 例如value=abc@gmail.com