用Java自动处理电子邮件
刚从老板那里收到我正在处理的应用程序的请求。基本上,我们为外部客户端提供了一个电子邮件地址设置,以便向其提交excel文件。
我需要的是一种自动提取发送到该地址的电子邮件的方法,因此我可以提取附件,对其进行处理并将其保存到文件夹中。
甚至从何处开始的任何信息都将有所帮助。\
注意:我们正在使用Lotus Notes服务器来执行此操作,但是一种通用方法会更有帮助(如果可能)。
解决方案
回答
电子邮件->邮件服务器-> [某物]->磁盘上的文件。
磁盘上的文件很容易解析,请使用JavaMail。
[内容]可能是:
- smtp连接的侦听器(过度杀伤力)!
- Pop3 / imap客户端
- Maildir /邮箱
回答
Lotus Notes / Domino将邮件存储在Notes数据库中。有一些API可用于获取文档(电子邮件),读取字段值("发件人","主题")和分离文件。
API包括
-LotusScript(VB变体,在Notes数据库中可用)
-Java(从数据库内部或者外部)
-C API(外部)
-通过COM服务器可以使用相同的API
我们可以在数据库中创建"预定代理"(使用LotusScript或者Java),该代理可以查找自上次运行以来创建的文档,找到附件并提取它们。代理将需要使用在服务器上具有适当权限的ID进行签名,包括写入文件系统和启动任何其他进程所需的ID。
在数据库外部,我们可以使用除LotusScript之外的任何API登录到服务器/邮件数据库,并遵循类似的过程,例如在客户端或者单独的服务器上本地提取文件。 C API和COM需要Notes客户端安装,但是可以将Java应用程序设置为通过CORBA / DIIOP运行,而无需完整安装。
有关更多信息,请查阅Domino Designer帮助(或者有关C API的IBM网站)。
对于执行此操作的"通用方法",如果我们要访问Notes中的数据并需要提取附件,那么我相信这些API是最佳选择。如果我们打算将应用程序移植到另一个邮件系统,请考虑通过"接口"将API例程解耦,因此我们只需添加该接口的新实现即可支持新的邮件系统。
回答
我们可以使用DIIOP相对轻松地访问Notes文档,这比走C API道路要容易得多...
回答
我最近在Domino服务器上使用Java代理做了很多工作。 Domino 8.5服务器支持Java 6及其嵌入式程序,因此不需要有一点Domino开发经验的人就可以组建一个在收到新邮件时运行的代理。在LotusScript中,它甚至更容易,但是需要更多专业技能,我们可能需要聘请承包商才能提供。
我们可能遇到的限制涉及提取的文件,我们可以轻松地将其放置在Domino服务器的文件结构上,但是由于操作系统安全性的限制,我们可能无法将其放置在其他服务器上。
回答
尝试使用Net Commons软件包中的POP3Client;它会让Java程序以我们想要的任意间隔(每隔几分钟?每小时一次)检查特定帐户的新邮件,并根据需要获取/删除邮件。
回答
使用数据库中的邮件(Domino管理员可以为我们设置邮件,但它也位于帮助文件中)。
在该数据库中,我们可以创建一个代理,该代理会定期运行以处理所有新文档。该代理将使用NotesRichTextItem类的EmbeddedObjects属性和NotesEmbeddedObject类的ExtractFile方法来获取文件附件的句柄并将其解压缩到我们指定的位置。
例如,此脚本遍历文档的"正文"项目中的所有文件附件,对象链接和嵌入式对象。每次找到文件附件时,它将文件分离到C驱动器上的SAMPLES目录,并从文档中删除附件
Dim doc As NotesDocument Dim rtitem As Variant '...set value of doc... Set rtitem = doc.GetFirstItem( "Body" ) If ( rtitem.Type = RICHTEXT ) Then Forall o In rtitem.EmbeddedObjects If ( o.Type = EMBED_ATTACHMENT ) Then Call o.ExtractFile( "c:\samples\" & o.Source ) Call o.Remove Call doc.Save( False, True ) End If End Forall End If
回答
可以在Domino服务器上启用SMTP / POP3. 以前使用过它,并获得了Squirrel Mail运行它。 SMTP占用一些资源,但是值得付出努力,因为这样我们就不必进入LotusLand即可正常工作。只需编写一个小型Java CLI程序即可检查特定的电子邮件框(POP3或者SMTP),并解析消息,提取附件并将其放在需要的地方。
这里有大量的文档和示例:
http://java.sun.com/products/javamail/
我们采用这种方法开发的技术将比任何特定于Lotus / Domino的技术更广泛地应用于未来职业。
回答
无论我们做什么,都需要了解Lotus Notes数据结构。好消息是,可以非常轻松地在Notes中构建全自动解决方案。
最好的选择是在Notes中内置它,并且可以将其设置为在接收到新邮件时自动运行。加里(Gary)的答案仍然悬而未决,但是如果没有任何经验,可能很难弄清楚如何自己实现它。另一方面,真正的Notes程序员最多应该花一两个小时才能完成安装。
回答
编辑:自从我第一次写这个答案以来,Wiser搬了家,现在声称它只是一个单元测试工具,所以请捏一点盐在下面的答案...
Svrist的回答很好,但是如果要避免他的中间步骤(将邮件写入磁盘以供Java系统稍后提取的邮件服务器),则可以使用Wiser。
Wiser可让我们启动Java中的邮件服务器:
Wiser wiser = new Wiser(); wiser.setPort(2500); wiser.start();
然后,我们可以定期对其进行轮询以获取邮件:
for (WiserMessage message : wiser.getMessages()) { String envelopeSender = message.getEnvelopeSender(); String envelopeReceiver = message.getEnvelopeReceiver(); MimeMessage mess = message.getMimeMessage(); // mail processing goes here }