林凱 李曉偉 倪伏躍
摘要:Lotus Notes通常被稱為群件,它是一款集電子郵件、通訊軟件、數(shù)據(jù)庫(kù)軟件、文件管理軟件、工作流軟件于一體的辦公軟件。目前,Lotus Notes系統(tǒng)在氣象部門的應(yīng)用主要體現(xiàn)在公文的收發(fā),預(yù)警信號(hào),災(zāi)情直報(bào)等。本文介紹了通過(guò) COM 訪問(wèn) Lotus Domino 資源類,使用Microsoft .NET訪問(wèn)Lotus Notes的數(shù)據(jù)庫(kù),實(shí)現(xiàn)快速發(fā)送Lotus Notes郵件。
關(guān)鍵詞:Microsoft.NET Lotus Notes Domino COM
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2016)05-0000-00
1 設(shè)計(jì)思路
Windows通常通過(guò)開放數(shù)據(jù)庫(kù)互連標(biāo)準(zhǔn)ODBC進(jìn)行數(shù)據(jù)交換與操作,后來(lái)微軟又推出了ADO技術(shù)用于 Oracle等關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),盡管也提供了Notes ODBC,但它并不支持全文檢索,因此要在Microsoft .NET中實(shí)現(xiàn)對(duì)Lotus Notes數(shù)據(jù)庫(kù)的存取,必須通過(guò)別的方法,即在Notes中使用COM和OLE。
??OLE是Windows的一個(gè)特征,OLE通過(guò)把應(yīng)用程序的功能作為對(duì)象暴露給其他應(yīng)用程序,這些對(duì)象擁有屬性(數(shù)據(jù))和方法(函數(shù)),應(yīng)用程序通過(guò)OLE中的對(duì)象去執(zhí)行相應(yīng)的任務(wù)。Domino既可以作為一個(gè)OLE提供給外部程序調(diào)用,也可以通過(guò)OLE去控制其他OLE對(duì)象。在R5.03以后,Lotus提供了一個(gè)后臺(tái)的COM類NotesSession。NotesSession是一個(gè)功能強(qiáng)大的對(duì)象模型,它提供了其他Notes對(duì)象的接口,即只有通過(guò)它才能訪問(wèn)Notes中的數(shù)據(jù)庫(kù)對(duì)象NotesDatabase、NotesView等。
2 程序?qū)崿F(xiàn)
下面僅介紹通過(guò)Domino COM的NotesSession和NotesDatabase屬性和方法,來(lái)實(shí)現(xiàn)郵件發(fā)送的功能。其它的應(yīng)用可參考Lotus Notes的幫助文檔.設(shè)計(jì)程序之前必須取得三個(gè)信息:?服務(wù)器的描述(如:besz_s/河北/CMA),?郵件文件信息(如mail\zkyangyuan.nsf )?用戶密碼(如:yangyuan)。啟動(dòng)VS2008項(xiàng)目,添加COM引用。
(1)首先先登陸當(dāng)前激活的郵箱,以下函數(shù)模塊可以實(shí)現(xiàn)登陸郵箱的功能。
private void loginMail()
{
try
{
string PassWord = "yangyuan";//登陸時(shí)需要輸入的密碼
//定義Notes會(huì)話
NotesSession ns = new NotesSession();
//初始化Notes會(huì)話
ns.Initialize(PassWord);
//郵件數(shù)據(jù)庫(kù)的服務(wù)器描述
string mail_Server="besz_s/河北/CMA";
//當(dāng)前用戶的郵件數(shù)據(jù)庫(kù)
string mail_dbName=@"mail\zkyangyuan.nsf";
//定義郵件數(shù)據(jù)庫(kù)
NotesDatabase ndb;
//初始化NotesDatabase登陸Notes
ndb =ns.GetDatabase(mail_Server, mail_dbName, false);
if (ndb.IsOpen == false)
ndb.Open();
}
catch (Exception ex)
{
MessageBox.Show("遠(yuǎn)程數(shù)據(jù)庫(kù)連接失敗!");
}
}
(2) 正常登陸郵箱后可以通過(guò)以下函數(shù)模塊可以實(shí)現(xiàn)發(fā)送帶附件的郵件到指定收件人的郵箱。
// 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]))
{//可以添加多個(gè)附件
NotesRichTextItem attachment = doc.CreateRichTextItem("attachment");
foreach (string Str in Attachment)
{
attachment.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT,"",Str,attachment");
}
}
//發(fā)送郵件
object obj = doc.GetItemValue("SendTo");
doc.Send(false, ref obj);
doc = null;
}
MessageBox.Show("郵件發(fā)送成功!");
}
}
catch (Exception ex)
{
MessageBox.Show("郵件發(fā)送失??!");
}
}
(3)如下可以實(shí)現(xiàn)把” 道路結(jié)冰黃色預(yù)警信號(hào)”給多個(gè)收件人發(fā)送
//表示收件人信息
String Receive_People=”赤城縣氣象局,崇禮縣氣象局,沽源縣氣象局,懷安縣氣象局,懷來(lái)縣氣象局”;
//表示郵件主題;
String Subject=” 道路結(jié)冰黃色預(yù)警信號(hào)”
//表示郵件正文
String Body =” 張家口市氣象臺(tái)2009年11 月11日16時(shí) 00分發(fā)布道路結(jié)冰黃色預(yù)警信號(hào)”
//表示郵件附件的文件
String[]Attachment={”200911111604544010道路結(jié)冰黃色.xml”}
//調(diào)用郵件發(fā)送函數(shù)
MailSend(Subject, Body, Attachment, Receive_People);
(4)下面的函數(shù)可以得到指定某一群體的所有收件人信息
//初始化
private void People_View ()
{
try
{
//郵件數(shù)據(jù)庫(kù)的服務(wù)器描述
string mail_Server="besz_s/河北/CMA";
//某一個(gè)群體的數(shù)據(jù)庫(kù),如河北省氣象部門通訊錄如下
string mail_dbName=" hebnames.nsf ";
//定義郵件數(shù)據(jù)庫(kù)
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());
//查找下一個(gè)用戶
doc = vw.GetNextDocument(doc);
}
if (lb_People.Items.Count > 0)
lb_People.SelectedIndex = 0;
}
catch (Exception ex)
{
MessageBox.Show("Error:" + ex.Message);
}
}
3 結(jié)語(yǔ)
采用COM作為Microsoft .NET與Domino的橋梁,既可以發(fā)揮Domino的強(qiáng)大的文檔處理能力,又可以發(fā)揮Microsoft .NET友好的可視化功能??梢园袻otus Notes集成到應(yīng)用程序中,可以適當(dāng)提高工作效率。