当前位置:首页 > 操作系统 > Windows

杂记2:VS2013创建Windows服务实现自动发送邮件

这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件。

开发环境:VS2013,SQL Server2008,采用C#语言开发

 

步骤一:创建Windows服务项目

首先,有人提问VS2013找不到创建Windows服务项目的选项, 答案是在“Windows 桌面”目录下:

技术分享

 

步骤二:重命名服务,添加Timer组件

重命名默认创建的Service1服务,比如MyMailService;然后在设计界面添加Timer组件。

这里要注意,VS工具箱默认提供的是System.Windows.Forms.Timer组件,在windows服务中是无法执行的。我们要添加的是System.Timers.Timer组件!

首先,在工具箱空白位置右键打开“选择项”菜单,如下在“.NET Framework组件”页下找到并勾选“Timer”:

技术分享

然后将从工具箱找到你添加的Timer组件(可利用搜索功能),拖放到编辑区域;

接着,按照你的需要设置Timer的执行间隔,单位是毫秒,比如我是60000,一分钟执行一次。

 

步骤三:实现服务启动和停止功能

打开MyMailService的代码编辑界面,默认包含3个方法:构造函数、OnStrat和OnStop。

OnStart和OnStop分别对应服务的启动和终止;此外还有OnPause和OnContinue方法,分别对应服务的暂停和继续。

现在,修改代码如下,在服务启动和停止的时候启动和停止Timer定时器:

            <span>public</span>
            <span> MyMailService()
{
    InitializeComponent();

    </span>
            <span>base</span>.AutoLog = <span>false</span>; <span>//</span><span> 不记录windows事件日志</span><span>base</span>.ServiceName = <span>"</span><span>MyMailService</span><span>"</span><span>;

    timer1.Stop();
}

</span><span>protected</span><span>override</span><span>void</span> OnStart(<span>string</span><span>[] args)
{
    timer1.Start();
}

</span><span>protected</span><span>override</span><span>void</span><span> OnStop()
{
    timer1.Stop();
}</span>

 

步骤四:实现Timer邮件发送功能

C#发送邮件的例子网上很多,用到System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient。

