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
相关产品推荐
相关产品推荐

