配置SES向Cognito User pool的recoveryEmail发送验证码问题求助
问题排查与解决方案
1. Gmail邮件中验证码占位符{####}未替换
- 检查Lambda函数中验证码变量的传递逻辑:确保从Cognito触发事件中正确提取验证码,并用实际值替换模板中的
{####}。Cognito触发事件里的验证码一般在request.codeParameter或request.validationCode字段,示例代码:verification_code = event['request']['codeParameter'] email_body = "Your verification code is {####}".replace("{####}", verification_code) - 查看CloudWatch日志:确认Lambda执行时验证码变量已正确赋值,替换后的邮件内容包含实际验证码,排除变量为空或替换失败的情况。
- 避免Gmail格式干扰:如果使用HTML模板,确保占位符是纯文本节点,不要被CSS或JS逻辑覆盖;纯文本模板尽量避免特殊符号包裹占位符。
2. 自定义属性recoveryEmail收不到邮件
- 确认Lambda正确读取recoveryEmail属性:Cognito自定义属性带
custom:前缀,需从request.userAttributes中提取,示例:recovery_email = event['request']['userAttributes'].get('custom:recoveryEmail') - 检查recoveryEmail的SES验证状态:沙箱模式下,SES仅允许发送到已验证的邮箱。登录SES控制台,在「已验证的身份」中添加并验证该邮箱地址。
- 验证Lambda的IAM权限:确保Lambda角色包含
ses:SendEmail或ses:SendTemplatedEmail权限,资源范围覆盖目标邮箱域。 - 排查垃圾邮件过滤:让收件人检查垃圾邮件文件夹,调整邮件主题(避免过度堆砌「验证码」等敏感词)和内容,降低垃圾邮件触发概率。
3. 虚假邮箱正常、recoveryEmail异常的差异排查
- 对比邮箱验证状态:虚假邮箱若已在SES验证,而recoveryEmail未验证,沙箱模式下SES会拒绝发送未验证邮箱的邮件。
- 检查收件人列表构建逻辑:确保Lambda同时将默认邮箱和recoveryEmail加入SES收件人列表,示例:
import boto3 ses_client = boto3.client('ses') destinations = [ event['request']['userAttributes']['email'], recovery_email ] ses_client.send_email( Source='your-verified-sender@example.com', Destination={'ToAddresses': destinations}, Message={ 'Subject': {'Data': 'Your password reset code'}, 'Body': {'Text': {'Data': email_body}} } ) - 查看SES邮件活动日志:在SES控制台「邮件活动」中,查询发送到recoveryEmail的记录,根据退信原因(如邮箱不存在、未验证、被拒收)针对性修复。
内容的提问来源于stack exchange,提问作者Prem Jogi
相关产品推荐
相关产品推荐

