林凱 李曉偉 倪伏躍
摘要:Lotus Notes通常被稱為群件,它是一款集電子郵件、通訊軟件、數據庫軟件、文件管理軟件、工作流軟件于一體的辦公軟件。目前,Lotus Notes系統(tǒng)在氣象部門的應用主要體現(xiàn)在公文的收發(fā),預警信號,災情直報等。本文介紹了通過 COM 訪問 Lotus Domino 資源類,使用Microsoft .NET訪問Lotus Notes的數據庫,實現(xiàn)快速發(fā)送Lotus Notes郵件。
關鍵詞:Microsoft.NET Lotus Notes Domino COM
中圖分類號:TP311 文獻標識碼:A 文章編號:1007-9416(2016)05-0000-00
1 設計思路
Windows通常通過開放數據庫互連標準ODBC進行數據交換與操作,后來微軟又推出了ADO技術用于 Oracle等關系數據庫管理系統(tǒng),盡管也提供了Notes ODBC,但它并不支持全文檢索,因此要在Microsoft .NET中實現(xiàn)對Lotus Notes數據庫的存取,必須通過別的方法,即在Notes中使用COM和OLE。
??OLE是Windows的一個特征,OLE通過把應用程序的功能作為對象暴露給其他應用程序,這些對象擁有屬性(數據)和方法(函數),應用程序通過OLE中的對象去執(zhí)行相應的任務。Domino既可以作為一個OLE提供給外部程序調用,也可以通過OLE去控制其他OLE對象。在R5.03以后,Lotus提供了一個后臺的COM類NotesSession。NotesSession是一個功能強大的對象模型,它提供了其他Notes對象的接口,即只有通過它才能訪問Notes中的數據庫對象NotesDatabase、NotesView等。
2 程序實現(xiàn)
下面僅介紹通過Domino COM的NotesSession和NotesDatabase屬性和方法,來實現(xiàn)郵件發(fā)送的功能。其它的應用可參考Lotus Notes的幫助文檔.設計程序之前必須取得三個信息:?服務器的描述(如:besz_s/河北/CMA),?郵件文件信息(如mail\zkyangyuan.nsf )?用戶密碼(如:yangyuan)。啟動VS2008項目,添加COM引用。
(1)首先先登陸當前激活的郵箱,以下函數模塊可以實現(xiàn)登陸郵箱的功能。
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) 正常登陸郵箱后可以通過以下函數模塊可以實現(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]))
{//可以添加多個附件
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)如下可以實現(xiàn)把” 道路結冰黃色預警信號”給多個收件人發(fā)送
//表示收件人信息
String Receive_People=”赤城縣氣象局,崇禮縣氣象局,沽源縣氣象局,懷安縣氣象局,懷來縣氣象局”;
//表示郵件主題;
String Subject=” 道路結冰黃色預警信號”
//表示郵件正文
String Body =” 張家口市氣象臺2009年11 月11日16時 00分發(fā)布道路結冰黃色預警信號”
//表示郵件附件的文件
String[]Attachment={”200911111604544010道路結冰黃色.xml”}
//調用郵件發(fā)送函數
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的橋梁,既可以發(fā)揮Domino的強大的文檔處理能力,又可以發(fā)揮Microsoft .NET友好的可視化功能??梢园袻otus Notes集成到應用程序中,可以適當提高工作效率。