我按照自己的使用习惯,封装了一个Mail对象:

            <span>public</span>
            <span>class</span>
            <span> Mail
{
    </span>
            <span>private</span>
            <span>string</span> DefaultHost = <span>"</span><span>smtp.mail.qq.com</span><span>"</span><span>; <span>// SMTP服务器,这里是QQ邮箱
    </span></span><span>private</span><span>string</span> DefaultFMAddress = <span>"396042321</span><span>@qq.com</span><span>"</span><span>; <span>// 邮箱用户名
    </span></span><span>private</span><span>string</span> DefaultName = <span>"默认发送人</span><span>"</span><span>;
    </span><span>private</span><span>string</span> DefaultPassword = <span>"XXXXX</span><span>"</span><span>; <span>// 邮箱密码
    </span></span><span>private</span><span>string</span> DefaultSubject = <span>"</span><span>系统邮件</span><span>"</span><span>;<br /></span><span>private</span><span> MailMessage MMsg;
    </span><span>private</span><span> NetworkCredential NC;

    </span><span>public</span><span> Mail()
    {
        MMsg </span>= <span>new</span><span> MailMessage();
        MMsg.From </span>= <span>new</span><span> MailAddress(DefaultFMAddress, DefaultName);
        MMsg.Subject </span>=<span> DefaultSubject;
        MMsg.Priority </span>=<span> MailPriority.Normal;
        MMsg.DeliveryNotificationOptions </span>=<span> DeliveryNotificationOptions.OnSuccess;

        NC </span>= <span>new</span><span> NetworkCredential();
        NC.UserName </span>=<span> DefaultFMAddress;
        NC.Password </span>=<span> DefaultPassword;
    }

    </span><span>///</span><span><summary></span><span>设置发件人</span><span></summary></span><span>///</span><span><param name="fmAddress"></span><span>发件人邮箱</span><span></param></span><span>///</span><span><param name="fmName"></span><span>发件人别名</span><span></param></span><span>public</span><span>void</span> setFrom(<span>string</span> fmAddress, <span>string</span><span> fmName)
    { MMsg.From </span>= <span>new</span><span> MailAddress(fmAddress, fmName); }

    </span><span>///</span><span><summary></span><span>添加收件人</span><span></summary></span><span>///</span><span><param name="toAddress"></span><span>收件人地址</span><span></param></span><span>public</span><span>void</span> AddTo(<span>string</span><span> toAddress)
    {
        </span><span>string</span>[] adds = toAddress.Split(<span>‘</span><span>,</span><span>‘</span><span>);
        </span><span>foreach</span> (<span>string</span> add <span>in</span><span> adds)
            </span><span>if</span> (!<span>string</span><span>.IsNullOrEmpty(add))
                MMsg.To.Add(add);
    }

    </span><span>///</span><span><summary></span><span>添加抄送人</span><span></summary></span><span>///</span><span><param name="ccAddress"></span><span>抄送人地址</span><span></param></span><span>public</span><span>void</span> AddCC(<span>string</span><span> ccAddress)
    {
        </span><span>if</span> (!<span>string</span><span>.IsNullOrEmpty(ccAddress))
            MMsg.CC.Add(ccAddress);
    }

    </span><span>///</span><span><summary></span><span>邮件主题</span><span></summary></span><span>public</span><span>string</span><span> Subject
    { </span><span>set</span> { MMsg.Subject =<span> value; } }

    </span><span>///</span><span><summary></span><span>邮件正文</span><span></summary></span><span>public</span><span>string</span><span> Content
    {
        </span><span>set</span><span>
        {
            MMsg.Body </span>=<span> value;
            MMsg.BodyEncoding </span>=<span> System.Text.Encoding.UTF8;
            MMsg.IsBodyHtml </span>= <span>true</span><span>;
        }
    }

    </span><span>///</span><span><summary></span><span>添加附件:文件名UTF8编码不得超过41字节,否则附件无法打开</span><span></summary></span><span>///</span><span><param name="path"></span><span>附件的物理路径</span><span></param></span><span>public</span><span>void</span> AddAttchment(<span>string</span><span> path)
    {
        </span><span>if</span> (!<span>string</span><span>.IsNullOrEmpty(path))
        {
            </span><span>string</span>[] atts = path.Split(<span>‘</span><span>,</span><span>‘</span><span>);
            </span><span>foreach</span> (<span>string</span> att <span>in</span><span> atts)
            {
                </span><span>if</span> (!<span>System.IO.File.Exists(att))
                    </span><span>throw</span><span>new</span> Exception(<span>"</span><span>找不到附件:</span><span>"</span> +<span> att);
                </span><span>else</span><span>
                    MMsg.Attachments.Add(</span><span>new</span><span> Attachment(att));
            }
        }
    }

    </span><span>///</span><span><summary></span><span>发送级别</span><span></summary></span><span>public</span><span> MailPriority Priority
    { </span><span>set</span> { MMsg.Priority =<span> value; } }

    </span><span>///</span><span><summary></span><span>发送邮件</span><span></summary></span><span>public</span><span>void</span><span> Send()
    {
        SmtpClient sc </span>= <span>new</span><span> SmtpClient();
        sc.UseDefaultCredentials </span>= <span>true</span><span>;
        sc.DeliveryMethod </span>=<span> SmtpDeliveryMethod.Network;
        sc.Credentials </span>=<span> NC;
        sc.Host </span>=<span> DefaultHost;
        sc.Send(MMsg);
         MMsg.Dispose(); </span><span>//</span><span> 发送邮件后释放对象</span><span>    }
}</span>

Timer的代码:

            <span>private</span>
            <span>void</span> timer1_Elapsed(<span>object</span><span> sender, System.Timers.ElapsedEventArgs e)
{
    Mail mail </span>= <span>new</span><span> Mail();
    mail.AddTo(</span><span>"</span><span>396042321@qq.com</span><span>"</span>); <span>//</span><span> 收件人</span>
    mail.AddCC(<span>"</span><span>396042321@qq.com</span><span>"</span>); <span>//</span><span> 抄送人</span>
    mail.Subject = <span>"</span><span>主题</span><span>"</span><span>;
    mail.Content </span>= <span>"</span><span>邮件正文</span><span>"</span><span>;
    mail.AddAttchment(</span><span>"</span><span>C:	est.txt</span><span>"</span>); <span>//</span><span> 附件</span><span>    mail.Send();
}</span>

 

步骤五:添加服务安装程序

打开MyMailService的设计视图,在空白位置右键选择“添加安装程序”,VS自动创建一个ProjectInstaller。

设置serviceProcessInstaller1的Account属性为LocalSystem;

设置serviceInstaller1的ServiceName为MyMailService,StartType为Automatic,Description为“用于自动发送电子邮件”,DisplayName为“定时发送邮件服务”

(这里若设置DelayedAutoStart为True,则服务在系统启动一段时候后自动启动,否则在系统启动时启动)

 

步骤六:生成项目,安装到系统服务

选中项目右键选择“生成”,生成exe文件;

然后在生成目录下新建“安装.bat”文件,使用记事本打开,输入如下命令:

C:WindowsMicrosoft.NETFrameworkv4.<span>0.30319</span><span>InstallUtil.exe CYWinService.exe
pause</span>

注意:这里要填写你的InstallUtil.exe的所在路径

最后双击安装.bat文件,就完成服务注册了。

在我的电脑上右键选择“管理”,打开“服务和应用程序”下的“服务”,就能看到我们注册的服务了。

 

后记:

(1)如何卸载我注册的Windows服务?

在生成目录下新建“卸载.bat”文件,输入如下命令:

C:WindowsMicrosoft.NETFrameworkv4.<span>0.30319</span>InstallUtil.exe /<span>u CYWinService.exe
pause</span>

双击执行卸载.bat文件,即可卸载服务。

(2)改进:从数据库读取要发送的邮件信息,然后定时发送

修改Timer的代码改为动态读取即可,具体代码就不贴了,我的表结构是:

            <span>TABLE</span>
            <span>[</span>
            <span>dbo</span>
            <span>]</span>.<span>[</span><span>t_SYS_Mail</span><span>]</span><span>(
    </span><span>[</span><span>ID</span><span>]</span><span>[</span><span>int</span><span>]</span><span>IDENTITY</span>(<span>1</span>,<span>1</span>) <span>NOT</span><span>NULL</span><span>,<br /><span>[FmSMTP]</span><span>[varchar]</span>(50) <span>NULL</span>, <span>-- 邮箱SMTP
    </span></span><span>[</span><span>FmWho</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>50</span>) <span>NULL</span><span>, <span>-- 发送人邮箱
    </span></span><span>[</span><span>FmPassword</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>50</span>) <span>NULL</span><span>, <span>-- 发送人邮箱密码
    </span></span><span>[</span><span>FmName</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>50</span>) <span>NULL</span><span>, <span>-- 显示的发送人名称
    </span></span><span>[</span><span>ToWho</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>100</span>) <span>NOT</span><span>NULL</span><span>, <span>-- 收件人
    </span></span><span>[</span><span>CCWho</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>100</span>) <span>NULL</span><span>, <span>-- 抄送人
    </span></span><span>[</span><span>MailSubject</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>100</span>) <span>NOT</span><span>NULL</span><span>, <span>-- 主题
    </span></span><span>[</span><span>MailContent</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>500</span>) <span>NOT</span><span>NULL</span><span>, <span>-- 正文
    </span></span><span>[</span><span>MailPriority</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>50</span>) <span>NULL</span><span>, <span>-- 优先级
    </span></span><span>[</span><span>MailAttchments</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>500</span>) <span>NULL</span><span>, <span>-- 附件
    </span></span><span>[</span><span>AddTime</span><span>]</span><span>[</span><span>datetime</span><span>]</span><span>NULL</span><span>,
    </span><span>[</span><span>SendTime</span><span>]</span><span>[</span><span>datetime</span><span>]</span><span>NULL</span><span>,
    </span><span>[</span><span>ErrMessage</span><span>]</span><span>[</span><span>varchar</span><span>]</span>(<span>100</span>) <span>NULL</span>)

用SendTime记录发送时间,ErrMessage记录发送错误信息

 

以上:-)

原文:http://www.cnblogs.com/wuchaochao/p/4308112.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