我的应用程序负责用户注册(可选择接收电子邮件通知),并可轻松处理给定用户的实际基于模板的电子邮件呈现。 JavaMail提供邮件传输层。但是,我应该如何在业务对象(例如用户)和邮件传输之间设计应用程序层?
直接的方法是一个简单的同步循环:遍历用户,对电子邮件进行排队,并完成它。 “队列”可能意味着将它们直接发送到MTA(邮件服务器),或者发送到内存队列以供另一个线程使用。
然而,我还计划实施一些功能,例如限制电子邮件的速率,处理退回的电子邮件(NDR)以及跨应用程序重新启动维护状态。我的直觉是,良好的设计会尽可能地将其与业务层和邮件传输层分离。我想知道其他人之前是否已经解决了这个问题,但经过多次搜索后我还没有找到任何适合这个问题的Java库。 James或列表服务器等独立邮件应用程序的范围太大;像Spring's MailSender或Commons Email这样的包的范围太小(基本上是JavaMail的替代品)。对于其他语言,我也没有发现任何合适的东西。
我很好奇其他开发人员如何将批量邮件添加到他们的应用程序中。
答案 0 :(得分:2)
我最开心的方法是为我的应用程序提供一个“发送”邮件的界面。实际上,此接口的实现只是将邮件排入数据库以便以后处理。从应用程序的角度来看,此接口是 fast ,因为它执行的实际工作很少。此外,正如您所提到的,持久性可以在服务器停机时间内存活下来。
另一个线程从队列中读取并发送邮件到它配置的限制时很愉快,并在成功处理它们之后标记队列中的消息(有效地将它们出列而不删除它们)。这提供了已发送邮件的历史记录,以及邮件退回时的引用等。我在成功发送后7天从队列中删除。
在将解决方案与邮件传输层解耦方面......我已将此方法应用于自动化Twitter客户端,并发现它同样成功。
答案 1 :(得分:0)
一种选择是使用硬件设备。我的公司使用Strongmail,至少用于营销传播:http://www.strongmail.com/index.php。我不太了解它,但我认为它处理批量电子邮件问题,如不联系列表,限制,避免过滤垃圾邮件等。