如何在 Java EE 应用程序中接收电子邮件

2022-09-03 12:38:43

显然,通过JavaMail从Java EE应用程序发送电子邮件并不困难。我感兴趣的是接收电子邮件的最佳模式(主要是通知退回邮件)?我对基于 IMAP/POP3 的方法(轮询收件箱)不感兴趣 - 我的应用程序应对入站电子邮件做出反应

我能想到的一种方法是

  • 保留现有的MTA(在我的情况下,linux上的后缀) - >运维团队已经知道如何配置/操作它
  • 对于到达的每封邮件,生成一个 Java 应用程序,该应用程序接收数据并通过 JMS 将其发送出去。我可以通过/etc/aliases中的条目来做到这一点,就像javahelper调用Java应用程序一样,传递STDIN。myuser: "|/path/to/javahelper"
  • MDB(Java EE 应用程序的一部分)接收 JMS 消息,对其进行解析,检测退回消息并采取相应的操作。

另一种方法可能是

  • 在 Java EE 应用程序容器上的端口 25 上打开侦听网络套接字。
  • 将会话 Bean 与套接字关联。Bean 是 Java EE 应用程序的一部分,可以直接解析/检测退回邮件/处理消息。
  • 将现有 MTA 保留为入站中继,执行其所有安全/垃圾邮件过滤,但将电子邮件转发到(传递过滤器)到 Java EE 应用程序容器端口 25。myuser

我以前做过的第一种方法(尽管使用不同的语言/设置)。

从性能和(感知到的)清洁度的角度来看,我认为第二种方法更好,但它需要我提供适当的SMTP传输实现。另外,我不知道是否有可能将网络套接字与豆子连接...

您的建议是什么?你有关于第二种方法的细节吗?


答案 1

我不认为第二种方法是“更干净”。相反,它要求您实现标准MTA的重要部分,因此我建议不要这样做。

我相信轮询POP / IMAP服务器实际上是执行此操作的最干净的方法。你为什么决定反对它?如果 POP/IMAP 服务器和您的服务位于同一 LAN 中(甚至在同一台机器上),则轮询将非常便宜。您可以每10-20秒进行一次,以获得最小的延迟,这应该不会引起问题。虽然这在技术上可能看起来有点不优雅,但您将使用标准的互操作协议(POP3 / IMAP),这为您提供了灵活性,同时避免了重新实现邮件服务器。

生成Java应用程序的方法似乎也是可行的,但我更喜欢轮询,因为:

a)您使用的接口(POP3 / IMAP)更加标准化,而您用于“插入”邮件服务器的接口将是特定于服务器的(在Unix上,您可以使用例如procmail,但您仍然依赖于特定的软件)

b) 每封邮件启动单独的进程可能比轮询开销大得多。

顺便说一句:第三种方法是以某种方式将传入邮件作为文件转储到“传入”目录中(许多邮件服务器可以执行此操作),然后轮询目录。轮询目录甚至比轮询服务器更便宜。请注意同步问题(读取半写邮件,多个并发读取器读取同一邮件文件...

我的经验:

我已经使用这两种方法(IMAP轮询和生成单独的进程)实现了系统。轮询是针对一个相当大的Java应用程序,该应用程序处理人们发送到邮箱的数据;我没有遇到任何问题 wrt 轮询.生成方法是针对一个小的Perl脚本;我只是这样做,因为它是一个简单的程序,每天只处理几封邮件,并且插入邮件服务器比在Perl中做IMAP更容易。


答案 2

根据Java EE架构,“正确”的方法是使用JCA连接器与SMTP服务器进行入站/出站连接。

JCA 连接器可以执行任何您想做的事情,包括螺纹连接和使用套接字连接到外部系统。实际上,JMS只是一种特殊的JCA连接器,它连接到JMS代理并将消息传递到“常规”MDB。然后,JCA 连接器可以轮询 SMTP 服务器并将消息传递到自定义 MDB。

关于 JCA 的最佳文档是使用 J2EE 连接器体系结构 1.5 创建资源适配器,它实际上使用了电子邮件传递的示例。运气你:)我建议你看看它。该代码可以作为Java EE示例的一部分找到,并使用JavaMail,但我不知道它是否已经投入生产。

相关:


推荐