ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 AWS SDK for JavaScript (v3) 开发 Amazon SES:身份验证、发信、模板与收件规则完整实战指南

使用 AWS SDK for JavaScript (v3) 开发 Amazon SES:身份验证、发信、模板与收件规则完整实战指南 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本指南以 javascriptv3/example_code/ses/README.md 为主线系统讲解如何基于 AWS SDK for JavaScript (v3) 调用 Amazon Simple Email Service (Amazon SES)。你将掌握 SES 客户端初始化、邮箱与域名身份验证、普通/模板化/批量/带附件发信、模板全生命周期管理、IP 地址过滤与收件规则落地 S3 等 21 个单项操作并了解配套的 Vitest 集成测试与命令行运行方式可直接复刻到自己的项目中。目录一、前置准备与环境要求二、初始化 SES 服务客户端三、邮箱与域名身份验证四、发送邮件从普通邮件到批量模板邮件五、带附件发送基于 nodemailer 的 SendRawEmail 方案六、模板管理创建、读取、更新、删除与列表七、接收端配置IP 地址过滤与收件规则八、身份与过滤器的查询与清理九、运行示例与集成测试十、安全与费用注意事项一、前置准备与环境要求所有示例代码都位于 javascriptv3/example_code/ses/src 目录下采用 ECMAScript 6ES6模块语法编写import/export因此运行环境需要支持 ES6 模块的 Node.js。若你的项目使用 CommonJS可参考 AWS 官方文档中关于 JavaScript ES6/CommonJS 语法转换的说明。在运行代码前你需要先完成通用前置条件详见 javascriptv3/README.md 中的 Prerequisites 章节主要包括配置 AWS 凭据Access Key / Secret Access KeySDK 会通过标准的凭据提供链自动解析安装 Node.js 并配置好aws-sdk/client-ses依赖确认目标 AWS 区域的 SES 可用性。从 package.json 可以看到本模块的依赖清单{ type: module, dependencies: { aws-doc-sdk-examples/lib: ^1.0.0, aws-sdk/client-ses: ^3.215.0, nodemailer: ^6.9.4 }, devDependencies: { vitest: ^1.6.0 } }其中aws-sdk/client-ses提供所有 SES 操作命令nodemailer用于带附件的发信场景vitest负责集成测试aws-doc-sdk-examples/lib提供示例通用工具如生成唯一名称的getUniqueName与字符串拼接的postfix。二、初始化 SES 服务客户端所有操作都基于同一个客户端实例。在 src/libs/sesClient.js 中客户端被集中封装并导出import { SESClient } from aws-sdk/client-ses; // Set the AWS Region. const REGION us-east-1; // Credentials are automatically resolved using the AWS SDK credential provider chain. const sesClient new SESClient({ region: REGION }); export { sesClient };关键点区域Region示例默认设置为us-east-1。你可以根据需要修改但要注意 SES 并非在每个 AWS 区域都可用且不同区域可能有不同的沙箱限制如仅允许发送到已验证地址。凭据解析代码注释明确指出凭据由 AWS SDK 凭据提供链自动解析无需在代码中硬编码密钥建议通过环境变量、共享凭据文件或 IAM 角色获取。三、邮箱与域名身份验证Amazon SES 处于沙箱环境时只能向已验证的邮箱或域名发送邮件。因此身份验证是使用 SES 的第一步。3.1 验证邮箱身份src/ses_verifyemailidentity.js 演示了发送验证邮件的过程import { VerifyEmailIdentityCommand } from aws-sdk/client-ses; import { sesClient } from ./libs/sesClient.js; const EMAIL_ADDRESS nameexample.com; const createVerifyEmailIdentityCommand (emailAddress) { return new VerifyEmailIdentityCommand({ EmailAddress: emailAddress }); }; const run async () { const verifyEmailIdentityCommand createVerifyEmailIdentityCommand(EMAIL_ADDRESS); try { return await sesClient.send(verifyEmailIdentityCommand); } catch (err) { console.log(Failed to verify email identity., err); return err; } };调用后Amazon SES 会向该邮箱发送一封验证邮件点击邮件中的链接即可完成验证。该文件同时导出了EMAIL_ADDRESS常量方便在集成测试中引用。3.2 验证域名身份src/ses_verifydomainidentity.js 演示了添加并验证域名身份const DOMAIN_NAME postfix(getUniqueName(Domain), .example.com); const createVerifyDomainIdentityCommand () { return new VerifyDomainIdentityCommand({ Domain: DOMAIN_NAME }); };与邮箱验证不同域名验证需要你拥有该域名的 DNS 管理权限调用后 SES 会返回一个验证 Token你需要将其以 DNS TXT 记录的形式发布到域名下才能完成验证。源码注释对此有明确提示You must have access to the domains DNS settings to complete the domain verification process.你必须有该域名 DNS 设置的访问权限才能完成域名验证流程。四、发送邮件从普通邮件到批量模板邮件4.1 发送普通邮件SendEmailsrc/ses_sendemail.js 展示了最完整的SendEmailCommand参数结构const createSendEmailCommand (toAddress, fromAddress) { return new SendEmailCommand({ Destination: { CcAddresses: [], ToAddresses: [toAddress], }, Message: { Body: { Html: { Charset: UTF-8, Data: HTML_FORMAT_BODY }, Text: { Charset: UTF-8, Data: TEXT_FORMAT_BODY }, }, Subject: { Charset: UTF-8, Data: EMAIL_SUBJECT }, }, Source: fromAddress, ReplyToAddresses: [], }); };参数说明Destination.ToAddresses/CcAddresses/BccAddresses收件人列表至少需要ToAddressesMessage.Body.Html与Message.Body.Text邮件正文可同时提供 HTML 与纯文本两种格式客户端会自动选择Charset默认使用UTF-8Message.Subject邮件主题Source发件人地址必须是通过验证的身份邮箱或所属域名ReplyToAddresses可选的回复地址列表。源码还演示了MessageRejected错误的专门处理try { return await sesClient.send(sendEmailCommand); } catch (caught) { if (caught instanceof Error caught.name MessageRejected) { const messageRejectedError caught; return messageRejectedError; } throw caught; }MessageRejected是 SES 最常见的业务错误通常意味着发件地址未验证、收件地址处于沙箱限制内或邮件被策略拒绝建议在业务代码中单独捕获并做友好提示。4.2 发送模板化邮件SendTemplatedEmailsrc/ses_sendtemplatedemail.js 演示了基于已有模板发送个性化邮件const createReminderEmailCommand (user, templateName) { return new SendTemplatedEmailCommand({ Destination: { ToAddresses: [user.emailAddress] }, TemplateData: JSON.stringify({ contact: { firstName: user.firstName } }), Source: VERIFIED_EMAIL, Template: templateName, }); };模板占位符的替换逻辑在源码注释中演示得很清楚若模板内容为h1Hello {{contact.firstName}},/h1pDont forget about the party gifts!/p而TemplateData传入{contact:{firstName:Bilbo}}则渲染结果即为h1Hello Bilbo,/h1pDont forget about the party gifts!/p。这里TemplateData必须是 JSON 字符串模板占位符采用 Handlebars 风格的{{path.to.field}}语法详见下文模板创建部分。4.3 发送批量模板邮件SendBulkTemplatedEmail仓库还提供了SendBulkTemplatedEmail操作src/ses_sendbulktemplatedemail.js。与SendTemplatedEmail的区别在于它支持在一次请求中为多个收件人分别指定各自的TemplateData例如不同用户的不同姓名适合发送大批量个性化通知并且能够针对每个收件人单独返回投递状态。五、带附件发送基于 nodemailer 的 SendRawEmail 方案普通SendEmail无法直接携带附件需要走SendRawEmail即发送原始 MIME 邮件路线。仓库的 src/send-with-attachments.js 采用了一个更优雅的方案用 nodemailer 封装 SES由 nodemailer 在底层调用SendRawEmailimport sesClientModule from aws-sdk/client-ses; import nodemailer from nodemailer; export const sendEmailWithAttachments (from fromexample.com, to toexample.com) { const ses new sesClientModule.SESClient({}); const transporter nodemailer.createTransport({ SES: { ses, aws: sesClientModule }, }); return new Promise((resolve, reject) { transporter.sendMail( { from, to, subject: Hello World, text: Greetings from Amazon SES!, attachments: [{ content: Hello World!, filename: hello.txt }], }, (err, info) { if (err) { reject(err); } else { resolve(info); } }, ); }); };源码注释解释了设计动机nodemailer 包装 SES SDK 并调用SendRawEmail用于需要添加附件等更高级功能的场景。关键点attachments数组支持content附件内容与filename附件文件名字段也可传文件路径或流发件人from与收件人to都必须是 SES 已验证地址该文件通过process.argv[1] fileURLToPath(import.meta.url)判断是否为直接运行入口因此既可作为模块被其他代码import也可用node send-with-attachments.js直接执行。六、模板管理创建、读取、更新、删除与列表6.1 创建模板CreateTemplatesrc/ses_createtemplate.js 演示了模板的创建源码注释明确指出The template feature in Amazon SES is based on the Handlebars template system.SES 模板功能基于 Handlebars 模板系统const createCreateTemplateCommand () { return new CreateTemplateCommand({ Template: { TemplateName: TEMPLATE_NAME, HtmlPart: h1Hello, {{contact.firstName}}!/h1 p Did you know Amazon has a mascot named Peccy? /p , SubjectPart: Amazon Tip, }, }); };Template对象主要包含三部分TemplateName模板名称全局唯一后续发送模板邮件时凭此引用HtmlPartHTML 正文模板使用{{contact.firstName}}这类 Handlebars 占位符SubjectPart邮件主题模板同样支持占位符还可选TextPart纯文本正文。6.2 读取模板GetTemplatesrc/ses_gettemplate.js 通过GetTemplateCommand({ TemplateName: ... })获取指定模板的详细内容HTML/文本/主题部分。6.3 更新模板UpdateTemplatesrc/ses_updatetemplate.js 通过UpdateTemplateCommand更新已存在模板的内容。注意模板被更新后会有一段生效延迟通常为 15 秒新发送的邮件才会使用新版本。6.4 删除模板DeleteTemplatesrc/ses_deletetemplate.js 通过DeleteTemplateCommand删除不再使用的模板避免超出账号的模板数量配额。6.5 列出模板ListTemplatessrc/ses_listtemplates.js 通过ListTemplatesCommand分页返回当前账号下的全部模板名称列表可用于模板管理界面的数据源。七、接收端配置IP 地址过滤与收件规则SES 不仅能发信还能通过收件规则Receipt Rules处理入站邮件。这一组示例展示了过滤 → 建规则集 → 落规则的完整链路。7.1 创建 IP 地址过滤器CreateReceiptFiltersrc/ses_createreceiptfilter.js 演示了创建 IP 过滤器以允许或阻止特定来源 IP 的邮件const createCreateReceiptFilterCommand ({ policy, ipOrRange, name }) { return new CreateReceiptFilterCommand({ Filter: { IpFilter: { Cidr: ipOrRange, // 单个 IP如 10.0.0.1或 CIDR 范围如 10.0.0.1/24 Policy: policy, // 枚举 ReceiptFilterPolicy }, Name: name, // 仅限 ASCII 字母、数字、下划线或短横线长度小于 64以字母或数字开头和结尾 }, }); };源码对参数做了详尽的注释Cidr可以是单个 IP 地址如10.0.0.1也可以是 CIDR 记法的地址段如10.0.0.1/24Policy取自枚举ReceiptFilterPolicy示例中使用ReceiptFilterPolicy.Allow放行也可设为Block阻止Name过滤器名称有字符集限制只允许 ASCII 字母、数字、下划线或短横线且必须小于 64 个字符、以字母或数字开头和结尾。7.2 创建收件规则集CreateReceiptRuleSetsrc/ses_createreceiptruleset.js 演示了创建空的规则集const createCreateReceiptRuleSetCommand (ruleSetName) { return new CreateReceiptRuleSetCommand({ RuleSetName: ruleSetName }); };规则集是收件规则的容器SES 的规则必须以规则集为单位组织且每个账号在任一时刻只有一个活动的规则集。注意创建规则集后还需要将规则加入其中才能生效。7.3 创建收件规则并存入 S3CreateReceiptRulesrc/ses_createreceiptrule.js 演示了创建一条把收到的邮件自动保存到 S3 桶的规则const createS3ReceiptRuleCommand ({ bucketName, emailAddresses, name, ruleSet }) { return new CreateReceiptRuleCommand({ Rule: { Actions: [ { S3Action: { BucketName: bucketName, ObjectKeyPrefix: email, }, }, ], Recipients: emailAddresses, Enabled: true, Name: name, ScanEnabled: false, TlsPolicy: TlsPolicy.Optional, }, RuleSetName: ruleSet, // Required }); };字段含义Rule.Actions命中规则后执行的动作数组示例中的S3Action会把邮件对象写入指定BucketName并以ObjectKeyPrefixemail作为对象键前缀Rule.Recipients规则匹配的收件人地址列表Rule.Enabled是否启用规则示例为trueRule.ScanEnabled是否启用垃圾邮件/病毒扫描示例为false开启后不合格邮件会被丢弃Rule.TlsPolicy入站连接的 TLS 策略示例使用TlsPolicy.Optional允许非加密连接也可设为Require强制 TLSRuleSetName规则所属的规则集必填。配套的删除操作位于 src/ses_deletereceiptrule.js 与 src/ses_deletereceiptruleset.js用于移除规则或整个规则集。八、身份与过滤器的查询与清理src/ses_listidentities.js 通过ListIdentitiesCommand列出账号下全部身份示例按类型过滤并控制返回数量const createListIdentitiesCommand () new ListIdentitiesCommand({ IdentityType: EmailAddress, MaxItems: 10 });IdentityType可传EmailAddress或DomainMaxItems限制单次返回条数上限 1000配合NextToken分页。src/ses_deleteidentity.js 通过DeleteIdentityCommand删除不再需要的邮箱或域名身份src/ses_listreceiptfilters.js 列出全部 IP 过滤器src/ses_deletereceiptfilter.js 删除指定 IP 过滤器。至此README 中列出的 21 个单项操作已全部覆盖它们在src目录下均有对应脚本并全部遵循构造 Command →sesClient.send(command)→ 捕获异常的统一调用模式。九、运行示例与集成测试9.1 运行方式按照 README 的说明示例均为 ES6 模块运行命令如下运行单个操作node ./src/fileName例如发送普通邮件node ./src/ses_sendemail.js带命令行选项运行部分脚本支持通过 Node.js 的util.parseArgs解析命令行选项node ./src/fileName --option1 --option2每个脚本支持的选项以该文件内的parseArgs用法为准可在运行前查看对应源码确认。9.2 集成测试每个操作都配有对应的 Vitest 集成测试位于 tests 目录例如send-email.integration.test.js、verify-email-identity.integration.test.js、create-receipt-rule.integration.test.js等文件名与 src 下的脚本一一对应。运行集成测试的命令见 package.json 的scriptsnpm run integration-test该命令通过vitest run integration执行并以 JUnit 格式输出到test_results/ses-test-results.junit.xml。⚠ 注意集成测试会真实调用 AWS 服务运行同样可能产生 AWS 账户费用。十、安全与费用注意事项README 在 Important 一节给出了四条必须遵守的提醒费用运行这些代码可能产生 AWS 账户费用包括运行测试在内请先了解定价与免费额度最小权限原则建议为代码授予最小必要权限least privilege仅授予完成当前任务所需的最低权限集例如本示例只需要ses:SendEmail、ses:VerifyEmailIdentity、ses:CreateReceiptRule等对应操作权限区域差异这些代码未经全部 AWS 区域测试使用前请确认目标区域对 SES 及相关特性的支持情况凭据安全从源码可见客户端初始化完全依赖 SDK 凭据提供链切勿在代码或配置文件中写入明文密钥。参考资料示例源码目录javascriptv3/example_code/ses/src集成测试目录javascriptv3/example_code/ses/tests通用前置条件与测试说明javascriptv3/README.md本项目其他语言版本的 SES 示例可参考 dotnetv3/SES、python/example_code/ses、go/example_code/ses 等目录方便对照学习多语言实现。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 Boto3AWS SDK for Python操作 Amazon SES身份验证、模板邮件、IP 过滤器与收件规则完整实战指南使用 Boto3AWS SDK for Python操作 Amazon SES身份验证、模板邮件、IP 过滤器与收件规则完整实战指南 Amazon Sim后端云原生使用 AWS SDK for C 操作 Amazon SES从发信、模板到收件规则的全套代码示例指南使用 AWS SDK for C 操作 Amazon SES从发信、模板到收件规则的全套代码示例指南 导读 本指南基于 aws doc sdk examp示例工程教程后端Linux 内核 BPF_PROG_RUN 详解从用户态执行 eBPF 程序、无副作用测试与 XDP 活帧Live Frames模式Linux 内核 BPF_PROG_RUN 详解从用户态执行 eBPF 程序、无副作用测试与 XDP 活帧Live Frames模式 本文围绕 Linux示例工程教程后端上一篇5分钟快速汉化Axure RP新手完整中文界面安装指南下一篇OntoGPTLLM驱动的本体提取革命让知识图谱构建从未如此简单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表