使用apache commons mail重新发送MultiPartEmail

时间:2013-05-31 09:54:14

标签: java email apache-commons

这是我的方案:

  1. 通过邮件构建所需的一堆参数调用一些电子邮件发送bean。
  2. 它创建MultiPartEmail并将其排队等待发送,这是由后台的单独线程完成的,调用者不关心它是否已发送。
  3. 传递线程获取排队的电子邮件实例并执行email.send() - 所以关闭它。
  4. 当交付失败时,bean会尝试每5分钟重新发送一次邮件三次,然后放弃。
  5. 问题:

    我无法弄清楚如何处理#4。我手头上已经构建的MultiPartEmail实例无法发送。显然,再次执行email.send()会抛出这个:

    java.lang.IllegalStateException:已构建MimeMessage。

    是否有办法重置此非法状态,以便可以重复使用该消息。我真的没有从头开始创建新实例的方法 - 调用者早已不复存在,并且它将使整个机制变得非常丑陋,而无法使用已经构建的对象。我想我在这里错过了一些非常简单的东西......

1 个答案:

答案 0 :(得分:6)

我认为这是一个老问题,但我遇到了同样的问题,我找到了解决方案。

当您创建MultiPartEmail(或HtmlEmail)的实例,设置其属性,然后调用send()方法时,该对象将在内部调用以下方法:

  • buildMimeMessage()
  • sendMimeMessage()

可以多次调用sendMimeMessage(),例如send-with-retry场景。问题是buildMimeMessage()只能被调用一次。当您依赖基础send()类的Email方法时,您将获得原始海报找到的例外。

解决方案是在Email对象为MultiPartEmail时使用我刚才提到的两种方法。您明确调用buildMimeMessage()一次,然后调用sendMimeMessage()一次或多次。