Han*_*ank 14 java email smtp java-ee ejb-3.0
显然,通过JavaMail从Java EE应用程序发送电子邮件并不困难.我感兴趣的是接收电子邮件的最佳模式(主要是通知退回)?我对基于IMAP/POP3的方法(轮询收件箱)不感兴趣 - 我的应用程序将对入站电子邮件做出反应.
我能想到的一种方法是
myuser: "|/path/to/javahelper"javahelper调用Java应用程序,传递STDIN.另一种方法可能是
myuser(通过过滤器)到Java EE应用程序容器端口25.我之前做过的第一种方法(虽然使用不同的语言/设置).
从性能和(感知)清洁度的角度来看,我认为第二种方法更好,但它需要我提供适当的SMTP传输实现.另外,我不知道是否可以将网络套接字连接到bean ...
你有什么建议?你有关于第二种方法的细节吗?
我不认为第二种方法是"更清洁".相反,它要求您实现标准MTA的重要部分,因此我建议不要使用它.
我相信轮询POP/IMAP服务器实际上是最干净的方法.你为什么决定反对呢?如果POP/IMAP服务器和您的服务在同一个局域网中(甚至在相同的机器上),则轮询将非常便宜.您可以每10-20秒进行一次最小延迟,这不会导致问题.虽然这在技术上可能看起来不太优雅,但您将使用标准的互操作协议(POP3/IMAP),它可以提供灵活性,同时避免重新实现邮件服务器.
产生Java应用程序的方法似乎也可行,但我更喜欢轮询,因为:
a)您使用的接口(POP3/IMAP)更加标准化,而用于"插入"邮件服务器的接口将是特定于服务器的(在Unix上,您可以使用例如procmail,但您仍然依赖于特定的软件)
b)每个邮件启动一个单独的进程可能比轮询更多的开销.
顺便说一句:第三种方法是以某种方式将传入的邮件作为文件转储到"传入"目录(许多邮件服务器可以执行此操作),然后轮询目录.轮询目录将比轮询服务器更便宜.只要注意同步问题(阅读半写邮件,阅读同一邮件文件的几个并发读者......)
我的经验:
我已经使用两种方法实现了系统(IMAP轮询,并产生一个单独的进程).轮询是针对一个相当大的Java应用程序,它处理人们发送到邮箱的数据; 轮询时我没有遇到任何问题.产卵方法是一个小的Perl脚本; 我只是这样做,因为它是一个简单的程序,每天只处理几个邮件,并且插入邮件服务器比在Perl中执行IMAP更容易.
根据Java EE体系结构,"正确"的方式是使用JCA连接器与SMTP服务器进行入站/出站连接.
JCA连接器可以做任何你想做的事情,包括线程和带有套接字的外部系统的连接.实际上,JMS只是一种特殊的JCA连接器,它连接到JMS代理并向"常规"MDB传递消息.然后,JCA连接器可以轮询SMTP服务器并将消息传递给自定义MDB.
关于JCA的最佳文档是使用J2EE Connector Architecture 1.5创建资源适配器,它确实使用了电子邮件传递的示例.好运:)我建议你看看它.代码可以作为Java EE示例的一部分找到并使用JavaMail,但我不知道它是否已准备就绪.
有关:
也许SubEtha SMTP [编辑:现已从 Google Code 迁移到GitHub ]会引起人们的兴趣——它是一个 Java 库,允许您的应用程序接收 SMTP 邮件。我正准备尝试一下。
这是一个有点相关的 Stack Overflow 问题(有人建议使用 SubEthaSMP):
Java 应用程序接收传入电子邮件的最简单方法是什么?