ASP.NET Core中如何用Quartz.net实现每15分钟发邮件的调度器
ASP.NET Core 基于Quartz.NET实现15分钟间隔定时发邮件方案
直接按以下步骤配置即可,所有逻辑完全兼容原生ASP.NET Core依赖注入体系:
安装依赖包
首先通过NuGet给项目安装Quartz.AspNetCore包,这是Quartz官方维护的ASP.NET Core集成包,无需额外安装宿主适配组件。实现定时执行的Job类
新建邮件发送任务类,继承Quartz的IJob接口,把实际发信逻辑写在Execute方法里,依赖的服务可以直接通过构造函数注入:
public class EmailSendJob : IJob { private readonly IEmailService _emailService; private readonly ILogger<EmailSendJob> _logger; public EmailSendJob(IEmailService emailService, ILogger<EmailSendJob> logger) { _emailService = emailService; _logger = logger; } public async Task Execute(IJobExecutionContext context) { try { _logger.LogInformation("定时发信任务启动,执行时间:{now}", DateTimeOffset.Now); // 替换成实际业务逻辑:比如拉取待发邮件列表、调用SMTP服务发送 await _emailService.SendScheduledMailsAsync(); _logger.LogInformation("定时发信任务执行完成"); } catch (Exception ex) { _logger.LogError(ex, "定时发信任务执行异常"); // 不需要往外抛异常,除非你要触发Quartz自带的重试逻辑 } } }
注:Job实例由Quartz通过DI容器按需创建,项目里注册的Scoped、Transient、Singleton生命周期服务都可以正常注入使用。
- 注册Quartz服务并配置调度规则
在项目的Program.cs里添加Quartz服务注册,配置15分钟间隔的触发器:
var builder = WebApplication.CreateBuilder(args); // 提前注册自己封装的邮件发送服务,生命周期按实际需求配置即可 builder.Services.AddScoped<IEmailService, EmailService>(); // 注册Quartz调度器 builder.Services.AddQuartz(config => { var emailJobKey = new JobKey("EmailSendJob", "EmailScheduleGroup"); // 绑定写好的发信Job config.AddJob<EmailSendJob>(opt => opt.WithIdentity(emailJobKey)); // 配置触发器 config.AddTrigger(opt => opt .ForJob(emailJobKey) .WithIdentity("EmailSendTrigger", "EmailScheduleGroup") .StartNow() // 应用启动后立即触发第一次执行 // 固定间隔15分钟执行,永久循环 .WithSimpleSchedule(schedule => schedule .WithIntervalInMinutes(15) .RepeatForever() ) // 如果需要对齐整点(每小时0/15/30/45分执行),把上面的SimpleSchedule替换成下面的Cron配置即可 // .WithCronSchedule("0 0/15 * * * ?") ); }); // 注册Quartz托管服务,随应用启动自动运行调度器,应用关闭时等待正在执行的任务完成 builder.Services.AddQuartzHostedService(opt => { opt.WaitForJobsToComplete = true; }); // 剩下的原有服务注册逻辑(比如AddControllers、AddSwaggerGen等)保持不变 var app = builder.Build(); // 原有中间件配置逻辑保持不变 app.Run();
- 部署注意事项
- 如果部署在IIS上,需要把对应应用程序池的闲置超时设置为0,开启预加载,否则应用长时间无请求被回收后,定时任务会停止执行。
- 如果是多实例部署(多台服务器、K8s多副本),需要配置Quartz的数据库持久化+集群模式,避免多个实例同时触发任务导致重复发邮件。
- 邮件发送服务本身没有特殊适配要求,不管用MailKit还是原生
SmtpClient实现都可以正常运行,建议给发信逻辑加失败重试、发送日志记录,避免SMTP临时故障导致丢信。
如果需要在Job里使用Scoped生命周期的数据库上下文等服务,直接构造函数注入即可,Quartz的ASP.NET Core集成已经默认处理了Job的作用域问题。
内容的提问来源于stack exchange,提问作者Sid_Sh
相关产品推荐
相关产品推荐

