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

Han*_*ank 14 java email smtp java-ee ejb-3.0

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

我能想到的一种方法是

  • 保留现有的MTA(在我的情况下在linux上使用postfix) - > ops团队已经知道如何配置/操作它
  • 对于到达的每个邮件,产生一个接收数据并通过JMS发送的Java应用程序.我可以通过/ etc/aliases中的条目来执行此操作,例如myuser: "|/path/to/javahelper"javahelper调用Java应用程序,传递STDIN.
  • MDB(Java EE应用程序的一部分)接收JMS消息,解析它,检测退回消息并相应地执行操作.

另一种方法可能是

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

我之前做过的第一种方法(虽然使用不同的语言/设置).

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

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

sle*_*ske 8

我不认为第二种方法是"更清洁".相反,它要求您实现标准MTA的重要部分,因此我建议不要使用它.

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

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

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

b)每个邮件启动一个单独的进程可能比轮询更多的开销.

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

我的经验:

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


ewe*_*nli 8

根据Java EE体系结构,"正确"的方式是使用JCA连接器与SMTP服务器进行入站/出站连接.

JCA连接器可以做任何你想做的事情,包括线程和带有套接字的外部系统的连接.实际上,JMS只是一种特殊的JCA连接器,它连接到JMS代理并向"常规"MDB传递消息.然后,JCA连接器可以轮询SMTP服务器并将消息传递给自定义MDB.

关于JCA的最佳文档是使用J2EE Con​​nector Architecture 1.5创建资源适配器,它确实使用了电子邮件传递的示例.好运:)我建议你看看它.代码可以作为Java EE示例的一部分找到并使用JavaMail,但我不知道它是否已准备就绪.

有关:


Kaj*_*nus 6

也许SubEtha SMTP [编辑:现已从 Google Code 迁移到GitHub ]会引起人们的兴趣——它是一个 Java 库,允许您的应用程序接收 SMTP 邮件。我正准备尝试一下。

这是一个有点相关的 Stack Overflow 问题(有人建议使用 SubEthaSMP):
Java 应用程序接收传入电子邮件的最简单方法是什么?