如何在AWS Cognito忘记密码自定义Lambda中将图片作为附件嵌入
AWS Cognito 自定义密码重置邮件内嵌Logo实现方案
核心实现逻辑
通过Cognito的「自定义消息」Lambda触发器,在密码重置邮件发送前对内容进行改造,通过CID关联内嵌图片附件的方式实现Logo嵌入,无需依赖公网可访问的图片URL。
操作步骤
- 步骤1:预处理Logo素材
将公司Logo导出为PNG/JPG格式,压缩到100KB以内,避免邮件被判定为垃圾邮件,再将图片转为Base64编码备用。 - 步骤2:配置Cognito触发器
进入AWS Cognito用户池控制台,在「触发器」配置页,选择一个Node.js环境的Lambda作为自定义消息触发器,保存配置。 - 步骤3:编写Lambda处理代码
参考以下示例修改Lambda代码,替换对应占位内容即可:
exports.handler = (event, context, callback) => { // 仅匹配忘记密码的触发场景 if (event.triggerSource === "CustomMessage_ForgotPassword") { // 替换为你自己的Logo Base64编码,无需带data:image前缀 const logoBase64 = "YOUR_LOGO_BASE64_CODE"; // 自定义邮件HTML内容,cid和后续附件的cid参数保持一致 const emailContent = ` <div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;"> <img src="cid:company-official-logo" alt="公司Logo" style="width: 120px; margin-bottom: 24px;" /> <p>您好,您申请了密码重置操作,本次验证码为:<strong>${event.request.codeParameter}</strong></p> <p>验证码有效期为15分钟,如非本人操作请忽略本邮件。</p> </div> `; // 配置邮件主题、内容 event.response.emailSubject = "【你的公司名称】密码重置验证码"; event.response.emailMessage = emailContent; // 配置内嵌图片附件 event.response.emailAttachments = [ { filename: "company-logo.png", content: logoBase64, encoding: "base64", cid: "company-official-logo" } ]; } callback(null, event); };
- 步骤4:配置Lambda权限
为Lambda的执行角色添加cognito-idp.amazonaws.com的调用权限,避免触发器调用失败。
备选轻量方案(无需添加附件)
如果不需要兼容特别老旧的邮件客户端,可以直接把Base64编码写入img标签的src属性,不用配置附件,实现更简单:
<img src="data:image/png;base64,你的完整Logo Base64编码" alt="公司Logo" style="width:120px;"/>
注意事项
- 测试时触发忘记密码流程后,优先用主流邮箱客户端测试显示效果,部分邮箱会默认拦截非白名单发件人的内嵌图片,可引导用户将你的发件邮箱添加到通讯录白名单
- 邮件整体大小不要超过1MB,避免被邮件服务商拦截
- 如果需要适配其他Cognito邮件场景(比如用户注册验证),只需新增对应
triggerSource的判断分支即可
内容的提问来源于stack exchange,提问作者Sushank Dahiwadkar
相关产品推荐
相关产品推荐

