客户在 Forgot Password 页面提交邮箱后看到成功提示,却一直收不到邮件。出于安全考虑,Magento 通常不会明确告诉访客该邮箱是否存在,因此页面成功提示不能证明系统已经找到客户并发送。排查时要从账户范围开始,而不是直接归因于 SMTP。
确认客户属于当前 Website
Magento 客户账户共享范围可以是 Global 或 Per Website。同一邮箱在另一个 Website 存在,但当前站点按 Website 隔离时,前台不会把它当作可重置账户。后台查看客户 Website,并核对表单所在 Store View 与 Base URL。
只读查询时不要把客户隐私输出到公共日志:
SELECT entity_id, website_id, email, confirmation,
rp_token_created_at
FROM customer_entity
WHERE email = 'customer@example.test';
有 confirmation 状态或账户被锁定时,还要区分确认邮件、解锁流程和密码重置流程,不能混用模板。
查看令牌是否生成,而不是查看令牌内容
提交后 rp_token_created_at 应更新。为了安全,不要记录或复制真实 reset token。时间未变化说明请求没有走到令牌生成,检查网站、表单 key、限流、自定义 controller 和异常日志;时间已变化而邮件未到,则继续查模板与传输。
商店作用域会决定发件人与模板
Customer Configuration 中的 Password Options、邮件模板、发件人身份和令牌有效期都可能按 scope 覆盖。多品牌站常见问题是 Default Config 正确,而子 Store View 选择了已删除模板或无效发件地址。
模板中的重置链接必须使用客户提交请求时对应的安全 Base URL。反向代理协议识别错误、旧域名或错误 Store Code 会导致邮件即使收到也无法打开。不要在模板中手工拼接 token 链接。
重置密码邮件通常不是普通销售邮件队列
订单邮件的异步设置与客户密码邮件不是同一条链路。查看请求当时的 Magento、PHP 和邮件传输日志,确认 sendmail/SMTP 是否接受消息。第三方 SMTP 模块可能拦截 TransportBuilder,要测试客户模板而不是只点模块的“测试邮件”。
如果邮件服务显示 accepted,再查退信、抑制列表、SPF、DKIM 和 DMARC。客户邮箱写错、历史硬退信或企业网关策略都会让应用层显示发送成功但实际不投递。
避免用枚举账户的方式测试
前台对存在和不存在邮箱应返回相近提示与耗时,防止攻击者枚举客户。排查应在受控后台和日志中完成,不要修改前台提示暴露账户存在性。频繁请求还应受限流保护,防止邮件轰炸。
修复后使用当前 Website 的测试客户请求一次,确认令牌时间更新、邮件服务收到、链接域名和 Store 正确,并在有效期内完成修改。旧链接和重复使用的链接应失效,新密码登录后原有敏感会话也应按安全策略处理。

