这篇随笔里,我将介绍如何用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);elseMMsg.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("396042321@qq.com"); // 收件人mail.AddCC("396042321@qq.com"); // 抄送人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记录发送错误信息

以上:-)

转载于:https://www.cnblogs.com/wuchaochao/p/4308112.html

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

  1. VS2013开发Windows服务项目

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  2. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

  3. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  4. *用C#创建Windows服务(Windows Services)

    Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Win ...

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

    在64位windows下使用instsrv.exe和srvany.exe创建windows服务 在32位的windows下,包括windows7,windows xp以及windows 2003,都可 ...

  6. 演练:在组件设计器中创建 Windows 服务应用程序

    http://msdn.microsoft.com/zh-cn/library/zt39148a(v=vs.80).aspx 演练:在组件设计器中创建 Windows 服务应用程序 .NET Fram ...

  7. C# windows服务:创建Windows服务(Windows Services)的一般步骤

    C#创建Windows服务(Windows Services) Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Wind ...

  8. 如何创建Windows服务

    1.首先需要两个小程序instsrv.exe和srvany.exe 下载地址:http://www.techeez.com/windows-tips/techeez-com-31/ 也可以到此下载ht ...

  9. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 参考文章: (1)C#/.NET基于Topshelf创建Windows ...

最新文章

  1. Wapiti一款小巧的开源安全测试漏洞检测工具
  2. 书写是为了更好的思考
  3. LeetCode Algorithm 530. 二叉搜索树的最小绝对差
  4. 工业级光模块是什么?
  5. 还是畅通工程(HDU-1233)
  6. resultset遍历取数据_数据放在哪?如何从数据库取数据?
  7. 【Vue】—props属性
  8. 如何修改服务器ntp配置,[修改]Linux下NTP服务器的配置
  9. python中开平方如何表示_python平方怎么表示
  10. raspberry pi_如何使用Raspberry Pi和RetroPie构建自己的NES或SNES Classic
  11. h5微信本地调试 vue_UniApp本地调试H5(谷歌chrome浏览器)跨域问题的解决方法,亲测可用...
  12. WIN7 shutdown 定时/倒计时 命令关机
  13. 苹果手机配什么无线蓝牙耳机好?适配苹果手机的蓝牙耳机推荐
  14. bind dlz mysql rpm_MySQL+BIND-dlz 实现智能DNS
  15. ss-libev 分析
  16. [软件补丁]VS6 sp6补丁下载
  17. 大功率mos管(功率mos管)的五种损坏原因分析,新手必读
  18. 达特茅斯计算机专业师资力量如何,达特茅斯学院计算机信息介绍 优势专业选到就是赚到...
  19. 一入盲盒深似海——小小盲盒,尽榨干了多少人的钱包?
  20. R语言入门教程知识 第七章 特殊值

热门文章

  1. 企业网络高级技术第二章STP实验
  2. Map m=new HashMap()
  3. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)...
  4. 【数据库】Redis/MongoDB/MySQL/Oracle随笔索引
  5. MySQL中查询时对字母大小写的区分
  6. 关于vivo 8.0和miui新系统android studio调试出现“包解析错误”的bug的解决办法
  7. 演练5-3:Contoso大学校园管理系统3
  8. 阿里云 centos oracle安装
  9. Activity启动流程:Hook实现启动未注册Activity
  10. [置顶] Android输入输出系统之TouchEvent流程