Quartz.NET定时任发送邮件
一、什么是Quartz.NET
Quartz是基于Java开源的一款制作定时任务的框架,不过也有.NET版本,传送门:Quartz.NET官网。简单的说,就是编写一个应用程序,让它定时去做什么!如:每天早上八点,定时给客户发送邮件,每周四给社区用户发送推广信息等;这就是传说中,也很高大上的,即:所谓的定时任务,很好理解!
1、编写第一个定时任务
首先,我们来创建一个简单的控制台应用程序,NeGut:Quartz.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 会话中长时间运行的可执行应用程序。传送门:官方文档, 如:我们所熟悉的MySQL,MSSQL,实质上就是一个在后台开机长时间自动运行的Windows服务!
1、编写第一个Windows服务
生成完成,鼠标右击,查看代码!
我们只需注意两部分即可,分别用于启动服务执行的任务,和停止服务执行的内容!
再次鼠标右击,添加安装程序!
2、生成QQ邮件授权码
发送QQ邮件,需要生成对应的授权码,QQ邮箱才允许你自动收发邮件,生成过程如下:首先打开你的QQ邮箱账户,发送短信验证,查看对应的授权码,保存后即可!
3、发送QQ邮件
发送邮件在.NET中内置了,不过也可以通过第三方包来进行发送;这里采用的是NuGet:MailKit,因为在.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