这篇随笔里,我将介绍如何用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("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记录发送错误信息

VS2013开发Windows服务项目的更多相关文章

  1. VS2013开发 windows服务 挂到服务器上执行

    这是百度经验的链接,本人主要参考的他.http://jingyan.baidu.com/article/cd4c2979e9330d756f6e6070.html 1 创建windows服务项目 2 ...

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

    转自:https://www.cnblogs.com/no27/p/4849123.htmlhttps://blog.csdn.net/ly416/article/details/78860522 V ...

  3. 使用Topshelf开发Windows服务、log4net记录日志

    开发windows服务,除了在vs里新建服务项目外(之前有写过具体开发方法,可点击查看),还可以使用Topshelf. 不过使用topshelf需要.netframework 4.5.2版本,在vs2 ...

  4. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  5. 使用Visual Studio 2015 Community 开发windows服务

    昨天研究在.NET下开发Windows服务程序,期间遇到一些小问题,这里仅将自己的开发过程和需要注意的地方写下和广大网友分享……  1.基础   Windows服务是指系统启动时能够自己运行的程序.W ...

  6. C#开发Windows服务 附简单实例实现禁止QQ运行

    本实例主要实现下面三个基本功能 1.C#开发windows服务 2.禁止QQ等程序运行 3.为windows服务创建自动安装程序 下面针对这三个基本功能进行实现 一.C#开发windows服务 Win ...

  7. vs2015开发Windows服务

    工作已经很久,时隔这么长时间写这篇文章是给自己以后做参考.也不至于以后长时间不写Windows服务而忘记整个开发过程.windows服务开发,基础的就不说了,直接上过程. 1.新建windows服务项 ...

  8. 使用C#开发windows服务定时发消息到钉钉群_群组简单消息

    前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...

  9. C#开发Windows服务详细流程

    1.Windows服务简单介绍 Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序,主要用于长时间运行的功能或者执行定时任务.一般情况下,用户不能通过用户界面来安装和启 ...

随机推荐

  1. 删除TreeView节点以及其子节点

    //1.删除TreeView节点以及其子节点procedure TForm2.Button1Click(Sender: TObject);var TreeNode:TTreeNode;begin  i ...

  2. Winform- TreeView的使用例子

    自动递归生成树,点击树节点的事件在treeView1_AfterSelect里编写,不多说了,直接上代码,备注在这里一下 public partial class Form1 : Form { pub ...

  3. Zookeeper全解析——Paxos作为灵魂

    原文地址: http://www.spnguru.com/2010/08/zookeeper%E5%85%A8%E8%A7%A3%E6%9E%90%E2%80%94%E2%80%94paxos%E7% ...

  4. Aizu 2309 Sleeping Time DFS

    Sleeping Time Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...

  5. [016]转--C++拷贝构造函数详解

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...

  6. Jordan Lecture Note-2: Maximal Margin Classifier

    Maximal Margin Classifier Logistic Regression 与 SVM 思路的不同点:logistic regression强调所有点尽可能远离中间的那条分割线,而SV ...

  7. jQuery中要注意的一些函数

    has()方法 或 :has选择器 :是过滤子类含有的,并不是过滤当前选择器选择的元素或对象含有的

  8. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  9. Javascript中new

    // 加不加new结果都一样 var obj = new Function('var temp = 100;this.temp = 200;return temp + this.temp;'); al ...

  10. 关于JFace中的进度条对话框(ProgressMonitorDialog类)

    在Windows操作系统中,最常用的进度条对话框就是文件复制时的弹出框,如果想让用户愉快的使用你开发 的软件,那么在执行某个较长时间的操作时候,就应该弹出一个进度条提示框,告诉用户程序正在做什么. 做 ...