【问题标题】:Re-sending MultiPartEmail with apache commons mail使用 apache commons 邮件重新发送 MultiPartEmail
【发布时间】:2013-05-27 02:46:01
【问题描述】:

这是我的场景:

  1. 某些电子邮件发送 bean 被调用,并带有一组邮件构造所需的参数。
  2. 它创建 MultiPartEmail 并将其排队等待发送,这是由后台的单独线程完成的,调用者不关心它是否已发送。
  3. 投递线程获取队列中的电子邮件实例并执行 email.send() - 所以它就结束了。
  4. 投递失败时,bean 会每 5 分钟尝试重发邮件 3 次,然后放弃。

问题:

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

java.lang.IllegalStateException:MimeMessage 已构建。

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

【问题讨论】:

  • 请否决投票者详细说明?

标签: java email apache-commons


【解决方案1】:

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

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

  • buildMimeMessage()
  • sendMimeMessage()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-10-16
    • 2012-12-11
    • 2018-09-22
    相关资源
    最近更新 更多