最近IBM LotusMailを勉強しましたが、会社の方針によりsmtpが開かれず、多くのシステムメールが送信できないことが判明し、GoogleからLotusMailを学習し始め、それをWindowsサービスにしたいと思いました。内部アプリケーション システムに wcf サービスを提供します。システムメールなので色々な情報がGoogleで見つかりました
最近調べたIBM Lotus Mail、この製品は本当に面倒で、会社のポリシーによりオープンされていませんsmtp、多くのシステムメールが送信できないので、googleLearningLotusを始めましたメール、私は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オブジェクトを追加します。
追加後、
VSは自動的にdllにコンパイルされます 2
、クラスMail.csを追加、メール送信メソッドSendMailを追加します: リーリー 3
、Mail.csにUsing:using Domino;を追加します。 4
、SendMailのロジックを書く リーリー 最終的にはdllとしてパッケージ化されるので、try...catch...を追加して最適化すると以下のようになります。
リーリー5. [プロジェクトの生成] をクリックし、Bin フォルダーで dll を見つけ、後で呼び出しやすいようにお気に入りのフォルダーに保存します。
============私はもっと美しいセパレーター==============
一緒にWindowsサービスを作りましょう
1. VS を開き、新しい Windows サービス プロジェクトを作成します
好きな名前を選択できます。 。 。新規作成が完了するとService1.csが自動生成されますので、Service1.csのコードを開いて確認してください。 リーリー リーリー リーリー
2. service1.cs を削除し、新しい Windows サービスを作成し、会社の必要に応じて名前を付けます。たとえば、私のものは MailService.cs です。3. 電子メールを処理するための新しいメソッドを作成します。 リーリー
4. 電子メール モデルを構築する: ソリューションを右クリックして新しいプロジェクトを追加し、クラス ライブラリ プロジェクト MailModel を選択して、新しい MailInfo.cs を作成します
リーリー5. 新しいクラスライブラリ DbHelper を作成し、クラス Mail.cs を追加し、その中に GetMailData() メソッド、RemoveMailData()、GetMailCount()、InsertMailData() などのメソッドを記述します。書き出すのはあまり便利ではありません。自分で追加することもできます
<span style="color: #0000ff;">public</span><span style="color: #000000;"> MailModel.MailInfo GetMailData() { </span><span style="color: #008000;">//</span><span style="color: #008000;">这里写获取邮件数据</span> <span style="color: #0000ff;">return</span> MailInfo;<span style="color: #008000;">//</span><span style="color: #008000;">返回数据库第一封待发邮件数据</span> <span style="color: #000000;">} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> RemoveMailData(<span style="color: #0000ff;">string</span><span style="color: #000000;"> mailId) { </span><span style="color: #008000;">//</span><span style="color: #008000;">删除数据库中指定id的邮件数据</span> <span style="color: #000000;">} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">long</span><span style="color: #000000;"> GetMailCount() { </span><span style="color: #008000;">//</span><span style="color: #008000;">这里写获取邮件数量</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> 邮件数量 } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> InsertMailData() { </span><span style="color: #008000;">//</span><span style="color: #008000;">这里写插入一封邮件数据</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; }</span>
6,新建类库WCF项目,添加wcf,名字为SendMail
添加完成之后VS会自动生成ISendMail.cs和SendMail.cs。打开ISendMail.cs会看到如下代码
<span style="color: #008000;">//</span><span style="color: #008000;"> 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ISendMail”。</span> <span style="color: #000000;">[ServiceContract] </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">interface</span><span style="color: #000000;"> ISendMail { [OperationContract] </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> DoWork(); }</span>
里面只有一个DoWork方法,我们新建一个ApplySendMail();注意:在顶上要添加[OperationContract]否则不会公开该函数。最后的ISendMail.cs代码如下
<span style="color: #000000;">[ServiceContract] </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">interface</span><span style="color: #000000;"> ISendMail { [OperationContract] </span><span style="color: #0000ff;">string</span> ApplySendMail(<span style="color: #0000ff;">string</span>[] sendTo, <span style="color: #0000ff;">string</span> subject, <span style="color: #0000ff;">string</span> body, <span style="color: #0000ff;">string</span><span style="color: #000000;"> password); }</span>
接着打开SendMail.cs,去实现接口的ApplySendMail()方法
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> SendMail : ISendMail { </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> ApplySendMail(<span style="color: #0000ff;">string</span>[] sendTo, <span style="color: #0000ff;">string</span> subject, <span style="color: #0000ff;">string</span> body, <span style="color: #0000ff;">string</span><span style="color: #000000;"> password) { </span><span style="color: #0000ff;">string</span> result = <span style="color: #0000ff;">string</span><span style="color: #000000;">.Empty; </span><span style="color: #0000ff;">string</span> mailPassword = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">password</span><span style="color: #800000;">"</span><span style="color: #000000;">]; </span><span style="color: #0000ff;">if</span> (mailPassword ==<span style="color: #000000;"> password) { </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { MailModel.MailInfo mail </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> MailModel.MailInfo { sendTo </span>=<span style="color: #000000;"> sendTo, subject </span>=<span style="color: #000000;"> subject, mailBody </span>=<span style="color: #000000;"> body }; </span><span style="color: #0000ff;">long</span> count =<span style="color: #000000;"> DbHelper.Mail.GetMailCount(); </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (DbHelper.Mail.InsertMailData(mail)) { result </span>= <span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">提交成功.前面大約還有:{0}個任務</span><span style="color: #800000;">"</span><span style="color: #000000;">, count); } </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result; } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">return</span> <span style="color: #800000;">"</span><span style="color: #800000;">提交失敗</span><span style="color: #800000;">"</span><span style="color: #000000;">; } } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">return</span> <span style="color: #800000;">"</span><span style="color: #800000;">密码错误,无法提交</span><span style="color: #800000;">"</span><span style="color: #000000;">; } } }</span>
至此wcf基础已经可以了,下面继续完成Windows服务那一块
7,完成处理邮件的方法SendMail(),这里要添加之前写好的LoutusMailHelper.dll
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> SendMail() { </span><span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">var</span> mailData=<span style="color: #000000;">DbHelper.Mail.GetMailData(); </span><span style="color: #0000ff;">if</span>(mailData!=<span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(LotusMailHelper.Mail.SendMail(mailData.sendTo,mailData.subject,mailData.mailBody)) { DbHelper.Mail.RemoveMailData(mailData.mailId); } Thread.Sleep(</span><span style="color: #800080;">100</span>);<span style="color: #008000;">//</span><span style="color: #008000;">休息0.1秒</span> <span style="color: #000000;"> } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> { Thread.Sleep(</span><span style="color: #800080;">10000</span>);<span style="color: #008000;">//</span><span style="color: #008000;">休息10秒钟</span> <span style="color: #000000;"> } } }</span>
8,完成OnStart()逻辑:①,先添加私有成员到MailService.cs
<span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> MailService : ServiceBase { </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> MailService() { InitializeComponent(); } </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> System.ServiceModel.ServiceHost _host; </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 此处省略部分代码 </span><span style="color: #008000;">*/</span><span style="color: #000000;"> }</span>
②,编写OnStart()代码
<span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> OnStart(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args) { _host </span>= <span style="color: #0000ff;">new</span> System.ServiceModel.ServiceHost(<span style="color: #0000ff;">typeof</span><span style="color: #000000;">(WCF.Mail)); _host.Open(); </span><span style="color: #008000;">//</span><span style="color: #008000;">启动wcf服务 </span><span style="color: #008000;">//</span><span style="color: #008000;">启动一个线程专门轮询发送邮件</span> Thread sendMail = <span style="color: #0000ff;">new</span> Thread(<span style="color: #0000ff;">new</span><span style="color: #000000;"> ThreadStart(SendMail)); sendMail.IsBackground </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">; sendMail.Start(); }</span>
9,编写OnStop()代码,添加日志记录代码
10,配置App.config,wcf一定要配置。先看App.config中是否存在system.serviceModel节点,存在的话只需修改部分字段即可,不存在的话添加如下:
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=<span style="color: #800000;">""</span>> <serviceMetadata httpGetEnabled=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span> httpsGetEnabled=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span> /> <serviceDebug includeExceptionDetailInFaults=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span> /> </behavior> </serviceBehaviors> </behaviors> <services> <service name=<span style="color: #800000;">"</span><span style="color: #800000;">WCF.Mail</span><span style="color: #800000;">"</span>> <endpoint address=<span style="color: #800000;">""</span> binding=<span style="color: #800000;">"</span><span style="color: #800000;">basicHttpBinding</span><span style="color: #800000;">"</span> contract=<span style="color: #800000;">"</span><span style="color: #800000;">WCF.IMail</span><span style="color: #800000;">"</span>> <identity> <dns value=<span style="color: #800000;">"</span><span style="color: #800000;">localhost</span><span style="color: #800000;">"</span> /> </identity> </endpoint> <endpoint address=<span style="color: #800000;">"</span><span style="color: #800000;">mex</span><span style="color: #800000;">"</span> binding=<span style="color: #800000;">"</span><span style="color: #800000;">mexHttpBinding</span><span style="color: #800000;">"</span> contract=<span style="color: #800000;">"</span><span style="color: #800000;">IMetadataExchange</span><span style="color: #800000;">"</span> /> <!--wcf节点配置开始--> <host> <baseAddresses> <add baseAddress=<span style="color: #800000;">"</span><span style="color: #800000;">http://localhost:8733/MailService/Mail/</span><span style="color: #800000;">"</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:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe exe路径
等待安装。安装完毕之后打开计算机管理,查看服务,点击启动。
***删除服务:sc delete 服务名
至此,所有步骤都完成了,可以畅快的调用wcf来发送系统邮件了
<<<<<<<<<<<<<由于本人水平有限,可能存在很多错误,请谅解与批评指正>>>>>>>>>>>>>>
百度经验 : C#创建Windows服务与安装-图解
推荐数据库使用nosql数据库,redis或者mongodb,在接下里的随笔里我会记录mongdb和redis的使用过程。。。第一次发文,紧张死宝宝了