近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf服务给内部应用系统使用。在google上找了很多资料,由于是系统邮件,很多东西配置起来又比较麻烦。自己也入了很多坑,特此作为记录。废话不多说,下面开始...
服务器环境:Windows Server 2008R2+Lotus Notes 8.5中文版
特别注意:Lotus Notes 8.5中文版需要配置好账户密码,但是不需要打开它。
本地环境:Lotus Notes 8.5中文版+Visual Studio 2013
~~~~~~~~~~~~~~~~~~~~~~~我是优雅的分隔符~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1,打开VS,新建类库项目LotusMailHelper,添加Lotus Domino Objects引用:
添加完之后VS会自动编译成dll
2,添加类Mail.cs,添加邮件发送方法SendMail:
<span>///</span>
<span><summary></span>
<span>///</span>
<span> 发送邮件
</span>
<span>///</span>
<span></summary></span>
<span>///</span>
<span><param name="sendTo"></param></span>
<span>///</span>
<span><param name="subject"></param></span>
<span>///</span>
<span><param name="messageBody"></param></span>
<span>public</span>
<span>bool</span> SendMail(<span>string</span>[] sendTo, <span>string</span> subject, <span>string</span> messageBody)
3,在Mail.cs添加Using:using Domino;
4,编写SendMail的逻辑
Domino.NotesSession nSession = <span>new</span><span> Domino.NotesSession();
</span><span>string</span> pwd = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailPassword</span><span>"</span>];<span>//</span><span>lotus邮箱密码</span><span>string</span> server = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailServer</span><span>"</span>];<span>//</span><span>lotus邮箱服务器地址</span><span>string</span> serverPath = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailServerPath</span><span>"</span>];<span>//</span><span>存储nsf文件的路径</span><span>string</span> saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>SaveMessageOnSend</span><span>"</span>];<span>//</span><span>发送前是否保存</span>
nSession.Initialize(pwd);<span>//</span><span>初始化邮件</span>
Domino.NotesDatabase nDatabase =<span>
nSession.GetDatabase(server, serverPath, </span><span>false</span><span>);
Domino.NotesDocument nDocument </span>=<span> nDatabase.CreateDocument();
nDocument.ReplaceItemValue(</span><span>"</span><span>SentTo</span><span>"</span>, sendTo);<span>//</span><span>收件人,数据:数组</span>
nDocument.ReplaceItemValue(<span>"</span><span>Subject</span><span>"</span>, subject);<span>//</span><span>主题</span><span>if</span> (saveMessageOnSend == <span>"</span><span>1</span><span>"</span>)<span>//</span><span>为1时保存到lotus的发件箱</span><span>{
nDocument.SaveMessageOnSend </span>= <span>true</span><span>;
}
</span><span>else</span><span>
{
nDocument.SaveMessageOnSend </span>= <span>false</span>;<span>//</span><span>设置保存与否</span><span>}
NotesStream HtmlBody </span>=<span> nSession.CreateStream();
HtmlBody.WriteText(messageBody);</span><span>//</span><span>构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语</span>
NotesMIMEEntity mine = nDocument.CreateMIMEEntity(<span>"</span><span>Body</span><span>"</span>);<span>//</span><span>构建邮件正文</span>
mine.SetContentFromText(HtmlBody, <span>"</span><span>text/html;charset=UTF-8</span><span>"</span><span>, Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
nDocument.AppendItemValue(</span><span>"</span><span>Principal</span><span>"</span>, <span>"</span><span>XXX管理员</span><span>"</span>);<span>//</span><span>设置邮件的发件人昵称</span>
nDocument.Send(<span>false</span>, sendTo); <span>//</span><span>发送邮件</span>
nDocument.CloseMIMEEntities();<span>//</span><span>关闭</span>
由于最后会封装为dll,最好是添加try...catch...,加以优化,下面为优化过后:
<span>///</span>
<span><summary></span>
<span>///</span>
<span> 發送lotus郵件(需要在web.config或者app.config中添加以下節點
</span>
<span>///</span>
<span><appSettings></span>
<span>///</span>
<span><!--郵箱密碼--></span>
<span>///</span>
<span><add key="LotusMailPassword" value="" /></span>
<span>///</span>
<span><!--郵件服務器地址--></span>
<span>///</span>
<span><add key="LotusMailServer" value="" /></span>
<span>///</span>
<span><!--郵件數據庫路徑--></span>
<span>///</span>
<span><add key="LotusMailServerPath" value="" /></span>
<span>///</span>
<span><!--是否保存到發件箱(0不保存,1保存,其他值皆為不保存)--></span>
<span>///</span>
<span><add key="SaveMessageOnSend" value="0" /></span>
<span>///</span>
<span></appSettings></span>
<span>///</span>
<span></summary></span>
<span>///</span>
<span><param name="sendTo"></span>
<span>數組,收件人</span>
<span></param></span>
<span>///</span>
<span><param name="subject"></span>
<span>主題</span>
<span></param></span>
<span>///</span>
<span><param name="messageBody"></span>
<span>正文html</span>
<span></param></span>
<span>///</span>
<span><returns></returns></span>
<span>public</span>
<span>bool</span> SendMail(<span>string</span>[] sendTo, <span>string</span> subject, <span>string</span><span> messageBody)
{
</span><span>try</span><span>
{
Domino.NotesSession nSession </span>= <span>new</span><span> Domino.NotesSession();
</span><span>string</span> pwd = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailPassword</span><span>"</span>];<span>//</span><span>lotus邮箱密码</span><span>string</span> server = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailServer</span><span>"</span>];<span>//</span><span>lotus邮箱服务器地址</span><span>string</span> serverPath = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>LotusMailServerPath</span><span>"</span>];<span>//</span><span>存储nsf文件的路径</span><span>string</span> saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>SaveMessageOnSend</span><span>"</span>];<span>//</span><span>发送前是否保存</span>
nSession.Initialize(pwd);<span>//</span><span>初始化邮件</span>
Domino.NotesDatabase nDatabase =<span>
nSession.GetDatabase(server, serverPath, </span><span>false</span><span>);
Domino.NotesDocument nDocument </span>=<span> nDatabase.CreateDocument();
nDocument.ReplaceItemValue(</span><span>"</span><span>SentTo</span><span>"</span>, sendTo);<span>//</span><span>收件人,数据:数组</span>
nDocument.ReplaceItemValue(<span>"</span><span>Subject</span><span>"</span>, subject);<span>//</span><span>主题</span><span>if</span> (saveMessageOnSend == <span>"</span><span>1</span><span>"</span>)<span>//</span><span>为1时保存到lotus的发件箱</span><span> {
nDocument.SaveMessageOnSend </span>= <span>true</span><span>;
}
</span><span>else</span><span>
{
nDocument.SaveMessageOnSend </span>= <span>false</span>;<span>//</span><span>设置保存与否</span><span> }
NotesStream HtmlBody </span>=<span> nSession.CreateStream();
HtmlBody.WriteText(messageBody);</span><span>//</span><span>构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语</span>
NotesMIMEEntity mine = nDocument.CreateMIMEEntity(<span>"</span><span>Body</span><span>"</span>);<span>//</span><span>构建邮件正文</span>
mine.SetContentFromText(HtmlBody, <span>"</span><span>text/html;charset=UTF-8</span><span>"</span><span>, Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
nDocument.AppendItemValue(</span><span>"</span><span>Principal</span><span>"</span>, <span>"</span><span>XXX管理员</span><span>"</span>);<span>//</span><span>设置邮件的发件人昵称</span>
nDocument.Send(<span>false</span>, sendTo); <span>//</span><span>发送邮件</span>
nDocument.CloseMIMEEntities();<span>//</span><span>关闭</span><span>return</span><span>true</span>;<span>//</span><span>已经提交到lotus,返回true</span><span> }
</span><span>catch</span><span>
{
</span><span>return</span><span>false</span>;<span>//</span><span>提交失败</span><span> }
}</span>
5,点击项目生成,找到Bin文件夹中的dll,保存到自己喜欢的文件夹,方便后期的调用
============我是更加优美的分隔符=============
下面一起来建立Windows service
1,打开VS,新建Windows服务项目
名字随便取。。。新建完成之后会自动生成Service1.cs,打开Service1.cs代码看看,主要分为以下几个方法:
<span>public</span>
<span>partial</span>
<span>class</span>
<span> Service1 : ServiceBase
{
</span>
<span>public</span>
<span> Service1()
{
InitializeComponent();
}
</span>
<span>protected</span>
<span>override</span>
<span>void</span> OnStart(<span>string</span><span>[] args)
{
}
</span><span>protected</span><span>override</span><span>void</span><span> OnStop()
{
}
}</span>
OnStart:主要是写入要启动的逻辑代码
<span>OnStop:主要写的是停止服务时要执行的方法,也就是逻辑代码,我一般会将日志写在这<br /></span>
2,将service1.cs删除,新建一个Windows服务,并命名成公司要求的。例如我的是MailService.cs。
3,新建一个处理邮件的方法:
<span>public</span>
<span>void</span>
<span> SendMail()
{
</span>
<span>while</span>(<span>true</span><span>)
{
</span><span>//</span><span>这里写邮件数据获取以及发送邮件</span>
Thread.Sleep(<span>100</span><span>);
}
}</span>
4,构建邮件model:在解决方案点击鼠标右键添加新建项目,选择类库项目,MailModel,新建MailInfo.cs
<span>public</span>
<span>class</span>
<span> MailInfo
{
</span>
<span>public</span>
<span>string</span> mailId { <span>get</span>; <span>set</span><span>; }
</span><span>public</span><span>string</span>[] sendTo { <span>get</span>; <span>set</span><span>; }
</span><span>public</span><span>string</span> subject { <span>get</span>; <span>set</span><span>; }
</span><span>public</span><span>string</span> mailBody { <span>get</span>; <span>set</span><span>; }
}</span>
5,新建类库DbHelper,添加类Mail.cs,在里面写GetMailData()方法,RemoveMailData(),GetMailCount(),InsertMailData()等方法,这里由于涉及到公司的信息,不是很方便写出来。大家可以自行添加进去
<span>public</span>
<span> MailModel.MailInfo GetMailData()
{
</span>
<span>//</span>
<span>这里写获取邮件数据</span>
<span>return</span> MailInfo;<span>//</span><span>返回数据库第一封待发邮件数据</span><span>}
</span><span>public</span><span>void</span> RemoveMailData(<span>string</span><span> mailId)
{
</span><span>//</span><span>删除数据库中指定id的邮件数据</span><span>}
</span><span>public</span><span>long</span><span> GetMailCount()
{
</span><span>//</span><span>这里写获取邮件数量</span><span>return</span><span> 邮件数量
}
</span><span>public</span><span>bool</span><span> InsertMailData()
{
</span><span>//</span><span>这里写插入一封邮件数据</span><span>return</span><span>true</span><span>;
}</span>
6,新建类库WCF项目,添加wcf,名字为SendMail
添加完成之后VS会自动生成ISendMail.cs和SendMail.cs。打开ISendMail.cs会看到如下代码
<span>//</span>
<span> 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ISendMail”。</span>
<span>[ServiceContract]
</span>
<span>public</span>
<span>interface</span>
<span> ISendMail
{
[OperationContract]
</span>
<span>void</span>
<span> DoWork();
}</span>
里面只有一个DoWork方法,我们新建一个ApplySendMail();注意:在顶上要添加[OperationContract]否则不会公开该函数。最后的ISendMail.cs代码如下
<span>[ServiceContract]
</span>
<span>public</span>
<span>interface</span>
<span> ISendMail
{
[OperationContract]
</span>
<span>string</span> ApplySendMail(<span>string</span>[] sendTo, <span>string</span> subject, <span>string</span> body, <span>string</span><span> password);
}</span>
接着打开SendMail.cs,去实现接口的ApplySendMail()方法
<span>public</span>
<span>class</span>
<span> SendMail : ISendMail
{
</span>
<span>public</span>
<span>string</span> ApplySendMail(<span>string</span>[] sendTo, <span>string</span> subject, <span>string</span> body, <span>string</span><span> password)
{
</span><span>string</span> result = <span>string</span><span>.Empty;
</span><span>string</span> mailPassword = System.Configuration.ConfigurationManager.AppSettings[<span>"</span><span>password</span><span>"</span><span>];
</span><span>if</span> (mailPassword ==<span> password)
{
</span><span>try</span><span>
{
MailModel.MailInfo mail </span>= <span>new</span><span> MailModel.MailInfo
{
sendTo </span>=<span> sendTo,
subject </span>=<span> subject,
mailBody </span>=<span> body
};
</span><span>long</span> count =<span> DbHelper.Mail.GetMailCount();
</span><span>if</span><span> (DbHelper.Mail.InsertMailData(mail))
{
result </span>= <span>string</span>.Format(<span>"</span><span>提交成功.前面大約還有:{0}個任務</span><span>"</span><span>, count);
}
</span><span>return</span><span> result;
}
</span><span>catch</span><span>
{
</span><span>return</span><span>"</span><span>提交失敗</span><span>"</span><span>;
}
}
</span><span>else</span><span>
{
</span><span>return</span><span>"</span><span>密码错误,无法提交</span><span>"</span><span>;
}
}
}</span>
至此wcf基础已经可以了,下面继续完成Windows服务那一块
7,完成处理邮件的方法SendMail(),这里要添加之前写好的LoutusMailHelper.dll
<span>public</span>
<span>void</span>
<span> SendMail()
{
</span>
<span>while</span>(<span>true</span><span>)
{
</span><span>var</span> mailData=<span>DbHelper.Mail.GetMailData();
</span><span>if</span>(mailData!=<span>null</span><span>)
{
</span><span>if</span><span>(LotusMailHelper.Mail.SendMail(mailData.sendTo,mailData.subject,mailData.mailBody))
{
DbHelper.Mail.RemoveMailData(mailData.mailId);
}
Thread.Sleep(</span><span>100</span>);<span>//</span><span>休息0.1秒</span><span> }
</span><span>else</span><span>
{
Thread.Sleep(</span><span>10000</span>);<span>//</span><span>休息10秒钟</span><span> }
}
}</span>
8,完成OnStart()逻辑:①,先添加私有成员到MailService.cs
<span>partial</span>
<span>class</span>
<span> MailService : ServiceBase
{
</span>
<span>public</span>
<span> MailService()
{
InitializeComponent();
}
</span>
<span>private</span>
<span> System.ServiceModel.ServiceHost _host;
</span>
<span>/*</span>
<span>
此处省略部分代码
</span>
<span>*/</span>
<span>
}</span>
②,编写OnStart()代码
<span>protected</span>
<span>override</span>
<span>void</span> OnStart(<span>string</span><span>[] args)
{
_host </span>= <span>new</span> System.ServiceModel.ServiceHost(<span>typeof</span><span>(WCF.Mail));
_host.Open();
</span><span>//</span><span>启动wcf服务
</span><span>//</span><span>启动一个线程专门轮询发送邮件</span>
Thread sendMail = <span>new</span> Thread(<span>new</span><span> ThreadStart(SendMail));
sendMail.IsBackground </span>= <span>true</span><span>;
sendMail.Start();
}</span>
9,编写OnStop()代码,添加日志记录代码
10,配置App.config,wcf一定要配置。先看App.config中是否存在system.serviceModel节点,存在的话只需修改部分字段即可,不存在的话添加如下:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=<span>""</span>>
<serviceMetadata httpGetEnabled=<span>"</span><span>true</span><span>"</span> httpsGetEnabled=<span>"</span><span>true</span><span>"</span> />
<serviceDebug includeExceptionDetailInFaults=<span>"</span><span>false</span><span>"</span> />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name=<span>"</span><span>WCF.Mail</span><span>"</span>>
<endpoint address=<span>""</span> binding=<span>"</span><span>basicHttpBinding</span><span>"</span> contract=<span>"</span><span>WCF.IMail</span><span>"</span>>
<identity>
<dns value=<span>"</span><span>localhost</span><span>"</span> />
</identity>
</endpoint>
<endpoint address=<span>"</span><span>mex</span><span>"</span> binding=<span>"</span><span>mexHttpBinding</span><span>"</span> contract=<span>"</span><span>IMetadataExchange</span><span>"</span> />
<!--wcf节点配置开始-->
<host>
<baseAddresses>
<add baseAddress=<span>"</span><span>http://localhost:8733/MailService/Mail/</span><span>"</span> />
</baseAddresses>
</host>
<!--wcf节点配置结束-->
</service>
</services>
</system.serviceModel>
~~至此,基本的都已经完成,下面到Windows service部署
1,打开MailService.cs视图界面,添加安装程序。会自动出现如下界面:
选中serviceProcessInstaller1组件,查看属性,设置account为LocalSystem
选中serviceInstaller1组件,查看属性
设置ServiceName的值, 该值表示在系统服务中的名称
设置StartType, 如果为Manual则手动启动,默认停止,如果为Automatic为自动启动
设置Description,添加服务描述
2,重新生成项目
3,打开Windows的cmd,输入C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe exe路径
等待安装。安装完毕之后打开计算机管理,查看服务,点击启动。
***删除服务:sc delete 服务名
至此,所有步骤都完成了,可以畅快的调用wcf来发送系统邮件了
<<<<<<<<<<<<<由于本人水平有限,可能存在很多错误,请谅解与批评指正>>>>>>>>>>>>>>
百度经验 : C#创建Windows服务与安装-图解
推荐数据库使用nosql数据库,redis或者mongodb,在接下里的随笔里我会记录mongdb和redis的使用过程。。。第一次发文,紧张死宝宝了
原文:http://www.cnblogs.com/chuliam/p/lotusMail.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!