AWS Cognito CustomMessage_SignUp触发仍发默认邮件问题
问题背景
配置Cognito用户池的CustomMessage触发器实现注册时发送自定义HTML验证邮件,本地Localstack测试正常,但部署到AWS生产环境后仍收到默认验证邮件。Lambda日志显示触发器已调用、无报错,且已正确修改event.Response内容。
排查与解决方案
1. 核心冲突:UserPool验证风格与触发器的优先级问题
你当前在UserPool配置中设置了:
userVerification: { emailStyle: VerificationEmailStyle.LINK },
该配置会让Cognito默认生成带验证链接的邮件,尽管官方文档说明CustomMessage触发器应覆盖默认行为,但实际生产环境中存在优先级冲突:当emailStyle设为LINK时,Cognito会优先使用默认模板,忽略触发器返回的自定义内容。
解决步骤:
将emailStyle改为CODE,因为你已在触发器中自定义了完整的验证链接,无需Cognito生成默认链接:
userVerification: { emailStyle: VerificationEmailStyle.CODE },
2. 验证码占位符问题
从日志中可见,你的验证链接参数为code=%7B%23%23%23%23%7D,即{####}占位符未被替换为实际验证码。这是因为emailStyle=LINK时,Cognito传递给触发器的CodeParameter是占位符而非真实验证码;改为CODE风格后,CodeParameter会返回实际的验证字符串,链接将自动变为有效地址。
3. 确认触发器配置与权限
- 登录AWS控制台,进入目标Cognito用户池→触发器页面,确认CustomMessage触发器已正确关联到你的Lambda函数,无重复或错误配置。
- 检查Lambda的IAM角色,确保拥有
cognito-idp:InvokeTrigger权限(CDK通常会自动添加,但可手动确认)。
HTML邮件支持确认
Cognito CustomMessage触发器完全支持HTML邮件:当你返回的EmailMessage包含完整HTML结构(如<html>、<body>标签)时,Cognito会自动将邮件的Content-Type设置为text/html,无需额外配置。你当前日志中显示的HTML模板内容格式是正确的,解决上述冲突后即可正常渲染。
最终验证步骤
- 修改UserPool的
emailStyle配置为CODE - 重新部署CDK栈
- 发起新的注册请求,检查邮箱是否收到自定义HTML验证邮件
内容的提问来源于stack exchange,提问作者Nikola-Milovic

