Files
Xboard/.helloagents/modules/queue-mail.md
T
yinjianm a4e78b864a fix(api): 修复邮件队列超时并补齐调度进程
延长 SendEmailJob 超时并改为超时直接失败,补充重试退避、
失败日志与收件人脱敏,避免 send_email 队列批量超时重试。

新增 MAIL_TIMEOUT 与 QUEUE_RETRY_AFTER 配置,并抽出邮件运行时
配置与 HTML 内容服务,确保 Horizon 常驻进程使用最新邮件配置。

为 Docker、supervisor 与 compose 样例补齐 scheduler 进程,并在
节点管理端开启墙检测托管时立即触发一次检测,保证定时任务持续生效。
2026-04-28 13:32:58 +08:00

33 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 配置脱敏。