-
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,然后:
usingDomino;
获取Notes邮箱用户列表
本段代码将遍历用户视图(People View)中的所有用户,将其全名添加到ComboBox控件中。新建两个全局变量(全局的目的是供本例中的其它方法使用)。
NotesSessionns; NotesDatabasendb;发送邮件
本段代码降为从ComboBox中选中的用户发送一封邮件,我们可以输入邮件的标题和内容,并可以添加附件。
try {
if(ns!=null)
{ NotesDocumentdoc=ndb.CreateDocument();
doc.ReplaceItemValue("Form","Memo"); //收件人信息
doc.ReplaceItemValue("SendTo",cb_People.Text); //邮件主题
doc.ReplaceItemValue("Subject",tb_Subject.Text); //邮件正文
NotesRichTextItemrt=doc.CreateRichTextItem("Body");
rt.AppendText(tb_Body.Text); //附件
if(!string.IsNullOrEmpty(tb_Attachment.Text))
{ NotesRichTextItemattachment=doc.CreateRichTextItem("attachment");
attachment.EmbedObject(EMBED_TYPE.EMBED_ATTACHMENT,"",tb_Attachment.Text,"attachment");
} //发送邮件
objectobj=doc.GetItemValue("SendTo");
doc.Send(false,refobj);
doc=null;
MessageBox.Show("Successfully!");
}
}
catch(Exceptionex)
{
MessageBox.Show("Error:"+ex.Message);
}
如果想要添加多个收件人,可以将代码:
doc.ReplaceItemValue("SendTo",cb_People.Text);
更改为代码:
string[]receivers={cb_People.SelectedItem.ToString(),"windiechai/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>();
}
接着添加一个全局变量来存储邮件集合:
publicList<Mail>mails=newList<Mail>();
然后将所有邮件的信息添加的mails集合中,并将它们的标题添加到一个ListBox中。
//清空邮件列表
lb_Mail.Items.Clear(); mails.Clear();
//获取邮箱视图
NotesDbDirectorydir=ns.GetDbDirectory("DominoT/TEST");
NotesDatabasemaildb=dir.OpenMailDatabase();
NotesViewnv=maildb.GetView("$inbox");
//遍历所有邮件
NotesDocumentdoc=nv.GetFirstDocument();
while(doc!=null)
{
Mailmail=newMail();
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(NotesItemiteminitems)
{
if(item.Name=="$FILE")
{
stringfileName=((object[])item.Values)[0].ToString();
NotesEmbeddedObjectfile=(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中显示邮件内容(包括标题,时间,正文和附件文件名)。
Mailm=mails[lb_Mail.SelectedIndex];
StringBuildersbMail=newStringBuilder();
sbMail.AppendLine(m.Subject); sbMail.AppendLine("----------");
sbMail.AppendLine(m.Time); sbMail.AppendLine("----------");
sbMail.AppendLine(m.Body); sbMail.AppendLine("----------");
sbMail.AppendLine("Attachments:");
foreach(NotesEmbeddedObjectfileinm.Files)
{
sbMail.AppendLine(file.Name);
}
tb_Mail.Text=sbMail.ToString(); //根据附件数量决定打开附件按钮是否可用
if(m.Files.Count>0)
{
btn_OpenAttachment.Enabled=true;
}
else
btn_OpenAttachment.Enabled=false;
本段代码实现了当点击“打开附件”按钮后从内从中释放附件文件到硬盘并执行它。
Mailm=mails[lb_Mail.SelectedIndex]; //获取第一个附件 NotesEmbeddedObjectfile=m.Files[0]; //组合一个临时路径 stringfilename=Path.Combine(Application.StartupPath,file.Name); //将附件释放到临时路径 file.ExtractFile(filename); //执行附件 system.Diagnostics.Process.Start(filename);
主要的代码就这么多了,第一次使用IBM的软件,感觉……很不顺手,连对象模型都相当别扭,嗯,废话不说了 ,如果上面的代码有何不恰当的地方还请各位朋友多多指教。 点击这里下载本文的范例程序(Visual Studio 2008),范例程序的UI如下:
点击“Sender”之后回到Notes中,刷新发现邮件已经收到,包含附件,并且可以正常打开:
如果想要添加多个收件人,可以将代码:
doc.ReplaceItemValue("SendTo",cb_People.Text);
更改为代码:
string[]receivers={cb_People.SelectedItem.ToString(),"windiechai/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>();
}