a4e78b864a
延长 SendEmailJob 超时并改为超时直接失败,补充重试退避、 失败日志与收件人脱敏,避免 send_email 队列批量超时重试。 新增 MAIL_TIMEOUT 与 QUEUE_RETRY_AFTER 配置,并抽出邮件运行时 配置与 HTML 内容服务,确保 Horizon 常驻进程使用最新邮件配置。 为 Docker、supervisor 与 compose 样例补齐 scheduler 进程,并在 节点管理端开启墙检测托管时立即触发一次检测,保证定时任务持续生效。
1.9 KiB
1.9 KiB
queue-mail
职责
- 承接注册验证码、登录链接、工单通知、订阅到期/流量提醒和后台群发邮件的异步发送。
- 通过
App\Jobs\SendEmailJob统一进入send_email或send_email_mass队列。 - 通过
App\Services\MailService统一渲染邮件模板、应用运行时 SMTP 配置、发送邮件并写入MailLog。
行为规范
SendEmailJob的默认timeout为 60 秒,tries为 3,backoff()为[60, 300]。SendEmailJob::$failOnTimeout = true,超时作业应直接失败,避免同一封邮件在不确定是否已发出的情况下反复重试。- 邮件发送返回错误时,
SendEmailJob抛出RuntimeException,由 Laravel Queue/Horizon 统一处理重试和失败记录;不再手动release(60)。 - SMTP 传输超时由
MAIL_TIMEOUT控制,默认 30 秒;QUEUE_RETRY_AFTER默认 90 秒,必须大于邮件 job timeout。 - Horizon 长驻 worker 每次发送前会通过
MailRuntimeConfig应用后台邮件配置,并刷新已解析 mailer,避免后台 SMTP 配置变更后仍使用旧连接。 MailLog.config只保存脱敏后的邮件配置,password、secret、token、key字段不得以明文持久化。send_email_mass队列仍会在邮件正文追加[Send-Time: ...]标记,用于区分批量发送内容。
依赖关系
- 队列配置:
config/queue.php - Horizon supervisor:
config/horizon.php - 邮件配置:
config/mail.php - 运行时配置:
App\Services\MailRuntimeConfig - HTML 通知内容:
App\Services\MailHtmlContent - 邮件日志模型:
App\Models\MailLog
验证要点
SendEmailJob::$timeout小于config('queue.connections.redis.retry_after')。MAIL_TIMEOUT小于SendEmailJob::$timeout,确保网络层先于 job 层超时。- 单测应覆盖 job 超时/backoff、邮件错误抛出、批量邮件发送时间标记和
MailLog配置脱敏。