这是我的场景:
- 一些电子邮件发送 bean 使用邮件构建所需的一堆参数被调用。
- 它创建 MultiPartEmail 并将其排队等待发送,这是由后台的单独线程完成的,调用者不关心它是否已发送。
- 传送线程选取排队的电子邮件实例并执行 email.send() - 这样就可以了。
- 当发送失败时,bean 将尝试每 5 分钟重新发送邮件 3 次,然后放弃。
问题:
我不知道如何处理#4。我手头的是以前构造的 MultiPartEmail 实例,但发送失败。显然再次执行 email.send() 会抛出这个:
java.lang.IllegalStateException:MimeMessage 已构建。
有没有办法重置这个非法状态,以便可以重新使用消息。我真的没有办法从头开始创建新实例——调用者早已不在了,如果不能使用已经构建的对象,这将使整个机制变得非常丑陋。我想我在这里遗漏了一些非常简单的东西..
最佳答案
我看到这是一个老问题,但我刚遇到同样的问题,我找到了解决方案。
当您创建 MultiPartEmail
(或 HtmlEmail
)的实例时,设置其属性,然后调用 send()
方法,对象将在内部调用以下方法:
- buildMimeMessage()
- 发送MimeMessage()
可以多次调用 sendMimeMessage()
,例如重试发送场景。问题是 buildMimeMessage()
只能被调用一次。当您依赖 Email
基类的 send()
方法时,您会遇到原始发帖人发现的异常。
当您的 Email
对象是 MultiPartEmail
时,解决方案是使用我刚才提到的两种方法。您显式调用 buildMimeMessage()
一次,然后调用 sendMimeMessage()
一次或多次。
关于java - 使用 apache commons 邮件重新发送 MultiPartEmail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854579/