2

我想知道其他人是如何做他们的邮件的,你对最佳实践有什么看法。当我考虑如何完成邮寄的事情时,我只能想到一种解决方案,可以通过不同的技术以不同的方式实现。

  1. 使邮件以某种方式持久化(保存在数据库中,通过 JMS 发送)
  2. 不断检查(使用调度程序从 DB 或通过 JMS 获取)尚未成功发送的新邮件并尝试发送它们,当发生错误时,稍后再试

希望没有人在没有充分理由的情况下使用的另一个选项是在业务逻辑中发送邮件,并可能导致事务失败(或在特定时间重试发送邮件时需要很长时间),因为邮件无法发送。

在另一个项目中,我看到了一个独立的邮件发件人应用程序,它不断查询数据库并根据当前时间等标准发送电子邮件。

那么您认为什么是好的解决方案,或者您在项目中实际使用了什么?我无法通过谷歌找到任何真实世界的例子,也许我搜索得不够,但如果是这样,请与我分享你的资源!

编辑 要定义“正确的方式”,我想添加一些要求:

  • 邮件必须是持久的、可编辑的、可重新发送的
  • 根据某些标准,邮件可以在特定时间发送
  • 解决方案应水平缩放

EE6 为 EJB 提供 TimerService 和异步操作。通过询问 EE6 环境的“正确方式”,我想知道应该如何使用/实施邮件来满足此类标准要求。

oracle 站点上有一些文章显示了@Async EJB 方法中邮件会话的用法,但这种用法听起来有些错误。我应该使用计时器服务重试发送邮件吗?我应该将邮件保存到数据库并使用间隔计时器来获取并尝试发送它们吗?我应该将邮件的发送移到应用程序之外吗?

我想知道其他人使用什么解决方案,并听取关于对于此类(希望不仅对我而言)常见要求可能是更好或更差的解决方案的意见。

4

2 回答 2

2

在我们的项目中,我们使用 Quartz 调度程序来运行作业。在作业被安排发送电子邮件之前,消息是组成的,电子邮件的不同部分(如主题、正文、收件人)存储在数据库中。当石英作业运行并且能够成功发送电子邮件时,消息的sent_flg 将被设置为SENT。如果失败,quartz 作业将在一段时间后使用相同的参数再次运行。在放弃之前,它肯定会尝试几次。还有一个屏幕,管理员可以在其中重新发送失败的消息,以防他想发送它。

于 2012-09-15T10:25:17.630 回答
1

一种选择是只安装一个MTA,可能专门用于此目的,例如用于 Linux 的 sendmail。我会让它在与我的 (Java) 应用程序相同的节点上运行。特别是如果在本地运行,该服务器应该“保证”可用。只需让应用程序服务器使用它作为 SMTP 服务器发送邮件。那时,它实际上是“即发即弃”,并且与 JMS 之类的东西一样好。正确配置的 MTA 将立即接受消息(允许 JVM 继续前进) - 并花时间在其自己的线程上尝试重新发送任何消息等。

这种方法唯一真正的缺点是,您将无法轻松地从 Java(不解析日志文件等)检查给定电子邮件的实际进度 - 但即便如此,电子邮件也无法得到保证,因为它可能被任何上游邮件服务器或接收客户端拒绝/丢弃。

于 2012-09-13T13:07:10.327 回答