杂记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定时器:

public MyMailService()
{
    InitializeComponent();

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

    timer1.Stop();
}

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

protected override void OnStop()
{
    timer1.Stop();
}

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

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

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

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

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

        NC = new NetworkCredential();
        NC.UserName = DefaultFMAddress;
        NC.Password = DefaultPassword;
    }

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

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

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

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

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

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

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

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

Timer的代码:

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Mail mail = new Mail();
    mail.AddTo("[email protected]"); // 收件人
    mail.AddCC("[email protected]"); // 抄送人
    mail.Subject = "主题";
    mail.Content = "邮件正文";
    mail.AddAttchment("C:\test.txt"); // 附件
    mail.Send();
}

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

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

设置serviceProcessInstaller1的Account属性为LocalSystem;

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

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

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

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

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

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe CYWinService.exe
pause

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

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

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

后记:

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

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

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u CYWinService.exe
pause

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

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

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

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

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

以上:-)

时间: 2024-08-08 10:12:46

杂记2:VS2013创建Windows服务实现自动发送邮件的相关文章

VS2013创建Windows服务 || VS2015+Windows服务简易教程

转自:https://www.cnblogs.com/no27/p/4849123.htmlhttps://blog.csdn.net/ly416/article/details/78860522 VS2013创建Windows服务 一.创建服务 1.文件->新建->项目->windows桌面->windows服务,修改你要的项目名称.我这不改名,仍叫WindowsService1,确定. 2.其中的Program.cs文件是入口,Service1.cs是服务文件,所有的逻辑都在这

【100】VS2013创建Windows服务与调试服务

[20200216] 我用了几次Windows服务,可以能很好解决大文件.大数据生成,非实时的高并发事件.而且稳定性高,比放在程序上的全局事件要稳定,只是维护起来,需要服务器配合.下面还是过一次整个流程:  1.创建Windows服务    2.添加安装程序  说明: 1.Description: windows服务的描述 2.DisplayName 服务显示名称,直接显示到Windows服务列表中的名称 3.ServiceName 服务进程名称,安装与卸载服务时的唯一标识,DisplayNam

VS2013创建Windows服务

一.创建服务 1.文件->新建->项目->windows桌面->windows服务,修改你要的项目名称.我这不改名,仍叫WindowsService1,确定. 2.其中的Program.cs文件是入口,Service1.cs是服务文件,所有的逻辑都在这.Service1.cs包含两部分,一部分是Designer,可以在这里面添加各种组件.一部分是后台文件,里面可以写一些逻辑,默认包含3个方法:构造函数.OnStart和OnStop,还可以添加OnPause和OnContinue方法

在64位windows下使用instsrv.exe和srvany.exe创建windows服务

在64位windows下使用instsrv.exe和srvany.exe创建windows服务 在32位的windows下,包括windows7,windows xp以及windows 2003,都可以使用instsrv.exe和srvany.exe来创建自定义的windows服务.比如,我们有一个bat文件,用于将指定的程序作为服务进行启动,使用一般的工具都不可以进行此类工作,而使用由windows 2003的资源工具包windows toolkit中所带的instsrv就可以. 详细的用法这

创建Windows服务简单流程

1.首先打开VS2010(或者其他版本),创建Windows服务项目 2.创建完成后切换到代码视图,代码中默认有OnStart和OnStop方法执行服务开启和服务停止执行的操作,下面代码是详细解释: 注意选择的是系统时间,不是winform中的时间. using System; using System.IO; usingSystem.ServiceProcess; using System.Text; usingSystem.Timers; namespaceTestService { pub

C#创建Windows服务与安装-图解

1.创建windows服务项目 2.右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3.代码中OnStart用于执行服务事件 public partial class Service1 : ServiceBase { string logFilePath = ""; LogHelper logHelper; WendyWuBll bll = new WendyWuBll(); public Service1() { logFilePath = Configuratio

C# 使用Vici WinService组件来创建Windows服务

Vici WinService 是 是Windows平台下使用C#开发的轻量级用于创建,删除服务的类库,您只需简单的几行代码即可实现多线程异步服务的创建,删除,运行 废话不多说,直接上代码 /****************************************************************** * 创建人:HTL * 创建时间:2015-5-12 14:09:39 * 说明:使用Vici WinService组件创建的Windows服务 * Email:[email

C# 创建Windows服务 +Log4Net 日志

C# 创建WinDows 服务 Ctrl+Shift+N 新建项目,创建windows 服务 打开"工具箱"---右键---"选择项"---找到Timer控件,看好了,这个Timer控件的是system.Timer下的.可不是System.Windows.Form.然后添加. 双击Timer控件...写事件... 添加Log4Net引用 log4Net.dll 添加 “应用程序配置文件”,App.Config ,配置该文件 配置以下文件,添加Log4Net [ass

Mysql数据库一:安装与创建windows服务

Mysql数据库安装与创建windows服务 1.先下载压缩包(mysql-5.7.18-winx64.zip)移动到对应目录(如D:\software)后解压. 2.安装服务端: mysqld:带d是服务端程序 D:\> D:\software\mysql-5.7.18-winx64\bin\mysqld --initialize-insecure (控制台最好以管理员模式启动) 此时已经为我们初始化好了服务端程序,并创建了初始用户root 密码空, 初始程序为我们在D:\software\m