创建windows服务(附加定时邮件发送功能)内含本人有道云笔记链接

实例:

1

.

 

 

2.将service1改名为myservice1,右键查看代码或者按f7(或者双击后点击“切换到代码视图”)

页面中有两个内置方法,分别代表着启动和停止服务,可以将自己的逻辑代码放到此方法中执行

protected override void OnStart(string[] args)

        {

            // TODO: 在此处添加代码以启动服务。

        }

 

        protected override void OnStop()

        {

            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。

        }

 

先更新引用

using System;
using System.Collections.Generic;
using System.Data;//连接db时需datatble对象来接受
using System.Net;
using System.Net.Mail;//发送邮件
using System.ServiceProcess;
using System.Configuration;
using System.IO;//读取文件

 

再定义全局计时器对象和盘符路径

 string filePath = @"E:\MyServiceLog.txt";//找e盘txt文件(这边路径自己指定)
System.Timers.Timer timeOA;//定义计时器对象

注意:盘符路径用于记录操作日志

在Onstatr方法中先执行下面语句,用来记录服务是否启动成功(下面统称为启动方法)

  using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine($"{DateTime.Now},服务启动!");//安装服务后再txt文件中增加日志信息
            }

这边有关于using方面的使用介绍

using 介绍

 

然后可以做一个定时器的功能,当多少时间过后执行某个方法

所以在启动方法中继续写上下面的代码

  try
            {
                timeOA = new System.Timers.Timer(300000);//启动服务五分钟后执行此方法(毫秒为单位,六万毫秒等于一分钟)
                timeOA.Elapsed += new System.Timers.ElapsedEventHandler(timerOA_Elapsed);//执行方法
                timeOA.Enabled = true;
            }
            catch (Exception e)
            {
                //失败的话向管理员发送邮件,通知相关错误信息
                string to = "**@qq.com";//写上自己的邮箱地址,用来接收错误反馈
                sendmail(to, e.Message);//自定义的发送邮件方法,下面会写
                using (FileStream stream = new FileStream(filePath, FileMode.Append))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    //程序失败后也会在指定的txt中存放日志报告
                    writer.WriteLine($"{DateTime.Now},程序错误!!!:"+e.Message+",已邮件通知相关人员");
                }
            }

注意:timerOA_Elapsed是方法名,会在下面写

这边附加dbherper方法连接:

简易dbherper连接数据库方法(含查询和非查询)

然后我们创建timerOA_Elapsed方法

private void timerOA_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //获取当前小时
            int intHour = e.SignalTime.Hour;
            //获取当前分钟
            int intMinute = e.SignalTime.Minute;
            //如果时间为凌晨12.30,执行代码
            if (intHour == 00 && intMinute == 30)
            {
              //里面就可以写你自己的逻辑啦
             // 这个程序呢就会在每天的0:30进入到里面
            }
        }

然后是定义发送邮件的方法

这边sendmail中的参数我只传了收件人和主题,如需其他你们可以自定义

public void sendmail(string to, string subject)
        {
            using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine($"{DateTime.Now},进入发邮件的方法");//安装服务后再txt文件中增加日志信息
            }
            string user = "邮箱账号";
            string passw = "邮箱密码";//密码
            string Suffix = "";     //邮箱后缀
            int port = 587;         //端口号
            string smtp = "smtp..net";
            Suffix = user.Substring(user.IndexOf('@'));
            //相应的邮箱后缀对应相应的smtp
          
          
            else if (Suffix == "@qq.com")
            {
                smtp = "smtp.qq.com";
            }
            else if (Suffix == "@sh-teru.com")
            {
                smtp = "smtp.exmail.qq.com";
            }

            //实例化一个发送邮件类。
            System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage();
            //发件人邮箱地址,方法重载不同,可以根据需求自行选择。
            mailMessage.From = new MailAddress(user);
            //收件人邮箱地址。
            //这边如果有多个收件人
            //循环插入
            if (to.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Length > 1)
            {
                foreach (var address in to.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    mailMessage.To.Add(address);
                }
            }
            else
            {
                mailMessage.To.Add(new MailAddress(to));
            }
            //邮件标题。
            mailMessage.Subject = subject;
            //邮件内容
            mailMessage.Body = "";
            //实例化一个SmtpClient类。
            SmtpClient client = new SmtpClient();
            //服务器端口
            client.Port = port;
            //勤达邮箱服务器
            client.Host = smtp;
            //使用安全加密连接。
            client.EnableSsl = true;
            //不和请求一块发送。
            client.UseDefaultCredentials = false;
            //验证发件人身份(发件人的邮箱,邮箱里的生成授权码);
            client.Credentials = new NetworkCredential(user, passw);
            try
            {
                client.Send(mailMessage);
                mailMessage.Dispose();
            }
            catch (Exception)
            {
                mailMessage.Dispose();
            }
        }

 

 

停止服务的时候我们也可以做下日志记录

protected override void OnStop()
        {
            using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine($"{DateTime.Now},服务停止!");
            }
            this.timeOA.Enabled = false;
        }

 

 

然后右键点击添加安装程序

 

此时会出现两个组建,点击serviceProcessInstaller1,在右下角的属性栏中,将Account修改为LocalSystem

点击第二个组建,

Description表示服务的描述,DisplayName表示服务显示名称。ServicesDependedOn表示依赖的服务项。StartType表示启动类型,分为自动启动,手动启动和禁用,这边改成Automatic

 

4.直接运行

当运行时会报错

 

这个不用管,右键点击解决方案,生成

然后在项目所在目录的bin文件夹中的debug中可以看到生成的exe文件。

安装服务

然后以管理员身份运行cmd

第一种方法,

sc create huxinyu binPath= "E:\file\YL\windows服务 \WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe"

注意:标绿色部分是你项目的本地路径,

第二种方法

输入:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

(我这边是64位的操作系统,如果是32位,请自行改动)

这句命令的目的就是找到c盘的installutil.exe的文件位置,如下图

输入InstallUtil.exe E:\file\YL\windows服务 \WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe

刚创建的服务需要手动开启:打开服务,找到你生成的服务名称,右键开启即可

卸载服务

直接以管理员身份运行cmd

输入 sc delete 服务名即可

启动服务后就可以在本地txt的文件夹看到日志啦

有兴趣的小伙伴可以关注我的公众号哦~ 里面有很多自己平时积攒起来的学习资源,Python,web安全,前端,Java等,都是免费领取的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值