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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:30:59