订单邮件不发送时,先确认是“Magento 没有生成邮件”,还是“邮件已经交给传输服务但没有送达”。这两类问题的处理方向完全不同。

确认后台配置

检查商店配置中的销售邮件是否启用、发件人身份是否存在,以及订单邮件模板是否属于当前 store view。还要确认是否开启了异步发送。

bin/magento config:show sales_email/order/enabled
bin/magento config:show sales_email/general/async_sending

配置值可能受网站或商店范围覆盖。CLI 默认值看起来正确时,还需要在后台切换到实际 store view 检查。

检查订单邮件标记

SELECT entity_id, increment_id, store_id,
       send_email, email_sent, created_at
FROM sales_order
ORDER BY entity_id DESC
LIMIT 20;
  • send_email=1email_sent 为空:邮件仍可能在等待处理或发送失败。
  • email_sent=1:只代表 Magento 认为发送流程成功,不保证收件服务器最终投递。
  • send_email=0:检查下单流程或第三方支付扩展是否改变了发送标记。

不要直接批量修改这些字段后就结束排查,否则可能重复发送历史订单邮件。

检查 Cron

bin/magento cron:run --group=default
SELECT job_code, status, messages, scheduled_at, executed_at, finished_at
FROM cron_schedule
WHERE job_code LIKE '%email%'
ORDER BY schedule_id DESC
LIMIT 30;

如果异步发送开启但 Cron 长期不工作,订单邮件会持续积压。修复后应观察新订单是否自动发送,而不是只手动运行一次 Cron。

查看应用和邮件传输日志

tail -f var/log/system.log var/log/exception.log

使用 SMTP 扩展时,还要查看扩展自己的日志和队列状态。常见问题包括认证失败、端口或加密方式不匹配、发件域名未授权、连接超时和服务商限流。

模板也可能让发送失败

自定义模板中的变量、布局句柄或附件插件可能抛出异常。先切回对应版本的默认模板做对照,再逐步恢复自定义内容。不要把真实客户信息写进调试日志。

完整验证

  1. 在测试环境创建一笔新订单,并记录订单号和 store ID。
  2. 确认订单邮件标记发生预期变化。
  3. 确认 Cron 记录为 success,日志无传输异常。
  4. 查看邮件服务商的接受记录、退信和垃圾邮件判定。
  5. 分别测试纯文本收件箱和常用邮箱服务。

只有从 Magento 队列到收件服务器的整条链路都确认正常,才能判断问题已经解决。