我有一个持续运行的 Java 程序,它需要在遇到问题时发送电子邮件。但是,它使用的邮件服务器在尝试发送电子邮件时可能已关闭。
确保在邮件服务器恢复正常时发送电子邮件的最佳方法是什么?
我有一个持续运行的 Java 程序,它需要在遇到问题时发送电子邮件。但是,它使用的邮件服务器在尝试发送电子邮件时可能已关闭。
确保在邮件服务器恢复正常时发送电子邮件的最佳方法是什么?
排队请求。有一个单独的线程,它只是等待某些东西进入队列,然后尝试通过电子邮件发送它。如果失败,它会等待几个小时,然后重试。一旦它发送了一条消息,它就会返回队列以获取下一条消息。
发送失败时将电子邮件对象放入堆栈或列表中,当电子邮件服务器恢复时,将每封电子邮件弹出直到它为空。
您可能希望将电子邮件保存在一个文件中,也许是一个 xml 文件,以便应用程序崩溃时您不会丢失此信息。
该文件在应用程序启动时加载,并将所有内容保存在内存中,因此当有待处理的电子邮件时,它会每隔 5 分钟左右检查一次,然后,当它发送每封电子邮件时,它将重新保存 xml 文件,所以应该它在发送 10 封电子邮件中的 3 封电子邮件后崩溃,它在启动时不会重新发送这三封电子邮件。
但是,您如何处理它实际上将取决于如何处理错误条件的规范。
如果您从“将所有内容转发到始终存在的这个 SMTP 服务器”到需要处理通常由完整 SMTP 服务器处理的各种条件的情况,例如稍后重试,如果连接关闭则重新传输,使用 MX-hosts他们声明的顺序和类似的,您可能需要考虑在您的客户端中简单地使用一个 SMTP 服务器(但一个不接受传入连接的服务器),因为这会将所有脏逻辑从您的应用程序中移开。
我相信 James 电子邮件服务器 - http://james.apache.org/ - 很容易嵌入,但我还没有真正尝试过。
使用 James 的建议是一个很好的建议,但我过去曾遇到过一些问题,即 James 有点不稳定,需要重新启动。
您可以使用 Quartz 之类的东西让调度程序检查需要发送的消息。如果无法发送消息(例如 smtp 服务器不可用),则重新安排该消息以稍后发送。您可以为每条消息设置一个任务,也可以设置一个持久任务来检查消息和可用的邮件服务器,然后发送消息。持久性任务将为您提供电子邮件批处理。
如果您在 Unix/Linux 世界中,请考虑使用 发送警报的替代方法syslog
,并在该端处理电子邮件的生成。例如,nsyslogd 有一个名为ommail的模块,用于在本地生成电子邮件。
IIRC,有用于 log4j 之类的适配器,它们可以在 Java 和 syslog 世界之间架起一座桥梁,只需最少(零?)编码。
Apache James - http://james.apache.org/将让您将自己的邮件服务器作为代理运行,不仅如此,而且是用 100% java 编写的,因此您可以弄清楚它在做什么,作为额外的奖励 James使用数据库对邮件进行排队,因此您甚至可以通过插入数据库将邮件直接注入队列,然后将发送邮件的整个业务留给 James。