java - 使用 apache commons 邮件重新发送 MultiPartEmail

标签 java email apache-commons

这是我的场景:

  1. 一些电子邮件发送 bean 使用邮件构建所需的一堆参数被调用。
  2. 它创建 MultiPartEmail 并将其排队等待发送,这是由后台的单独线程完成的,调用者不关心它是否已发送。
  3. 传送线程选取排队的电子邮件实例并执行 email.send() - 这样就可以了。
  4. 当发送失败时,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/

相关文章:

java - 没有主键和可为空字段的 Hibernate 实体

java - 我的 JScrollPane 滚动到我的 JTable 的倒数第二行,而不是最后一行

email - 如何在 Go 中解码邮件正文

java - 是否有用于创建具有指定大小和内容的列表的实用方法?

java - 广度优先搜索移动点游戏

java - 如何拦截Hibernate生成的SQL?

android - 通过 Android 应用程序发送邮件

Python 解决方案允许通过电子邮件将照片上传到我的 Django 网站

使用套接字的 Android 代理

java - 用于打印 javax.servlet.http.Cookie 所有字段的任何实用程序