前段時間簡單的研究了一下.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>
/// 簡單的郵件類
///
</summary>
public class Mail
{
/**//// <summary> /
// 主題 /// </summary>
public string Subject
{
get { return _subject;
}
set
{ _subject = value;
}
}
private string _subject = string.Empty;
/**//// <summary> /// 發件者
/// </summary>
public string From
{ get { return _from;
}
set { _from = value; }
}
private string _from = string.Empty;
/**//// <summary> ///郵件正文
/// </summary>
public string Body
{ get { return _body; }
set { _body = value; }
}
private string _body = string.Empty;
/**//// <summary>
///發件時間
/// </summary>
public string Time
{
get { return _time;
}
set { _time = value; }
}
private string _time = string.Empty;
/**//// <summary>
/// 附件集合
/// </summary>
public List<NotesEmbeddedObject> Files
{
get { return _files;
}
set {
_files = value;
}
}
private List<NotesEmbeddedObject> _files = new List<NotesEmbeddedObject>();
}
接著添加一個全局變量來存儲郵件集合:
public List<Mail> mails = new List<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如下:
點擊“Sender”之後回到Notes中,刷新發現郵件已經收到,包含附件,並且可以正常打開:
來源:http://www.cnblogs.com/xiaoshatian/archive/2008/06/17/1223439.html