使用AWS SDK实现AWS SES订阅管理:退订链接未填充问题求助
AWS SES {{amazonSESUnsubscribeUrl}} 未自动填充问题排查与解决
核心问题:API版本与参数位置错误
你当前使用的是SES v1的SendEmailCommand(来自@aws-sdk/client-ses),但{{amazonSESUnsubscribeUrl}}自动替换功能仅支持SES v2 API(@aws-sdk/client-sesv2),且你错误地将ListManagementOptions放在了Message对象内部,同时自定义的邮件头干扰了自动生成逻辑。
具体修复步骤
1. 切换到SES v2 SDK
安装SES v2客户端依赖:
npm install @aws-sdk/client-sesv2
2. 重构代码,修正参数结构
替换原有代码为SES v2实现,注意ListManagementOptions需作为顶层参数传入,移除错误的邮件头配置:
import { SESv2Client, SendEmailCommand } from "@aws-sdk/client-sesv2"; const sesClient = new SESv2Client({ region: "us-east-1" }); export const handler = async (event, context) => { const params = { FromEmailAddress: 'support@validsource.com', // 已验证的发件地址 Destination: { ToAddresses: ['valid-address@gmail.com'] }, Content: { Simple: { Subject: { Data: 'Test HTML Email from AWS SES' }, Body: { Html: { Data: '<h1>Welcome</h1><p>This is a test HTML email sent using AWS SES from a Lambda function. Click <a href="{{amazonSESUnsubscribeUrl}}">here</a> to unsubscribe.</p>' } } } }, // 正确放置ListManagementOptions到顶层 ListManagementOptions: { ContactListName: 'MarketingEmails', TopicName: 'Topic' } }; try { const data = await sesClient.send(new SendEmailCommand(params)); console.log("Email sent!", data); return data; } catch (err) { console.error("Failed to send email.", err); return err; } };
3. 关键验证点
- 收件人必须在目标联系列表中:SES仅对已存在于指定联系列表的收件人填充取消订阅链接,若收件人不在列表中,链接会显示为空。可通过
aws sesv2 create-contact命令或SES控制台添加收件人。 - 移除自定义取消订阅头:SES v2会自动生成标准的
List-Unsubscribe和List-Unsubscribe-Post头,自定义头会覆盖自动生成逻辑,需删除原代码中Headers数组的相关配置。 - 确认Lambda权限:确保Lambda执行角色拥有
sesv2:SendEmail权限,策略示例:
{ "Effect": "Allow", "Action": ["sesv2:SendEmail"], "Resource": "*" }
4. 额外检查步骤
- 确认联系列表存在:执行
aws sesv2 get-contact-list --contact-list-name MarketingEmails验证列表有效性。 - 确认收件人已在列表中:执行
aws sesv2 get-contact --contact-list-name MarketingEmails --email-address valid-address@gmail.com验证收件人状态。
内容的提问来源于stack exchange,提问作者user4422
相关产品推荐
相关产品推荐

