我想构建一个正在侦听Lotus Notes的“已发送邮件”事件并处理已发送邮件的应用程序。
我正在使用Delphi进行开发,因为没有其他内容我猜我会坚持使用OLE(已经使用OLE从Lotus Notes访问选定的邮件并进行处理)。
那么,有没有办法订阅Lotus Notes的一些事件并使用OLE获取适当的数据? (在这种特殊情况下,我想订阅“发送邮件”事件,并获取邮件文件)。如果有更多Lotus Notes经验的人知道其他方式,我也愿意接受建议,但最后我必须使用Delphi访问邮件。
应用程序应该在客户端计算机上运行,而不是在服务器上运行。
由于
答案 0 :(得分:2)
我假设你想做这个客户端。遗憾的是,无法通过Notes和Domino中提供的OLE或COM接口订阅Notes客户端事件。唯一的方法是使用Notes C API Extenstion Manager接口,但这实际上是低级别的东西,需要广泛的Notes知识。
然而,有一个现成的代码片段使用Extension Manager构建,名为TriggerHappy,可在OpenNTF站点上作为开源使用。它允许您将其配置为调用由事件触发的LotusScript代理。这(有点)降低了围绕这个的学习曲线。
答案 1 :(得分:1)
实际上,Lotus Notes的COM接口有很好的文档记录,可能是因为它已经被IBM拥有了十多年。您可以在此处找到一种方法:http://www.ibm.com/support/knowledgecenter/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_ACCESSING_THE_DOMINO_OBJECTS_THROUGH_COM.html。
对于Delphi,您需要为Notes'创建一个导入单元Domino_Tlb.Pas。 COM接口;我做了一段时间但是我认为你是通过在Notes NlsXbe.Dll上使用Delphi的TypeLib Importer来实现的,这是Notes客户端和服务器安装的一部分。
AFAIR,Notes' COM支持不会公开任何COM事件,因此不支持" subscriptions"在出站事件驱动的界面意义上。但是,Notes使用类似VB的LotusScript语言来编写"代理"是常见的。它可以监视邮件文件,以触发任何适合业务需求的操作。由于没有"事件",使用COM接口实现的代理必须通过定期轮询感兴趣的Notes数据库来工作,并且有可用于搜索以前未处理的邮件项(发送或到达)的功能。例如,您可以使用以下代码轮询Notes数据库的收件箱:
View := DB.GetView('($Inbox)');
Res := View.FTSEARCH('FIELD PostedDate < ''01/05/2012'' or FIELD DeliveredDate < ''01/05/2012''', 0);
Doc := View.GetFirstDocument;
Done := Doc <> Nil;
while not Done do begin
vFrom := Doc.GetItemValue('INetFrom');
[...]
Doc := View.GetNextDocument(Doc);
if Doc = Nil then
Done := True;
end;
更新:使用LotusScript编写的代理可以访问内置集合UnprocessedDocuments
,该集合对于单个代理是唯一的,因此它可以判断它是否已经处理了文档(请参阅{ {3}})。我不记得这是否适用于COM代理,但我怀疑它是否重要,因为COM代理总是可以将自己的自定义项目写入文档以表明它具有处理过它。
ISTR认为找出哪些Notes字段用于哪个目的可能相当令人讨厌。 使用COM界面处理Notes文档是非常简单的,当我十年前做这种事情时,我从未遇到过任何不可逾越的障碍。
我怀疑大多数Notes管理员是否允许在Notes服务器上执行此类操作,但这一切都可以在客户端计算机上正常工作,并且由于内置的数据库复制支持,您可以在服务器版本上执行此操作db或本地副本。
基本上,通过COM接口可以获得与LotusScript相同的功能。
我担心你已经忘记了可以在Domino服务器上安装Java代理 - 请参阅例如http://www-12.lotus.com/ldd/doc/lotusscript/lotusscript.nsf/1efb1287fc7c27388525642e0074f2b6/fa9dc4724dab0fed8525642e007702d6?OpenDocument。在我的公司,我们很早就消除了这种可能性,因为在一个实时企业邮件服务器上行为不端的代理可能会产生混乱。