关于Java程序调用Lotus Notes邮件服务发送邮件的实现(一思路)
关于Lotus Notes
Lotus Notes/Domino 是企业级通讯、协同工作及Internet/Intranet平台;内含强大的电子邮件功能,应用于企业办公自动化。
Lotus Notes结构
总的来讲,Lotus Notes 软件是C/S(客户端/服务器)架构的:客户端称为Notes,服务器端称为Domino;另外,部分新版本还提供Web服务,可通过浏览器访问服务器端Domino。
通常说的Lotus Notes软件,其实两部分:客户端Notes和服务器端Domino。
因此,部署Lotus Notes套件包括服务器端Domino的安装和配置,客户端Notes的安装和配置,后者相对简单,在此推荐本人验证过的服务器端Domino的部署教程给小白们(domino 8.51安装全步骤(图文教程) http://www.piikee.net/read.php/413.htm)。
Lotus Notes的邮件系统
Lotus Notes软件内含的邮件系统,服务器端Domino上部署邮件服务应用;Notes 工作站与 Domino 服务器之间或两个 Domino 服务器之间通信的基础为 NRPC(Notes 远程过程调用,也称Notes 路由协议)服务。关于NRPC,请参考:
或http://www-01.ibm.com/support/docview.wss?uid=swg21602698
也就是说,缺省情况下,Domino 服务器使用 NRPC与在其它Domino服务器或Notes工作站进行电子邮件/消息的通信。另外,也可配置Domino服务器,通过标准邮件通信协议如SMTP、POP3与其他服务器进行通信。
问题:向Notes的邮件系统内部发送邮件
问题描述:如何通过编写Java程序,以Notes的邮件系统内部某个用户的身份,向Notes的邮件系统的其他内部用户发送邮件/消息?
解决思路
1.试试JavaMail
欲解决该问题,首先想到的Java的邮件服务接口JavaMail,但JavaMail只支持互联网标准邮件通信协议(mail systems based on internet standards such as MIME, SMTP, POP3, and IMAP,参加API:http://javamail.kenai.com/nonav/javadocs/index.html),显然,NRPC为IBM内部自定义的邮件通信协议,非标准的(而且貌似非公开的);因此,若Domino服务器配置为只能通过NRPC方式进行邮件通信(并不少见),则JavaMail无法解决该问题。
2. 试试客户端Notes
若是人工手动完成该过程,以内部用户身份发送邮件的操作接口是在客户端Notes,通过登录Notes客户端,完成身份校验后,即可在客户端编辑邮件并发送。因此,我们可以考虑在本地安装客户端Notes,编写Java程序与本地客户端Notes通信,并通过客户端Notes接口调用Domino发送邮件,前提是Lotus Notes 软件提供访问客户端Notes的API,事实上,该思路是可行的。
在IBM官网可以找到Java程序访问客户端Notes的资料和接口(请参考Lotus 官方文档架构师的文章:Java对Domino Objects的访问:
http://www.ibm.com/developerworks/cn/lotus/ls-java_access_pt1/index.html)
另外,文中提到第3条思路:Java程序可通过远程连接访问的 Domino 服务器,调用相关API完成邮件发送。
3. 远程连接
使用 CORBA请求 Domino服务器的IIOP服务,通过相关API,完成邮件发送。这种方式最方便,相比思路2,思路3不需要和本地的客户端Notes通信,直接和Domino服务器对话,因此不要求本地必须安装客户端Notes。
以下是文章(Java对Domino Objects的访问)针对该部分的摘要:
Java 对 Domino Objects 的访问是通过高级包 lotus.domino 进行的。根据运行时环境,这个包中的接口是在其他两个包中的一个包中实现的:
lotus.domino.local 提供了从同一计算机上的 Notes/Domino 软件进行调用。
lotus.domino.cso 提供了从通过远程连接访问的 Domino 服务器进行调用。
对于本地访问,Java 程序运行在安装有 Notes 客户机或者 Domino 服务器的计算机上。本地类由 JNI(Java Native Interface)构建来,用于访问与 JVM(Java Virtual Machine)相同的进程中的 Notes/Domino 二进制文件。
对于远程访问,Java 程序使用 CORBA(Common Object Request Broker Architecture)请求 Domino 服务器所提供的服务。远程类使用 CORBA 通过 TCP/IP 网络访问服务器。
官方发布的Domino对象的API文档:
到此,该问题的解决办法已找到,可以根据需要选择思路2或3。