代码之家  ›  专栏  ›  技术社区  ›  Hank Jesus M C

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

  •  14
  • Hank Jesus M C  · 技术社区  · 16 年前

    显然,通过JavaMail发送JavaEE应用程序的电子邮件并不困难。我感兴趣的是 接收 电子邮件(大多是通知跳转)?我对基于IMAP/POP3的方法(轮询收件箱)不感兴趣-我的应用程序应 反应 发送到入站电子邮件。

    我能想到的一个办法是

    • 保留现有的MTA(在我的例子中是Linux上的postfix)->Ops团队已经知道如何配置/操作它
    • 对于每一个到达的邮件,生成一个Java应用程序,它接收数据并通过JMS发送。我可以通过/etc/aliases中的一个条目来实现,比如 myuser: "|/path/to/javahelper" 使用JavaHelp调用Java应用程序,然后传递STDIN。
    • MDB(Java EE应用程序的一部分)接收JMS消息,解析它,检测反弹消息并相应地采取行动。

    另一种方法可能是

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

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

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

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

    5 回复  |  直到 13 年前
        1
  •  8
  •   sleske    16 年前

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

    我相信轮询pop/imap服务器实际上是最干净的方法。你为什么决定反对?如果pop/imap服务器和您的服务位于同一个lan(甚至在同一台机器上),那么轮询将非常便宜。你可以每10-20秒做一次,这样就不会造成问题。虽然这在技术上看起来有点不雅观,但您将使用标准互操作协议(pop3/imap),该协议为您提供灵活性,同时避免重新实现邮件服务器。

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

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

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

    顺便说一下:第三种方法是以某种方式将传入的邮件作为文件转储到“传入”目录(许多邮件服务器可以这样做),然后轮询该目录。轮询目录比轮询服务器要便宜得多。注意同步问题(读半写的邮件,读同一邮件文件的几个并发读卡器…)

    我的经验:

    我使用这两种方法实现了系统(imap轮询和生成单独的进程)。轮询是一个相当大的Java应用程序,它处理人们发送给邮箱的数据;我没有遇到任何问题WRT轮询。生成方法是针对一个小的Perl脚本;我之所以这样做是因为它是一个简单的程序,每天只处理几封邮件,而且插入MailServer比用Perl执行IMAP要容易。

        2
  •  7
  •   Community Mohan Dere    9 年前

    根据JavaEE体系结构的“正确”方式是使用JCA连接器来完成与SMTP服务器的入站/出站连接。

    jca连接器可以做任何您想要的事情,包括线程和使用套接字连接到外部系统。实际上,jms只是一种特殊的jca连接器,它连接到jms代理并将消息传递到“常规”mdb。然后,jca连接器可以轮询smtp服务器并将消息传递到自定义mdb。

    关于jca最好的文档是 Creating Resource Adapters with J2EE Connector Architecture 1.5 ,它确实使用了电子邮件传递的示例。祝你好运:)我建议你看看。代码可以作为JavaEE示例的一部分被找到,并使用JavaMail,但我不知道它是否已经准备好了。

    相关:

        3
  •  4
  •   Community Mohan Dere    9 年前

    也许 SubEtha SMTP [编辑:现在从google代码重新定位到 GitHub ] 将是有趣的——它是一个Java库,允许您的应用程序接收SMTP邮件。我要试一试。

    这里有一个相关的堆栈溢出问题(有人建议使用subethasmp):
    What is the easiest way for a Java application to receive incoming email?

        4
  •  3
  •   Simone Gianni    14 年前

    阿帕奇·詹姆斯呢?

    它实现了所有的堆栈,并允许您使用类似于servlet的方法对收到的邮件做出反应;它是开源的,完全由apache许可(因此可以在商业产品中使用),并且已经经过多年的测试。

        5
  •  2
  •   Maciek Kreft    15 年前

    使用 ESB -独立的或嵌入的。

    “esb将与流相关的概念(如转换和路由)引入到面向服务的体系结构中。esb还可以为端点提供抽象。这提高了传输层的灵活性,并使服务之间的松散耦合和轻松连接成为可能。”

    例如 骡子 “mule esb是使用最广泛的开源esb。Mule ESB是一个轻量级集成平台和服务容器,它为Web服务、消息路由、中介、转换和事务管理提供了功能,帮助开发人员在数小时内而不是数周内集成其应用程序。”

    如何通过mule接收电子邮件 http://books.dzone.com/articles/mule-messaging-chapter?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fsoa+(SOA+Zone)

    下面是一个简单的配置,它发送jms消息作为对接收到的消息的响应(这是您所需要的全部)-定义入站(imap/pop3/etc)-定义出站。

    <imap:inbound-endpoint user="bob" password="password" host="localhost" port="65433" checkFrequency="3000"/> 
    <jms:outbound-endpoint queue="my.destination" connector-ref="jmsQueueConnector"/>