【问题标题】:Domain contains illegal character in string - Java Mail域在字符串中包含非法字符 - Java Mail
【发布时间】:2015-12-26 17:28:57
【问题描述】:

在我们的应用程序中,我们使用 java mail 来发送电子邮件。一切都很好,直到有新的要求来发送电子邮件到一个 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不要对域名进行验证检查。

【问题讨论】:

  • 也许Punycode 会解决你的问题。
  • 能不能用非严格的构造函数:InternetAddress address = new InternetAddress(toAddress, false);?
  • non-strict 在内部不起作用,它首先调用 this(address)。
  • @FrédéricHenri 该链接更多地说明了用户名及其编码,但我主要关心的是域名是否包含下划线。

标签: java jakarta-mail


【解决方案1】:

这有点奇怪...域名通常只包含字母、数字、破折号或点字符(请参阅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,这可能是要走的路。

【讨论】:

  • 谢谢你的工作。还必须设置 java 属性“mail.mime.address.strict”,false。谢谢你的时间:)
【解决方案2】:

你也可以试试这个:-

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我正在使用邮递员邮政电话:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2014-11-06
      • 2023-04-09
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多