• 杂记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("396042321@qq.com"); // 收件人
        mail.AddCC("396042321@qq.com"); // 抄送人
        mail.Subject = "主题";
        mail.Content = "邮件正文";
        mail.AddAttchment("C:	est.txt"); // 附件
        mail.Send();
    }

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

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

    设置serviceProcessInstaller1的Account属性为LocalSystem;

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

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

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

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

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

    C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe CYWinService.exe
    pause

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

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

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

    后记:

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

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

    C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.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记录发送错误信息

    以上:-)

  • 相关阅读:
    10000000000
    vue生命周期
    react基础
    第一个react
    vuex状态管理2
    vue配合UI组件
    vuex
    vue-router配合vue-cli的实例
    vue-router2.0
    父子组件2.0
  • 原文地址:https://www.cnblogs.com/wuchaochao/p/4308112.html
Copyright © 2020-2023  润新知