林凯 李晓伟 倪伏跃
摘要:Lotus Notes通常被称为群件,它是一款集电子邮件、通讯软件、数据库软件、文件管理软件、工作流软件于一体的办公软件。目前,Lotus Notes系统在气象部门的应用主要体现在公文的收发,预警信号,灾情直报等。本文介绍了通过 COM 访问 Lotus Domino 资源类,使用Microsoft .NET访问Lotus Notes的数据库,实现快速发送Lotus Notes邮件。
关键词:Microsoft.NET Lotus Notes Domino COM
中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2016)05-0000-00
1 设计思路
Windows通常通过开放数据库互连标准ODBC进行数据交换与操作,后来微软又推出了ADO技术用于 Oracle等关系数据库管理系统,尽管也提供了Notes ODBC,但它并不支持全文检索,因此要在Microsoft .NET中实现对Lotus Notes数据库的存取,必须通过别的方法,即在Notes中使用COM和OLE。
??OLE是Windows的一个特征,OLE通过把应用程序的功能作为对象暴露给其他应用程序,这些对象拥有属性(数据)和方法(函数),应用程序通过OLE中的对象去执行相应的任务。Domino既可以作为一个OLE提供给外部程序调用,也可以通过OLE去控制其他OLE对象。在R5.03以后,Lotus提供了一个后台的COM类NotesSession。NotesSession是一个功能强大的对象模型,它提供了其他Notes对象的接口,即只有通过它才能访问Notes中的数据库对象NotesDatabase、NotesView等。
2 程序实现
下面仅介绍通过Domino COM的NotesSession和NotesDatabase属性和方法,来实现邮件发送的功能。其它的应用可参考Lotus Notes的帮助文档.设计程序之前必须取得三个信息:?服务器的描述(如:besz_s/河北/CMA),?邮件文件信息(如mail\zkyangyuan.nsf )?用户密码(如:yangyuan)。启动VS2008项目,添加COM引用。
(1)首先先登陆当前激活的邮箱,以下函数模块可以实现登陆邮箱的功能。
private void loginMail()
{
try
{
string PassWord = "yangyuan";//登陆时需要输入的密码
//定义Notes会话
NotesSession ns = new NotesSession();
//初始化Notes会话
ns.Initialize(PassWord);
//邮件数据库的服务器描述
string mail_Server="besz_s/河北/CMA";
//当前用户的邮件数据库
string mail_dbName=@"mail\zkyangyuan.nsf";
//定义邮件数据库
NotesDatabase ndb;
//初始化NotesDatabase登陆Notes
ndb =ns.GetDatabase(mail_Server, mail_dbName, false);
if (ndb.IsOpen == false)
ndb.Open();
}
catch (Exception ex)
{
MessageBox.Show("远程数据库连接失败!");
}
}
(2) 正常登陆邮箱后可以通过以下函数模块可以实现发送带附件的邮件到指定收件人的邮箱。
// Subject表示邮件主题;Body表示邮件正文;Attachment表示邮件附件的文件;Receive_People表示收件人信息
Private void MailSend(String Subject,String Body,String[] Attachment,String Receive_People)
{
try
{
if (ns != null)
{
string[] people = Receive_People.Split(',');
foreach (string str in people)
{
NotesDocument doc = ndb.CreateDocument();
doc.ReplaceItemValue("Form", "Memo");
doc.ReplaceItemValue("SendTo", str);
//邮件主题
doc.ReplaceItemValue("Subject", Subject);
//邮件正文
NotesRichTextItem rt = doc.CreateRichTextItem("Body");
rt.AppendText(Body);
//附件
if (!string.IsNullOrEmpty(Attachment[0]))
{//可以添加多个附件
NotesRichTextItem attachment = doc.CreateRichTextItem("attachment");
foreach (string Str in Attachment)
{
attachment.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT,"",Str,attachment");
}
}
//发送邮件
object obj = doc.GetItemValue("SendTo");
doc.Send(false, ref obj);
doc = null;
}
MessageBox.Show("邮件发送成功!");
}
}
catch (Exception ex)
{
MessageBox.Show("邮件发送失败!");
}
}
(3)如下可以实现把” 道路结冰黄色预警信号”给多个收件人发送
//表示收件人信息
String Receive_People=”赤城县气象局,崇礼县气象局,沽源县气象局,怀安县气象局,怀来县气象局”;
//表示邮件主题;
String Subject=” 道路结冰黄色预警信号”
//表示邮件正文
String Body =” 张家口市气象台2009年11 月11日16时 00分发布道路结冰黄色预警信号”
//表示邮件附件的文件
String[]Attachment={”200911111604544010道路结冰黄色.xml”}
//调用邮件发送函数
MailSend(Subject, Body, Attachment, Receive_People);
(4)下面的函数可以得到指定某一群体的所有收件人信息
//初始化
private void People_View ()
{
try
{
//邮件数据库的服务器描述
string mail_Server="besz_s/河北/CMA";
//某一个群体的数据库,如河北省气象部门通讯录如下
string mail_dbName=" hebnames.nsf ";
//定义邮件数据库
NotesDatabase ndb;
//初始化NotesDatabase登陆Notes
ndb =ns.GetDatabase(mail_Server, mail_dbName, false);
//获取用户视图
NotesView vw = ndb.GetView("People");
//遍历所有用户
NotesDocument doc = vw.GetFirstDocument();
while (doc != null)
{
//获取用户全名
object[] fullname = doc.GetFirstItem("FullName").Values as object[];
lb_People.Items.Add(fullname[1].ToString());
//查找下一个用户
doc = vw.GetNextDocument(doc);
}
if (lb_People.Items.Count > 0)
lb_People.SelectedIndex = 0;
}
catch (Exception ex)
{
MessageBox.Show("Error:" + ex.Message);
}
}
3 结语
采用COM作为Microsoft .NET与Domino的桥梁,既可以发挥Domino的强大的文档处理能力,又可以发挥Microsoft .NET友好的可视化功能。可以把Lotus Notes集成到应用程序中,可以适当提高工作效率。