1. 程式人生 > >C#簡單操作Lotus Notes郵件

C#簡單操作Lotus Notes郵件

前段時間簡單的研究了一下.NET操作Lotus Notes郵件的實現,具體的操作包括郵件的讀取和傳送,而且都要包含附件,其間參考了《在 Microsoft .NET 應用程式中使用 IBM Lotus Domino》一文,現在把成果和大家分享一下。
本文將分為獲取使用者列表、傳送郵件、收取郵件三個部分,並會在文末提供範例程式(Visual Studio 2008)的下載。 

引用

如果想使用.NET操作Lotus,我們可以使用 Lotus Domino Objects 通過 COM 來訪問 Domino 物件,在 Domino 伺服器或者任何一個 Notes 客戶機(IBM Lotus Domino Designer、Lotus Domino Administrator 或者 Lotus Notes)的安裝中都包括 Lotus Domino Objects。如果你的開發環境複合上述的要求,就可以新增一個COM引用:Lotus Domino Objects,然後:

using Domino;

如果找不到這個COM元件,可以先註冊以下元件,然後就可以找到了:

regsvr32 "C:\Program Files\lotus\notes\nlsxbe.dll"

獲取Notes郵箱使用者列表

本段程式碼將遍歷使用者檢視(People View)中的所有使用者,將其全名新增到ComboBox控制元件中。新建兩個全域性變數(全域性的目的是供本例中的其它方法使用)。

NotesSession ns;
NotesDatabase ndb;

傳送郵件

本段程式碼降為從ComboBox中選中的使用者傳送一封郵件,我們可以輸入郵件的標題和內容,並可以新增附件。

try
{
if(ns!=null)
    {
        NotesDocument doc 
= ndb.CreateDocument();

        doc.ReplaceItemValue(
"Form""Memo");

//收件人資訊        doc.ReplaceItemValue("SendTo", cb_People.Text);

//郵件主題        doc.ReplaceItemValue("Subject", tb_Subject.Text);

//郵件正文        NotesRichTextItem rt = doc.CreateRichTextItem("
Body");
        rt.AppendText(tb_Body.Text);

//附件if (!string.IsNullOrEmpty(tb_Attachment.Text))
        {
            NotesRichTextItem attachment 
= doc.CreateRichTextItem("attachment");
            attachment.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT, 
"", tb_Attachment.Text, "attachment");
        }

//傳送郵件object obj = doc.GetItemValue("SendTo"); 
        doc.Send(
false,ref obj);

        doc 
=null;
        MessageBox.Show(
"Successfully!");
    }

}
catch(Exception ex)
{
    MessageBox.Show(
"Error:"+ ex.Message);
}


如果想要新增多個收件人,可以將程式碼:

doc.ReplaceItemValue("SendTo", cb_People.Text); 

更改為程式碼:

string[] receivers = { cb_People.SelectedItem.ToString(), "windie chai/TEST" };
doc.ReplaceItemValue(
"SendTo", receivers);

如果想要新增多個附件,可以繼續呼叫這個物件的EmbedObject方法:

attachment.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT, """FilePath""attachment"); 

獲取收件箱內全部郵件

為了儲存郵件內容,我編寫了一個簡單的類:


////// 簡單的郵件類
///</summary>
publicclass Mail
{
////// 主題
///</summary>
publicstring Subject
{
getreturn _subject; }set{ _subject = value; }
    }
privatestring _subject =string.Empty;

////// 發件者
///</summary>
publicstring From
{
getreturn _from; }set{ _from = value; }
    }
privatestring _from =string.Empty;

////// 郵件正文
///</summary>
publicstring Body
{
getreturn _body; }set{ _body = value; }
    }
privatestring _body =string.Empty;

////// 發件時間
///</summary>
publicstring Time
{
getreturn _time; }set{ _time = value; }
    }
privatestring _time =string.Empty;

////// 附件集合
///</summary>
public List<< span>NotesEmbeddedObject> Files
{
getreturn _files; }set{ _files = value; }
    }
private List<< span>NotesEmbeddedObject> _files =new List<< span>NotesEmbeddedObject>();
}

接著新增一個全域性變數來儲存郵件集合:

public List<< span>Mail> mails =new List<< span>Mail>();

然後將所有郵件的資訊新增的mails集合中,並將它們的標題新增到一個ListBox中。

//清空郵件列表lb_Mail.Items.Clear();
mails.Clear();

//獲取郵箱檢視NotesDbDirectory dir = ns.GetDbDirectory("DominoT/TEST");
NotesDatabase maildb 
= dir.OpenMailDatabase();
NotesView nv 
= maildb.GetView("$inbox");

//遍歷所有郵件NotesDocument doc = nv.GetFirstDocument();
while (doc !=null)
{
    Mail mail 
=new Mail();
    mail.Subject 
= ((object[])doc.GetItemValue("Subject"))[0].ToString();
    mail.From 
= ((object[])doc.GetItemValue("From"))[0].ToString();
    mail.Body 
= ((object[])doc.GetItemValue("Body"))[0].ToString();
    mail.Time 
= ((object[])doc.GetItemValue("PostedDate"))[0].ToString();
object[] items = (object[])doc.Items;
foreach (NotesItem item in items)
    {
if (item.Name =="$FILE")
        {
string fileName = ((object[])item.Values)[0].ToString();
            NotesEmbeddedObject file 
= (NotesEmbeddedObject)doc.GetAttachment(fileName);
if (file !=null)
                mail.Files.Add(file);
        }
    }

    mails.Add(mail);
    lb_Mail.Items.Add(mail.Subject);

//查詢下一封郵件    doc = nv.GetNextDocument(doc);
}

顯示郵件內容並開啟附件

由於前面的程式碼中我已經把郵件資訊新增到自己定義的郵件集合中了,所以下面的操作就不需要和Domino伺服器互動了。
本段程式碼實現了在ListBox中點選郵件標題後在一個TextBox中顯示郵件內容(包括標題,時間,正文和附件檔名)。 

Mail m = mails[lb_Mail.SelectedIndex];
StringBuilder sbMail 
=new StringBuilder();
sbMail.AppendLine(m.Subject);
sbMail.AppendLine(
"----------");
sbMail.AppendLine(m.Time);
sbMail.AppendLine(
"----------");
sbMail.AppendLine(m.Body);
sbMail.AppendLine(
"----------");
sbMail.AppendLine(
"Attachments:");
foreach (NotesEmbeddedObject file in m.Files)
{
    sbMail.AppendLine(file.Name);
}
tb_Mail.Text 
= sbMail.ToString();

//根據附件數量決定開啟附件按鈕是否可用if(m.Files.Count>0)
{
    btn_OpenAttachment.Enabled 
=true;
}
else
    btn_OpenAttachment.Enabled 
=false;

本段程式碼實現了當點選“開啟附件”按鈕後從內從中釋放附件檔案到硬碟並執行它。

Mail m = mails[lb_Mail.SelectedIndex];

//獲取第一個附件NotesEmbeddedObject file = m.Files[0];

//組合一個臨時路徑string filename = Path.Combine(Application.StartupPath,file.Name);

//將附件釋放到臨時路徑file.ExtractFile(filename);

//執行附件System.Diagnostics.Process.Start(filename);

主要的程式碼就這麼多了,第一次使用IBM的軟體,感覺……很不順手,連物件模型都相當彆扭,嗯,廢話不說了 ,如果上面的程式碼有何不恰當的地方還請各位朋友多多指教。 
點選這裡下載本文的範例程式(Visual Studio 2008),範例程式的UI如下: