如何在EE6中使用JavaMail呢?

时间:2012-09-13 13:01:31

标签: java jpa-2.0 java-ee-6 javamail quartz-scheduler

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

  1. 使邮件以某种方式持久存在(保存在数据库中,通过JMS发送)
  2. 继续检查(使用调度程序从数据库或通过JMS获取)尚未成功发送的新邮件并尝试发送它们,当发生错误时,请稍后再试
  3. 希望没有人在没有充分理由的情况下使用的另一个选项是在业务逻辑中发送邮件并且可能导致事务失败(或者在重试为特定集合发送邮件时花费很长时间因为邮件无法发送。

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

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

    修改 要定义“正确的方法”,我想添加一些要求:

    • 邮件必须是持久的,可编辑的,可重新发送的
    • 根据某些标准,可以在特定时间发送邮件
    • 解决方案应该横向扩展

    EE6为EJB提供TimerService和Async操作。通过询问EE6环境的“正确方法”,我想知道如何使用/实现邮件以满足此类标准要求。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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