Quartz.NET+Windows服务定时任务发送邮件

一、什么是Quartz.NET

Quartz是基于Java开源的一款制作定时任务的框架,不过也有.NET版本,传送门:Quartz.NET官网。简单的说,就是编写一个应用程序,让它定时去做什么!如:每天早上八点定时给客户发送邮件,每周四给社区用户发送推广信息等;这就是传说中,也很高大上的,即:所谓的定时任务,很好理解!

1、编写第一个定时任务

首先,我们来创建一个简单的控制台应用程序NeGutQuartz.NET

在这里插入图片描述

通过继承IJob,重写Execute()方法来实现我们的想要的任务!

public class TestJob : IJob
    {
    
    
        public async Task Execute(IJobExecutionContext context)
        {
    
    
            await Console.Out.WriteLineAsync("这是我编写的第一个定时任务!");
        }
    }

2、编写触发器运行定时任务

触发器的作用:用于告诉应用程序,什么时候开始执行我的任务,并定期执行,为了方便演示,这里我们选取每秒执行一次,即:让窗口每秒打印一次我们刚刚在任务定义文本消息!

public class TestJobStart
    {
    
    
        public async static void Start()
        {
    
    
            StdSchedulerFactory _factory = new StdSchedulerFactory();
            IScheduler _scheduler = await _factory.GetScheduler();

            IJobDetail smsJob = JobBuilder.Create<TestJob>()
               .WithIdentity("job", "group")
               .Build();

            ITrigger smsTrigger = TriggerBuilder.Create()
                .WithIdentity("smsTrigger", "smsTriggerGroup")
                 .WithSimpleSchedule(x => x //每秒执行
                 .WithIntervalInSeconds(1)
                 .RepeatForever())
                //.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(12, 0))//每天
                .Build();

            await _scheduler.ScheduleJob(smsJob, smsTrigger);

            await _scheduler.Start();
        }
    }

Main()方法中进行调用,并运行!

class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            
            TestJobStart.Start();

            //睡眠60秒,用于执行任务
            Thread.Sleep(1000 * 60);
        }
    }

在这里插入图片描述

二、什么是Windows服务

官方的说:允许用户创建可在其自身的 Windows 会话长时间运行的可执行应用程序。传送门:官方文档, 如:我们所熟悉的MySQLMSSQL,实质上就是一个在后台开机长时间自动运行Windows服务

在这里插入图片描述

1、编写第一个Windows服务

在这里插入图片描述

生成完成,鼠标右击,查看代码!

在这里插入图片描述

我们只需注意两部分即可,分别用于启动服务执行的任务,和停止服务执行的内容!

在这里插入图片描述

再次鼠标右击添加安装程序

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2、生成QQ邮件授权码

发送QQ邮件需要生成对应的授权码,QQ邮箱才允许你自动收发邮件,生成过程如下:首先打开你的QQ邮箱账户,发送短信验证,查看对应的授权码保存后即可!

在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、发送QQ邮件

发送邮件在.NET中内置了,不过也可以通过第三方包来进行发送;这里采用的是NuGetMailKit,因为在.NET Core并没有内置邮件发送,所以可通过MailKit来进行QQ邮件发送,当然类似的产品很多,根据需要自行查找!

在这里插入图片描述

3.1 编写邮件任务

public class EmailJob : IJob
    {
    
    
        public async Task Execute(IJobExecutionContext context)
        {
    
    
            var message = new MimeMessage();

            //发送方
            message.From.Add(new MailboxAddress("任意名称", "你的QQ邮箱号码"));

            //接收方
            message.To.Add(new MailboxAddress("任意名称", "你发送的对象QQ邮箱号码"));

            //邮件主题
            message.Subject = "邮件主题";

            //邮件内容,可嵌套html
            var bodyBuilder = new BodyBuilder();
            bodyBuilder.HtmlBody = "<h3 style='color:red;'>亲爱的憨憨!</h3>" +
                "<h4 style='color:blue'>这是美好的一天,你一定好好保重身体哟!爱你的每一天!</h4>" +
                "<img src='https://seopic.699pic.com/photo/50071/5625.jpg_wh1200.jpg'>";

            message.Body = bodyBuilder.ToMessageBody();
            //代理服务器发送
            var client = new SmtpClient();
            await client.ConnectAsync("smtp.qq.com",587);
            await client.AuthenticateAsync("你的QQ邮箱号码", "你的账户生成的邮件授权码");
            await client.SendAsync(message);
            await client.DisconnectAsync(true);
        }
    }

3.2 编写任务触发器

public class EmailJobStart
    {
    
    
        public async static void Start()
        {
    
    
            StdSchedulerFactory _factory = new StdSchedulerFactory();
            IScheduler _scheduler = await _factory.GetScheduler();

            IJobDetail smsJob = JobBuilder.Create<TestJob>()
               .WithIdentity("job", "group")
               .Build();

            ITrigger smsTrigger = TriggerBuilder.Create()
                .WithIdentity("smsTrigger", "smsTriggerGroup")
                 .WithSimpleSchedule(x => x //每秒执行
                 .WithIntervalInSeconds(1)
                 .RepeatForever())
                //.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(12, 0))//每天
                .Build();

            await _scheduler.ScheduleJob(smsJob, smsTrigger);

            await _scheduler.Start();
        }
    }

3.3 调用定时任务

 public partial class Service1 : ServiceBase
    {
    
    
        public Service1()
        {
    
    
            InitializeComponent();
        }

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

        protected override void OnStop()
        {
    
    
        }
    }

4、安装Windows服务

安装Windows服务需要通过InstallUtil.exe来进行安装,官方传送门:安装和卸载服务,通过doc命令,进入到InstallUtil.exe所在的文件夹位置,运行命令:InstallUtil D:\WS\Service\MessageService\bin\Debug\MessageService.exe,注意看,后面的文件路径是你编写的应用程序Debug目录下的.exe文件所在的路径

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

在这里插入图片描述

如图,则表示安装成功!

在这里插入图片描述

启动任务后,我们的定时任务就大功告成了!

在这里插入图片描述

5、卸载Windows服务

卸载服务就很简单了,进入InstallUtil.exe所在的文件夹,运行以下命令即可!

InstallUtil D:\WeChat\Service\MessageService\bin\Debug\MessageService.exe -u

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42799562/article/details/114781848