作者:--AppleChan-- | 来源:互联网 | 2023-10-09 23:33
这是我的情景:
>使用邮件构造所需的一堆参数调用一些电子邮件发送bean.
>它创建MultiPartEmail并将其排队等待发送,这是由后台的单独线程完成的,调用者不关心它是否已发送.
>传递线程获取排队的电子邮件实例并执行email.send() – 所以关闭它.
>当交付失败时,bean将尝试每5分钟重新发送邮件三次,然后放弃.
题:
我无法弄清楚如何处理#4.我手头上已经构建的MultiPartEmail实例无法发送.显然,再次执行email.send()会抛出这个:
java.lang.IllegalStateException:MimeMessage已经构建.
有没有办法重置这种非法状态,以便可以重复使用该消息.我真的没有从头开始创建新实例的方法 – 调用者早已不复存在,并且它将使整个机制变得非常丑陋,而无法使用已经构建的对象.我想我在这里错过了很简单的东西..
解决方法:
我看到这是一个老问题,但我遇到了同样的问题,我找到了解决方案.
当您创建MultiPartEmail(或HtmlEmail)的实例,设置其属性,然后调用send()方法时,该对象将在内部调用以下方法:
> buildMimeMessage()
> sendMimeMessage()
可以多次调用sendMimeMessage(),例如send-with-retry场景.问题是buildMimeMessage()只能被调用一次.当您依赖基本Email类的send()方法时,您将获得原始海报所发现的异常.
解决方案是使用我刚才提到的两种方法,当您的Email对象是MultiPartEmail时.您显式调用buildMimeMessage()一次,然后调用sendMimeMessage()一次或多次.