基于Hangfire的ASP.NET Core Web API付款到期提醒邮件定时调度实现
实现步骤
以下是基于你的现有技术栈配置Hangfire定时付款提醒任务的具体方案:
1. 创建付款提醒服务
首先实现一个专门处理提醒逻辑的服务,依赖你的EF上下文和邮件服务:
using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Threading.Tasks; public class PaymentReminderService { private readonly YourDbContext _dbContext; private readonly EmailService _emailService; private readonly ILogger<PaymentReminderService> _logger; public PaymentReminderService(YourDbContext dbContext, EmailService emailService, ILogger<PaymentReminderService> logger) { _dbContext = dbContext; _emailService = emailService; _logger = logger; } public async Task Send14DayDueRemindersAsync() { var today = DateTime.Today; var reminderTriggerDate = today.AddDays(14); // 筛选出14天后到期的付款记录 var pendingPayments = await _dbContext.Payments .Where(p => p.DueDate.HasValue && p.DueDate.Value.Date == reminderTriggerDate) .ToListAsync(); foreach (var payment in pendingPayments) { try { // 构造邮件所需数据(适配你的EventModel结构) var eventData = new EventModel { ReferenceNumber = payment.ReferenceNumber, DueDate = payment.DueDate.Value, Amount = payment.Amount, Email = payment.Email }; // 发送提醒邮件 var subject = $"付款提醒:您的账单 {payment.ReferenceNumber} 将于14天后到期"; await _emailService.SendEmailAsync( new List<string> { payment.Email }, subject, eventData); _logger.LogInformation("已发送提醒邮件至 {Email},账单编号:{Ref}", payment.Email, payment.ReferenceNumber); } catch (Exception ex) { _logger.LogError(ex, "发送提醒邮件失败,账单编号:{Ref}", payment.ReferenceNumber); } } } }
2. 注册服务到依赖注入容器
在Program.cs中添加服务注册:
builder.Services.AddScoped<PaymentReminderService>();
3. 配置Hangfire定时任务
同样在Program.cs中,Hangfire配置完成后添加定时任务:
// 假设你已完成Hangfire的基础配置(如连接字符串、Dashboard) app.UseHangfireDashboard(); // 配置每日9点执行提醒任务(可根据需求调整Cron表达式) RecurringJob.AddOrUpdate<PaymentReminderService>( "daily-payment-reminders", service => service.Send14DayDueRemindersAsync(), Cron.Daily(9, 0));
4. 完善邮件内容生成
调整EmailService中的GetEmailContent方法,生成符合提醒需求的HTML内容:
private string GetEmailContent(string subject, EventModel data) { return $@" <html> <body> <h2>{subject}</h2> <p>您好,</p> <p>您的账单 <strong>{data.ReferenceNumber}</strong> 将于 <strong>{data.DueDate:yyyy年MM月dd日}</strong> 到期,应付款项为:<strong>{data.Amount:C}</strong></p> <p>请及时完成付款,避免产生逾期费用。</p> <br> <p>感谢您的配合</p> <p>付款系统团队</p> </body> </html>"; }
注意事项
- 若使用UTC时间存储日期,需注意时间转换,避免时区差异导致的提醒错误
- 建议为Hangfire配置持久化存储(如SQL Server),确保任务不会因应用重启丢失
- 可根据业务需求调整Cron表达式,例如改为每周执行或特定日期执行
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

