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

Laravel实现到期/逾期3天/7天自动发送发票提醒邮件问题咨询

自动发送实现方案

1. 开启Laravel任务调度

首先修改App\Console\Kernel.php中的schedule方法,取消注释并调整执行频率,推荐每天固定时间执行一次即可:

protected function schedule(Schedule $schedule)
{
    // 每天上午9点执行提醒任务
    $schedule->command('reminder:emails')->dailyAt('09:00');
}

2. 配置服务器Crontab

登录你的服务器,执行crontab -e添加以下规则,让系统每分钟检查Laravel调度任务:

* * * * * cd /你的项目绝对路径 && php artisan schedule:run >> /dev/null 2>&1

核心问题修复

1. 新增到期触发条件

首先确认你的reminders表已包含due_date(到期日)、remind_days(提醒天数,到期日当天存0、逾期3天存3、逾期7天存7)字段,修改SendReminderEmails.php的handle方法中的查询逻辑:

public function handle()
{
    // 筛选符合发送时间条件、未发送的提醒
    $pending_Reminders = Reminder::where('status',0)
        ->whereRaw('DATE_ADD(due_date, INTERVAL remind_days DAY) = CURDATE()')
        ->get();
    
    $data = [];
    foreach ($pending_Reminders as $reminder){
        $data[$reminder->donor_id][] = $reminder;        
    }

    foreach($data as $donor_id => $reminders){
        $this->sendEmailToUser($donor_id, $reminders);
    }
}

发信完成后记得更新提醒状态避免重复发送,修改sendEmailToUser方法:

private function sendEmailToUser($donor_id, $pending_Reminders){
    $user = Donor::find($donor_id);
    Mail::to($user)->send(new ReminderEmailDigest($pending_Reminders));
    // 标记为已发送
    foreach ($pending_Reminders as $reminder) {
        $reminder->update(['status' => 1]);
    }
}

2. 动态切换发件人邮箱

首先确认reminders表已存创建该提醒的登录用户的发件邮箱、发件人名称字段sender_email、sender_name,先修复ReminderEmailDigest的属性赋值bug,再添加动态发件人配置:

class ReminderEmailDigest extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    private $reminders;

    public function __construct($pending_Reminders)
    {
        $this->reminders = $pending_Reminders;
    }

    public function build()
    {
        // 取同批次提醒的发件人信息(同一客户的提醒默认来自同一个发件人)
        $sender = $this->reminders[0];
        return $this->from($sender->sender_email, $sender->sender_name)
            ->markdown('emails.reminder-digest')
            ->with('pending_Reminders', $this->reminders);
    }
}

优化建议

  • 邮件队列添加失败重试配置,在ReminderEmailDigest中添加public $tries = 3;,失败最多重试3次,避免无效请求占用资源
  • 添加发信日志,记录每次发信的发件人、收件人、发送状态、报错信息,方便后续排查问题
  • 如果使用第三方SMTP服务发件,提前确认服务支持多账号动态发件,避免邮件被判定为垃圾邮件
  • 可以在调度配置中添加失败通知,任务执行失败时自动发送告警给管理员

内容的提问来源于stack exchange,提问作者senthu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:00:01