摘 要:
介绍了lotus notes内自带的部分组件以及domino接口的应用,阐述了如何使用domino接口结合vb6工具来开发一个邮件扩展工具,实现批量查询是否已读、批量修改、批量撤回等便捷功能。
引言
lotus notes于1989年创立,是一个企业级通信、协同工作平台,拥有安全性高、易于管理等优点,符合企业网对应用的要求。笔者单位是以基于lotus notes 7.0的定制版本作为内部协同办公工具,由于该版本最后更新时间为2005年,许多功能已远远落后于时代,不够人性化,给实际工作带来了一定的阻碍。所幸lotus notes自带lotus script脚本语言可供开发人员在lotus designer中进行更多个性化开发,并且提供了一个com类接口,可在vb、#c、java等语言中调用[1]。
visual basic(以下简称“vb”)是与lotus同时代非常受欢迎的开发语言,具有易学易用、编程简洁、可视化ui设计、程序集成化程度高等优点,非常适用于快速开发小型窗体程序。
尽管vb在如今看来也是落后于时代的产物,但考虑到lotus script语法基本与vb相同以及vb开发窗体应用的便捷性,因此还是决定采用vb6作为开发工具引入lotus domino object组件进行邮件扩展工具开发。
1
需求分析
用户在使用lotus notes发送邮件操作中,难免会出现重要公文、邮件内容有误或收件人有误等情况,希望能立即撤回错误邮件并重新发送正确邮件,由于不希望错误内容被阅读,所以整个过程越快越有利;在执行删除之前,有的用户可能仅想知道邮件在收件人当中的已读情况,根据已读/未读比例再进行下一步操作的决策;对于较小的错误,如果能实现静默修正功能,更能改善用户体验。
lotus notes 7.0版本并没有自带查询邮件是否已读和撤回功能,并且从单位管理制度考虑,即使具有该功能,由于无法被管理员有效监管,可能会导致该功能被大量滥用,增加服务器负担,甚至造成宕机风险。传统的方法是,用户提出申请并得到管理员审核通过后,使用notes自带的邮件删除工具进行删除[2]。
新建删除命令,填写所需删除邮件的标题,必须保证完全相同。经过一系列繁杂的设置后启动程序,该工具将会在服务器中遍历搜索所有用户数据库中该邮件的数据,检索到后则执行删除。整个过程非常漫长且卡顿,浪费算力,并且由于其检索逻辑是以标题作为关键字,为避免被误删,所以用户需要等待整个过程完成后才可以重新发出新邮件。管理员希望能减少人工操作,执行快捷方便,并能自动导出相关日志记录代替手工录入,在执行操作后用户可以立即重新发送邮件,无须等待过程完成。
2
设计思路
第一步,分析数据结构。根据官方提供的开发文档以及在客户端内查看邮件属性,可以得到一封邮件的所有属性字段(图1)。其中,$messageid为邮件标志,$orig为邮件唯一标志(与$messageid主要区别为,当一个用户发件箱和收件箱皆有该邮件时,为确保$orig在该用户数据库中的唯一性,收件箱中邮件的$orig值会改变,而$messageid则保持不变);sendto为收件人数组;copyto为抄送人数组;blindcopyto为密送;from为发件人;subject为主题;postdate为发件时间;body为正文内容;isnewdoc为是否已读标志。以上为本次开发主要使用的属性。
第二步,检索邮件方式。从数据结构来看,既然每封邮件有其自身唯一对应的主key,比起note自带的工具采用标题为关键字进行检索,选择使用$messageid会更加准确和高效,同时也支持标题精确检索以及模糊检索。
第三步,进入收件人数据库进行检索。由于每封邮件的收件人是有限的,无须全局遍历检索,只需要进入每个收件人的数据库检索即可,能够节省大量的检索时间。可以通过messageid获取该邮件对象,然后获取sendto数据从而取得收件人列表。
第四步,检索出来后读取isnewdoc字段判断邮件是否已读,使用removepermanently(true)方法执行删除操作或replaceitemvalue()方法执行替换修改操作。
所有操作执行完毕后,该邮件即已完全消失或者被修正,达到了邮件撤回或静默修改的目的,操作结束。
3
窗体设计
根据设计思路第二步,用户需要提供发件人信息以及需要撤回的邮件的messageid,因此绘制两个输入框,为了提供关于该邮件的更多信息以便管理员确认,故加上主题、发送时间、正文显示区域。绘制按钮用以触发检索、修改及删除等操作。根据管理员需求,再绘制状态区域即运行过程细节展示区域以及导出日志按钮。
4
开发
首先在visual basic 6中引用lotus domino objects接口组件(图2)。
主要用到以下几个模块代码(仅列出部分核心代码,非完整代码):
4.1
核心方法介绍
createobject(notes.notessession):获取当前note登录的session对象;getdatabase(数据库地址, names.nsf):进入通信录数据库;search():方法搜索发件人地址;getfirstdocument():获取第一条搜索结果;getfirstitem(字段名):获取指定字段;getdatabase(服务器,数据库):获取数据库;getlastdocument():获取搜索结果中的最后一个文档;emovepermanently(true)彻底删除邮件(如果是false则是删除到回收站);replaceitemvalue(属性,值):替换属性值。
4.2
初始化
dim adc as object;dim maildoc as object;dim session as object;dim maildb as object;dim view as object;dim a() as string;dim arr() as string;set session = createobject(notes.notessession)
4.3
检索邮件
set maildb = session.getdatabase(数据库地址, names.nsf) '进入通信录;if not maildb.isopen then maildb.open;fajian=text1.text;set adc = maildb.search(owner= & fajian & & type=person, nothing, 0) '在通信录中搜索该地址;set maildoc = adc.getfirstdocument() '取得该条文档;set rtitem1 = maildoc.getfirstitem(mailserver) '取得其所属服务器sername = rtitem1.text
set rtitem2 = maildoc.getfirstitem(mailfile) '取得其数据库地址;dbname = rtitem2.text;set maildb = session.getdatabase(sername, dbname) '进入其邮箱;if not maildb.isopen then maildb.open;if combo1.text = messageid then;docid = left(trim(replace(replace(replace(text2.text, , ), chr(13), ), chr(10), )), 49) '输入邮件id;keyword = @contains($messageid; & docid & );end if;set adc = maildb.search(keyword, nothing, 0) '搜索该邮件;set maildoc = adc.getlastdocument() '获取该邮件;
set rtitem3 = maildoc.getfirstitem(sendto) '获取收件人;set rtitem4 = maildoc.getfirstitem(copyto)“获取抄送人;
setsubject1= maildoc.getfirstitem(subject) '获取标题;
setposttime= maildoc.getfirstitem(posteddate) '获取发件时间;
4.4
执行查询是否已读/修改/删除操作
set maildb= session.getdatabase(jmep02mad/servers/geph, names.nsf); set adc= maildb.search(owner= & a(i) & & type=person, nothing, 0) '查找收件人
set maildoc = adc.getfirstdocument() ;
set rtitem1 = maildoc.getfirstitem(mailserver);sername = rtitem1.text;set rtitem2 = maildoc.getfirstitem(mailfile) ; dbname = rtitem2.text; set maildb = session.getdatabase(sername, dbname)
on error resume next
call maildoc.removepermanently(true)
4.5
交互优化
在上述核心代码的基础上,加入一些容错机制、自动补全、群组收件人展开、按照主题模糊查询、邮件批量修改、日志导出、仅删除未读等功能优化客户体验,具体代码不再赘述。
5
测试
开发完成后进行测试,顺利运行成功(图3)。
6
结语
使用domino接口与vb开发语言,既可以发挥lotus note强大的文档处理能力,又可以发挥vb友好的可视化功能,并且开发快捷,工作效率提升明显。
如何正确使用热保护器?
化解融资难融资贵和信息不对称,江苏银行试水物联网管控风险
TCL率先占领电视行业的风口趋势
中国移动发布了2020-2021年镀锌钢绞线产品集中采购中标候选人结果
Fluke50II系列测温仪助力“欧洲之星”事故调查
如何使用Domino接口结合VB6工具来开发一个邮件扩展工具
体现机器人的价值,机器人让高空作业更安全
蓝牙mesh网络相关知识详解
谷歌Waymo无人车行程要收费了:率先实现自动驾驶车商用
安科瑞能源管理云平台功能特点及实际案例介绍
相比酷睿i9良心百倍的AMD 16核桌面旗舰处理器 继续死磕
制作一个基于Raspberry Pi和PIR传感器的运动探测器警报
iot的优缺点_IoT面临的挑战
怎么把车上这么多电子设备连接起来?
人工智能搭配无人机 未来工业新方向
从汽车到可穿戴设备设计都要求PMIC提高功率效率
慧闻科技与姑苏实验室达成战略合作协议
安捷伦在任意波形发生器上推出无限回放时间和多通道同步支持
如何在Ubuntu Linux上安装Flash
回流焊焊接后缺陷分析