You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 13:15:48