php教程 php手册 C#WindowsService调用IBMLotusNotes发送邮件

C#WindowsService调用IBMLotusNotes发送邮件

Jul 06, 2016 pm 01:30 PM
부르다

近日研究了下 IBMLotusMail ,这货果然是麻烦,由于公司策略,没有开放 smtp ,很多系统邮件都没有办法发送,于是入手 google 学习 LotusMail ,想做成 Windows 服务,提供 wcf 服务给内部应用系统使用。在 google 上找了很多资料,由于是系统邮件,很多东西

近日研究了下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 style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>

<span style="color: #808080;">///</span><span style="color: #008000;"> 发送邮件

</span><span style="color: #808080;">///</span> <span style="color: #808080;"></span>

<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="sendTo"></span>

<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="subject"></span>

<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="messageBody"></span>

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> SendMail(<span style="color: #0000ff;">string</span>[] sendTo, <span style="color: #0000ff;">string</span> subject, <span style="color: #0000ff;">string</span> messageBody)
로그인 후 복사

3,在Mail.cs添加Using:using Domino;

4,编写SendMail的逻辑

Domino.Notessession nSession = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Domino.NotesSession();
</span><span style="color: #0000ff;">string</span> pwd = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailPassWord</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">lotus邮箱密码</span>
<span style="color: #0000ff;">string</span> server = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailServer</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">lotus邮箱服务器地址</span>
<span style="color: #0000ff;">string</span> serverPath = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailServerPath</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">存储nsf文件的路径</span>
<span style="color: #0000ff;">string</span> saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">SaveMessageOnSend</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">发送前是否保存</span>
nSession.Initialize(pwd);<span style="color: #008000;">//</span><span style="color: #008000;">初始化邮件</span>
Domino.NotesDatabase nDatabase =<span style="color: #000000;">
nSession.GetDatabase(server, serverPath, </span><span style="color: #0000ff;">false</span><span style="color: #000000;">);
Domino.NotesDocument nDocument </span>=<span style="color: #000000;"> nDatabase.CreateDocument();
nDocument.ReplaceItemValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">SentTo</span><span style="color: #800000;">"</span>, sendTo);<span style="color: #008000;">//</span><span style="color: #008000;">收件人,数据:数组</span>
nDocument.ReplaceItemValue(<span style="color: #800000;">"</span><span style="color: #800000;">Subject</span><span style="color: #800000;">"</span>, subject);<span style="color: #008000;">//</span><span style="color: #008000;">主题</span>
<span style="color: #0000ff;">if</span> (saveMessageOnSend == <span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>)<span style="color: #008000;">//</span><span style="color: #008000;">为1时保存到lotus的发件箱</span>
<span style="color: #000000;">{
    nDocument.SaveMessageOnSend </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
    nDocument.SaveMessageOnSend </span>= <span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">设置保存与否</span>
<span style="color: #000000;">}
NotesStream HtmlBody </span>=<span style="color: #000000;"> nSession.CreateStream();
HtmlBody.WriteText(messageBody);</span><span style="color: #008000;">//</span><span style="color: #008000;">构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语</span>
NotesMIMEEntity mine = nDocument.CreateMIMEEntity(<span style="color: #800000;">"</span><span style="color: #800000;">Body</span><span style="color: #800000;">"</span>);<span style="color: #008000;">//</span><span style="color: #008000;">构建邮件正文</span>
mine.SetContentFromText(HtmlBody, <span style="color: #800000;">"</span><span style="color: #800000;">text/html;charset=UTF-8</span><span style="color: #800000;">"</span><span style="color: #000000;">, Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
nDocument.AppendItemValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">PRincipal</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">XXX管理员</span><span style="color: #800000;">"</span>);<span style="color: #008000;">//</span><span style="color: #008000;">设置邮件的发件人昵称</span>
nDocument.Send(<span style="color: #0000ff;">false</span>, sendTo); <span style="color: #008000;">//</span><span style="color: #008000;">发送邮件</span>
nDocument.CloseMIMEEntities();<span style="color: #008000;">//</span><span style="color: #008000;">关闭</span>
로그인 후 복사

由于最后会封装为dll,最好是添加try...catch...,加以优化,下面为优化过后:

<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 發送lotus郵件(需要在web.config或者app.config中添加以下節點
</span><span style="color: #808080;">///</span><span style="color: #808080;"><appsettings></appsettings></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><!--郵箱密碼--></span>
<span style="color: #808080;">///</span><span style="color: #808080;"><add key="LotusMailPassword" value=""></add></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><!--郵件服務器地址--></span>
<span style="color: #808080;">///</span><span style="color: #808080;"><add key="LotusMailServer" value=""></add></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><!--郵件數據庫路徑--></span>
<span style="color: #808080;">///</span><span style="color: #808080;"><add key="LotusMailServerPath" value=""></add></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><!--是否保存到發件箱(0不保存,1保存,其他值皆為不保存)--></span>
<span style="color: #808080;">///</span><span style="color: #808080;"><add key="SaveMessageOnSend" value="0"></add></span>
<span style="color: #808080;">///</span><span style="color: #808080;"></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="sendTo"></span><span style="color: #008000;">數組,收件人</span><span style="color: #808080;"></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="subject"></span><span style="color: #008000;">主題</span><span style="color: #808080;"></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="messageBody"></span><span style="color: #008000;">正文html</span><span style="color: #808080;"></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> SendMail(<span style="color: #0000ff;">string</span>[] sendTo, <span style="color: #0000ff;">string</span> subject, <span style="color: #0000ff;">string</span><span style="color: #000000;"> messageBody)
{
    </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
    {
        Domino.NotesSession nSession </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Domino.NotesSession();
        </span><span style="color: #0000ff;">string</span> pwd = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailPassword</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">lotus邮箱密码</span>
        <span style="color: #0000ff;">string</span> server = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailServer</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">lotus邮箱服务器地址</span>
        <span style="color: #0000ff;">string</span> serverPath = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">LotusMailServerPath</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">存储nsf文件的路径</span>
        <span style="color: #0000ff;">string</span> saveMessageOnSend = System.Configuration.ConfigurationManager.AppSettings[<span style="color: #800000;">"</span><span style="color: #800000;">SaveMessageOnSend</span><span style="color: #800000;">"</span>];<span style="color: #008000;">//</span><span style="color: #008000;">发送前是否保存</span>
        nSession.Initialize(pwd);<span style="color: #008000;">//</span><span style="color: #008000;">初始化邮件</span>
        Domino.NotesDatabase nDatabase =<span style="color: #000000;">
        nSession.GetDatabase(server, serverPath, </span><span style="color: #0000ff;">false</span><span style="color: #000000;">);
        Domino.NotesDocument nDocument </span>=<span style="color: #000000;"> nDatabase.CreateDocument();
        nDocument.ReplaceItemValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">SentTo</span><span style="color: #800000;">"</span>, sendTo);<span style="color: #008000;">//</span><span style="color: #008000;">收件人,数据:数组</span>
        nDocument.ReplaceItemValue(<span style="color: #800000;">"</span><span style="color: #800000;">Subject</span><span style="color: #800000;">"</span>, subject);<span style="color: #008000;">//</span><span style="color: #008000;">主题</span>
        <span style="color: #0000ff;">if</span> (saveMessageOnSend == <span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>)<span style="color: #008000;">//</span><span style="color: #008000;">为1时保存到lotus的发件箱</span>
<span style="color: #000000;">        {
            nDocument.SaveMessageOnSend </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
        {
            nDocument.SaveMessageOnSend </span>= <span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">设置保存与否</span>
<span style="color: #000000;">        }
        NotesStream HtmlBody </span>=<span style="color: #000000;"> nSession.CreateStream();
        HtmlBody.WriteText(messageBody);</span><span style="color: #008000;">//</span><span style="color: #008000;">构建HTML邮件,可以在头和尾添加公司的logo和系统提醒语</span>
        NotesMIMEEntity mine = nDocument.CreateMIMEEntity(<span style="color: #800000;">"</span><span style="color: #800000;">Body</span><span style="color: #800000;">"</span>);<span style="color: #008000;">//</span><span style="color: #008000;">构建邮件正文</span>
        mine.SetContentFromText(HtmlBody, <span style="color: #800000;">"</span><span style="color: #800000;">text/html;charset=UTF-8</span><span style="color: #800000;">"</span><span style="color: #000000;">, Domino.MIME_ENCODING.ENC_IDENTITY_BINARY);
        nDocument.AppendItemValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">Principal</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">XXX管理员</span><span style="color: #800000;">"</span>);<span style="color: #008000;">//</span><span style="color: #008000;">设置邮件的发件人昵称</span>
        nDocument.Send(<span style="color: #0000ff;">false</span>, sendTo); <span style="color: #008000;">//</span><span style="color: #008000;">发送邮件</span>
        nDocument.CloseMIMEEntities();<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: #008000;">//</span><span style="color: #008000;">已经提交到lotus,返回true</span>
<span style="color: #000000;">    }
    </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">
    {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">提交失败</span>
<span style="color: #000000;">    }
}</span>
로그인 후 복사

5,点击项目生成,找到Bin文件夹中的dll,保存到自己喜欢的文件夹,方便后期的调用

============我是更加优美的分隔符=============

下面一起来建立Windows service

1,打开VS,新建Windows服务项目

 名字随便取。。。新建完成之后会自动生成Service1.cs,打开Service1.cs代码看看,主要分为以下几个方法:

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Service1 : ServiceBase
{
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Service1()
    {
        InitializeComponent();
    }
    
    </span><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)
    {
    }
    
    </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> OnStop()
    {
    }
}</span>
로그인 후 복사
OnStart:主要是写入要启动的逻辑代码
로그인 후 복사
<span>OnStop:主要写的是停止服务时要执行的方法,也就是逻辑代码,我一般会将日志写在这<br></span>
로그인 후 복사

2,将service1.cs删除,新建一个Windows服务,并命名成公司要求的。例如我的是MailService.cs。

3,新建一个处理邮件的方法:

<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: #008000;">//</span><span style="color: #008000;">这里写邮件数据获取以及发送邮件</span>
        Thread.Sleep(<span style="color: #800080;">100</span><span style="color: #000000;">);
    }   
}</span>
로그인 후 복사

4,构建邮件model:在解决方案点击鼠标右键添加新建项目,选择类库项目,MailModel,新建MailInfo.cs

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> MailInfo
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailId { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span>[] sendTo { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> subject { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailBody { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
}</span>
로그인 후 복사

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;">"">
          <servicemetadata httpgetenabled="<span" style="color: #800000;">"<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 style="color: #800000;">false</span><span style="color: #800000;">"</span> />
        </servicedebug></servicemetadata></behavior>
      </servicebehaviors>
    </behaviors>
    <services>
      <service name="<span" style="color: #800000;">"<span style="color: #800000;">WCF.Mail</span><span style="color: #800000;">"</span>>
        <endpoint address="<span" style="color: #800000;">"" 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 style="color: #800000;">localhost</span><span style="color: #800000;">"</span> />
          </dns></identity>
        </endpoint>
        <endpoint address="<span" style="color: #800000;">"<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 style="color: #800000;">http://localhost:8733/MailService/Mail/</span><span style="color: #800000;">"</span> />
          </add></baseaddresses>
        </host>
        <!--wcf节点配置结束-->
      </endpoint></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的使用过程。。。第一次发文,紧张死宝宝了

 


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법은 무엇입니까? Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법은 무엇입니까? Jul 31, 2023 pm 03:01 PM

Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법은 무엇입니까? 인터넷의 발달로 지리적 위치정보의 획득과 활용이 점점 더 중요해지고 있다. Baidu Maps는 다양한 지리적 위치 쿼리 서비스를 제공하는 매우 일반적이고 실용적인 지도 애플리케이션입니다. 이 글에서는 Python을 사용하여 Baidu Map API를 호출하여 지리적 위치 쿼리 기능을 구현하는 방법을 소개하고 코드 예제를 첨부합니다. 바이두 지도 개발자 계정 및 애플리케이션 신청 먼저 바이두 지도 개발자 계정이 있어야 하고 애플리케이션을 만들어야 합니다. 로그인

소스 코드 탐색: Python에서 객체는 어떻게 호출되나요? 소스 코드 탐색: Python에서 객체는 어떻게 호출되나요? May 11, 2023 am 11:46 AM

웨지 우리는 객체가 두 가지 주요 방법으로 생성된다는 것을 알고 있습니다. 하나는 Python/CAPI를 사용하는 것이고, 다른 하나는 유형 객체를 호출하는 것입니다. 내장 유형의 인스턴스 객체의 경우 두 가지 방법이 모두 지원됩니다. 예를 들어 목록은 [] 또는 list()를 통해 생성할 수 있으며 전자는 Python/CAPI이고 후자는 호출 유형 객체입니다. 그러나 사용자 정의 클래스의 인스턴스 객체의 경우 유형 객체를 호출해야만 생성할 수 있습니다. 객체를 호출할 수 있으면 해당 객체는 호출 가능하고, 그렇지 않으면 호출할 수 없습니다. 객체가 호출 가능한지 여부는 해당 유형 객체에 메서드가 정의되어 있는지 여부에 따라 결정됩니다. 좋다

PHP 카메라 호출 기술: 다중 카메라 전환 구현 방법 PHP 카메라 호출 기술: 다중 카메라 전환 구현 방법 Aug 04, 2023 pm 07:07 PM

PHP 카메라 호출 기술: 여러 대의 카메라 간을 전환하는 방법 카메라 애플리케이션은 화상 회의, 실시간 모니터링 등과 같은 많은 웹 애플리케이션에서 중요한 부분이 되었습니다. PHP에서는 다양한 기술을 사용하여 카메라를 호출하고 작동할 수 있습니다. 이 기사에서는 다중 카메라 전환을 구현하는 방법에 중점을 두고 독자의 이해를 돕기 위해 몇 가지 샘플 코드를 제공합니다. 카메라 호출의 기본 PHP에서는 JavaScript API를 호출하여 카메라를 호출할 수 있습니다. 구체적으로 우리는

PHP 개발 시 외부 리소스 액세스 및 호출을 해결하는 방법 PHP 개발 시 외부 리소스 액세스 및 호출을 해결하는 방법 Oct 08, 2023 am 11:01 AM

PHP 개발에서 외부 리소스에 액세스하고 호출하는 문제를 해결하려면 특정 코드 예제가 필요합니다. PHP 개발에서는 API 인터페이스, 타사 라이브러리 또는 기타 서버 리소스와 같은 외부 리소스에 액세스하고 호출해야 하는 상황에 자주 직면합니다. . 이러한 외부 리소스를 처리할 때 성능과 안정성을 보장하면서 안전하게 액세스하고 호출하는 방법을 고려해야 합니다. 이 문서에서는 몇 가지 일반적인 솔루션을 설명하고 해당 코드 예제를 제공합니다. 1. 컬 라이브러리를 사용하여 외부 리소스를 호출합니다. 컬은 매우 강력한 오픈 소스 라이브러리입니다.

Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법은 무엇입니까? Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법은 무엇입니까? Aug 02, 2023 pm 08:27 PM

Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법은 무엇입니까? 인터넷의 급속한 발전으로 지도 애플리케이션은 우리 삶에 없어서는 안 될 부분이 되었습니다. 중국 최대 지도 애플리케이션 중 하나인 Baidu 지도는 지도 표시 기능을 쉽게 실현할 수 있는 풍부한 서비스와 API 인터페이스를 제공합니다. 이 기사에서는 Python 프로그래밍을 통해 Baidu Map API를 호출하여 지도 표시 기능을 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다. 먼저, 우리는

matlab에서 m개의 파일을 호출하는 방법-matlab에서 m개의 파일을 호출하는 방법 matlab에서 m개의 파일을 호출하는 방법-matlab에서 m개의 파일을 호출하는 방법 Mar 04, 2024 pm 01:49 PM

아직 matlab에서 m 파일을 호출하는 방법을 모르는 친구들이 많으므로, 아래 에디터에서 matlab에서 m 파일을 호출하는 방법을 설명하고 있으니, 꼭 참고해 보시기 바랍니다. 1. 먼저 MATLAB 소프트웨어를 열고 아래 그림과 같이 메인 인터페이스에서 "열기"를 클릭합니다. 2. 그런 다음 열려고 하는 m 파일을 선택하고 아래 그림과 같이 열기를 선택합니다. 3. 그런 다음 아래 그림과 같이 편집기에서 m 파일의 파일 이름과 변수 개수를 확인합니다. 4. 아래 그림과 같이 명령줄에 m 파일 이름과 괄호 안에 변수 값을 입력하여 호출할 수 있습니다. 5. 마지막으로 아래 그림과 같이 m 파일을 성공적으로 호출할 수 있습니다. 위는 편집자가 가져온 matlab에서 m 파일을 호출하는 방법에 대한 전체 설명입니다.

Java를 사용하여 WebService를 호출하는 방법 Java를 사용하여 WebService를 호출하는 방법 Dec 29, 2023 pm 02:32 PM

Java를 사용하여 WebService를 호출하는 방법 단계에는 특정 코드 예제가 필요합니다. 웹 서비스는 네트워크를 통해 다양한 기능을 제공하는 웹 기반 응용 프로그램 인터페이스입니다. Java 개발에서는 다른 시스템과 상호 작용하기 위해 웹 서비스를 사용해야 하는 경우가 많습니다. 이 기사에서는 Java를 사용하여 WebService를 호출하는 방법을 소개하고 특정 코드 예제를 제공합니다. 1. WebService 이해 WebService는 XML 형식을 사용하는 표준화된 통신 프로토콜입니다.

Laravel 연습: 컨트롤러 메소드를 올바르게 호출하는 방법은 무엇입니까? Laravel 연습: 컨트롤러 메소드를 올바르게 호출하는 방법은 무엇입니까? Mar 10, 2024 pm 01:15 PM

Laravel 연습: 컨트롤러 메소드를 올바르게 호출하는 방법은 무엇입니까? Laravel 프레임워크에서 컨트롤러는 라우팅과 모델 사이의 가교 역할을 하는 중요한 구성 요소입니다. 컨트롤러의 메서드는 라우팅 요청을 처리하고, 처리를 위해 데이터를 모델에 전달한 다음, 사용자에게 표시하기 위해 뷰로 반환하는 데 사용됩니다. 따라서 컨트롤러 메서드를 올바르게 호출하는 것은 프로그램 기능을 구현하는 데 중요합니다. 이 글에서는 Laravel에서 컨트롤러 메소드를 올바르게 호출하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

See all articles