3

这是我的场景:

  1. 使用邮件构造所需的一堆参数调用一些电子邮件发送 bean。
  2. 它创建 MultiPartEmail 并将其排队等待发送,这是由后台的单独线程完成的,调用者不在乎它是否已发送。
  3. 传递线程拿起排队的电子邮件实例并执行 email.send() - 所以它就走了。
  4. 当投递失败时,bean 会每 5 分钟尝试重发邮件 3 次,然后放弃。

问题:

我不知道如何处理#4。我手头的是以前构造的 MultiPartEmail 实例,但未能发送。显然再次做 email.send() 会抛出这个:

java.lang.IllegalStateException: MimeMessage 已经构建。

有没有办法重置这种非法状态,以便可以重新使用消息。我真的没有办法从头开始创建新实例 - 调用者早已不复存在,如果无法使用已经构建的对象,它会使整个机制变得非常丑陋。我想我在这里遗漏了一些非常简单的东西..

4

1 回答 1

9

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

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

  • 构建MimeMessage()
  • 发送MimeMessage()

sendMimeMessage()可以多次调用,例如重试发送场景。问题是buildMimeMessage()只能调用一次。当您依赖send()Email类的方法时,您会得到原始发布者发现的异常。

解决方案是使用我刚才提到的两种方法,当您的Email对象是MultiPartEmail. 您显式调用buildMimeMessage()一次,然后调用sendMimeMessage()一次或多次。

于 2014-04-03T17:22:22.763 回答