实战指南:基于 aws-doc-sdk-examples 工作流的编写与渲染)
示例工程教程后端【免费下载链接】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点击查看免费下载Amazon SES v2 的模板化邮件发送SendEmailTemplate不仅需要 HTML 版本还必须提供纯文本Text版本以满足不支持 HTML 的邮件客户端以及偏好纯文本的收件人。本文以 aws-doc-sdk-examples 仓库中 SES v2 Coupon Newsletter 场景 的关联文档 43_coupon_newsletter_txt.md 为骨架讲解coupon-newsletter.txt的完整内容、Mustache 风格占位符{{#coupons}}{{details}}{{/coupons}}的数据绑定机制并结合 Java、Python、Rust、.NET 四种语言的真实实现说明它如何被CreateEmailTemplate与SendEmailAPI 在运行时消费。读完本文你将能够独立编写、校验并与 HTML 模板、sample_coupons.json数据协同部署一套可用的 SES v2 模板化通讯稿。1. 纯文本模板在整个工作流中的定位在 SES v2 Coupon Newsletter 工作流规范 中整个场景围绕订阅列表 周度优惠券通讯稿展开核心步骤包括Prepare the Application创建CreateEmailIdentity验证发件邮箱与CreateContactList联系列表weekly-coupons-newsletter。Gather Subscriber Email Addresses通过 plus addressing如userses-weekly-newsletter-1example.com批量生成 3 个子地址逐一CreateContact并发送欢迎邮件。Send the Coupon NewsletterCreateEmailTemplate注册模板ListContacts拉取订阅者对每个联系人调用一次SendEmail使用模板渲染发送。Monitor and Review在 AWS 控制台查看发送指标。Clean up删除联系列表、模板并可选删除邮箱身份。在该流程中40_sample_files.md 明确了工作流需要四份样例文件文件用途welcome.html欢迎邮件的 HTML 内容coupon-newsletter.html周度优惠券通讯稿的 HTML 模板coupon-newsletter.txt周度优惠券通讯稿的纯文本模板即本文主角sample_coupons.json通讯稿中要插入的优惠券数据JSON 数组coupon-newsletter.txt与coupon-newsletter.html一起在CreateEmailTemplate调用中分别作为TemplateContent.Html与TemplateContent.Text字段被读取见规范中的参数列表。也就是说纯文本版本不是可选项而是模板化邮件结构的一部分。2. coupon-newsletter.txt 的完整内容与逐段解读关联文档 43_coupon_newsletter_txt.md 给出的样例文件完整内容如下Weekly Coupons Newsletter Check out this weeks hot deals and exclusive coupons! {{#coupons}} - {{details}} {{/coupons}} Hurry, these offers wont last long! Visit our website or your nearest store to take advantage of these amazing deals. Happy shopping! The Weekly Coupons Team逐段解读标题行Weekly Coupons Newsletter与 HTML 版 42_coupon_newsletter_html.md 中的h1一致也与CreateEmailTemplate的Subject: Weekly Coupons Newsletter保持一致确保纯文本模式下主题可辨识。引导语Check out this weeks hot deals and exclusive coupons!对应 HTML 版中的段落p。优惠券区块核心{{#coupons}} ... {{/coupons}}是 Mustache/Handlebars 风格的 section 标签。{{#coupons}}表示对 coupons 数组进行遍历块内每一轮迭代中{{details}}被替换为当前优惠券对象的details字段值。模板渲染后每行形如- 20% off on all electronics。结尾号召语与签名Hurry, these offers wont last long!...、Happy shopping!与The Weekly Coupons Team构成完整的商业邮件闭环。相比 HTML 版纯文本版刻意去掉了所有 HTML 标签与内联样式如Arial字体、max-width: 600px、border-radius等这是因为它面向两类场景不支持 HTML 渲染的邮件客户端部分老式客户端、纯文本终端、某些辅助阅读设备偏好纯文本邮件的收件人部分用户会将邮件客户端设置为强制纯文本阅读。同时纯文本版同样保留{{#coupons}}/{{details}}/{{/coupons}}占位符说明它并不只是静态文本而是和 HTML 版一样参与运行时数据绑定。3. 占位符的数据绑定coupons 数组与 SendEmail 的 TemplateData纯文本模板中的{{#coupons}}{{details}}{{/coupons}}必须配合真实数据才能渲染出邮件正文。工作流规范规定数据来源是 sample_coupons.json其结构为外层一个coupons键值是优惠券对象数组每个对象只有一个details键{ coupons: [ { details: 20% off on all electronics }, { details: Buy one, get one free on books }, { details: 15% off on home appliances }, { details: Free shipping on orders over $50 }, { details: 25% off on outdoor gear }, { details: 10% off on groceries } ] }规范要求恰好六个优惠券条目与Send the Coupon Newsletter小节列出的六条一一对应。在发送阶段SendEmail调用的关键参数为Content.Template.TemplateNameweekly-coupons指向已创建的模板模板内含coupon-newsletter.txt的 Text 内容Content.Template.TemplateDatasample_coupons.json的内容即上面这段 JSON 字符串ListManagementOptions.ContactListNameweekly-coupons-newsletter用于正确填充 Unsubscribe 请求头和{{amazonSESUnsubscribeUrl}}变量Destination.ToAddresses来自ListContacts响应的单个邮箱地址——规范强调每个邮箱必须单独调用一次SendEmail以便单独跟踪与退订。SES v2 的模板引擎会同时渲染模板的 HTML 与 Text 两个部分遍历coupons数组把每个{{details}}替换为对应值最终生成纯文本正文中的优惠券清单。4. 源码级佐证四种语言如何消费 coupon-newsletter.txt仓库为这一场景提供了 Java、Python、Rust、.NET 四种实现均以文件读取或编译期内嵌方式把coupon-newsletter.txt注入模板。以下是从源码中确认的实现事实。4.1 Java运行期读取 resources 文件Java 实现位于 NewsletterWorkflow.java。prepareApplication中通过Files.readString从resources/coupon_newsletter/目录读取模板的 HTML 与纯文本内容再构造EmailTemplateContentString newsletterHtml Files.readString(Paths.get(resources/coupon_newsletter/coupon-newsletter.html)); String newsletterText Files.readString(Paths.get(resources/coupon_newsletter/coupon-newsletter.txt)); CreateEmailTemplateRequest templateRequest CreateEmailTemplateRequest.builder() .templateName(TEMPLATE_NAME) .templateContent(EmailTemplateContent.builder() .subject(Weekly Coupons Newsletter) .html(newsletterHtml) .text(newsletterText) .build()) .build();发送阶段sendCouponNewsletter则读取sample_coupons.json作为Template.templateData()并为每个联系人单独发送。对AlreadyExistsException模板已存在与LimitExceededException模板数量超限均有分支处理。测试类 NewsletterWorkflowTest.java 覆盖了对应流程。4.2 Pythonboto3 字典构造Python 实现 newsletter.py 中prepare_application用load_file_content读取文件后以字典形式构造TemplateContenttemplate_content { Subject: Weekly Coupons Newsletter, Html: load_file_content(coupon-newsletter.html), Text: load_file_content(coupon-newsletter.txt), } self.ses_client.create_email_template( TemplateNameTEMPLATE_NAME, TemplateContenttemplate_content )send_coupon_newsletter中读取sample_coupons.json作为TemplateData并通过ListManagementOptions{ContactListName: CONTACT_LIST_NAME}传递退订配置。值得注意的实践细节在 SES 沙箱模式下每次发送后sleep(1.1)每秒约 1 封的限制生产环境应移除。4.3 Rust编译期内嵌与运行期读取两种方式Rust 场景源码位于 newsletter.rs。一个值得关注的细节是文档版本 62a_newsletter.rs.md 展示的是编译期内嵌写法即通过include_str!(../resources/newsletter/coupon-newsletter.txt)将纯文本模板在编译期固化进二进制而仓库中实际落地的src/newsletter.rs则采用运行期std::fs::read_to_string(../resources/newsletter/coupon-newsletter.txt)读取并对读取失败回退为占位字符串unwrap_or_else(|_| Missing coupon-newsletter.txt.to_string())。两种方式各有适用场景内嵌省去运行时文件依赖、便于单文件分发运行期读取则便于热更新模板而不必重新编译。发送阶段同样以read_to_string(../resources/newsletter/sample_coupons.json)获取TemplateData。4.4 .NET常量文件名的运行期读取.NET 实现 NewsletterWorkflow.cs 将文件名定义为常量private static string _textContentFile coupon-newsletter.txt; private static string _htmlWelcomeFile welcome.html;同样在运行期读取文件内容后构造模板印证了四个语言实现共享同一套文件命名与语义约定。5. 与 HTML 模板的结构对比与编写要点42_coupon_newsletter_html.md 给出的 HTML 版在ul中渲染优惠券ul {{#coupons}} li{{details}}/li {{/coupons}} /ulHTML 版与纯文本版的对应关系可以归纳为一张映射表内容单元HTML 版coupon-newsletter.html纯文本版coupon-newsletter.txt标题h1Weekly Coupons Newsletter/h1Weekly Coupons Newsletter引导语pCheck out this weeks hot deals.../p同句纯文本优惠券列表ulli{{details}}/li{{#coupons}}- {{details}}结束语pHurry, these offers wont last long!...同句纯文本签名pHappy shopping!brThe Weekly Coupons Team/pHappy shopping!The Weekly Coupons Team样式内联 CSS字体、边距、圆角、浅灰背景无任何样式编写纯文本模板的实践要点占位符必须与 HTML 版完全一致同一套{{#coupons}}/{{details}}因为 SES 使用同一份TemplateData渲染两个版本行文保持顺序一致便于纯文本模式下信息层级不被破坏内容量与 HTML 版对等不要为了简化而删减优惠券区块否则纯文本收件人会看到残缺的邮件不要引入 HTML 标签或样式纯文本客户端的渲染结果会直接暴露原始标记文本破坏可读性模板正文建议保留退订说明规范要求模板内容应包含{{amazonSESUnsubscribeUrl}}变量配合ListManagementOptions生效纯文本版同样应包含该变量以确保可退订。6. 从文件到收件箱coupon-newsletter.txt 的完整调用链综合规范与源码coupon-newsletter.txt从仓库文件到最终邮件的完整链路如下准备阶段运行prepareApplication依次调用CreateEmailIdentity邮箱身份→CreateContactListweekly-coupons-newsletter联系列表→CreateEmailTemplate模板名weekly-coupons其中TemplateContent.Text来自coupon-newsletter.txt。后两个步骤的AlreadyExistsException均可安全跳过。订阅阶段交互输入基础邮箱后生成 3 个 plus 子地址对每个子地址执行CreateContact并发送欢迎邮件SendEmail的Content.Simple格式读取welcome.html/welcome.txt。发送阶段ListContacts拉取联系人列表对每个邮箱执行一次SendEmailContent.Template.TemplateNameweekly-coupons、TemplateData为sample_coupons.json内容、ListManagementOptions.ContactListName指向联系列表。SES 服务端完成模板渲染HTML 部分按coupon-newsletter.html渲染纯文本部分按coupon-newsletter.txt渲染。清理阶段DeleteContactList级联删除联系人、DeleteEmailTemplate、可选的DeleteEmailIdentity。需要强调的限制与前提若账户处于SES 沙箱发件与收件地址都必须是已验证地址该场景虽会创建发件身份但不会自动验证收件地址且发送速率受限Python 实现中sleep(1.1)即为沙箱节流而设由于场景刻意使用多个 plus 子地址发往同一真实邮箱部分邮件服务商会将这类邮件判为垃圾邮件README 明确提示发送后请检查垃圾邮件文件夹SendEmail可能抛出的异常包括AccountSuspendedException、MailFromDomainNotVerifiedException、MessageRejected、SendingPausedException等工作流实现均需对应给出明确的用户提示。7. 小结coupon-newsletter.txt看似只是一段 20 余行的纯文本但它在 SES v2 模板化邮件架构中承担着与 HTML 模板同等重要的职责为不支持 HTML 或偏好纯文本的收件人提供完整、可读的邮件内容并通过{{#coupons}}{{details}}{{/coupons}}占位符与sample_coupons.json数据实现运行时动态渲染。在 aws-doc-sdk-examples 仓库中它作为 SES v2 Coupon Newsletter 场景 的四份样例文件之一被 Java、Python、Rust、.NET 四种实现以一致的文件命名与语义约定消费。如需深入可继续阅读 完整工作流规范、HTML 模板文档 与 样例文件清单。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】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点击查看免费下载相关推荐chat4cj用户管理指南账户创建、在线状态查询与头像设置全解析chat4cj用户管理指南账户创建、在线状态查询与头像设置全解析 chat4cj 是一个面向 Rocket.Chat 服务器的 Cangjie 语言客户端库示例工程教程后端Amazon SES v2 CreateEmailIdentity 操作详解在 aws-doc-sdk-examples 优惠券新闻通讯工作流中完成发信身份验证Amazon SES v2 CreateEmailIdentity 操作详解在 aws doc sdk examples 优惠券新闻通讯工作流中完成发信身份验示例工程教程后端Amazon SES v2 周度优惠券邮件工作流的样例文件设计与模板渲染指南Amazon SES v2 周度优惠券邮件工作流的样例文件设计与模板渲染指南 本篇技术指南以 AWS Code Examples 仓库中 SES v2 Coup示例工程教程后端上一篇从数据到决策aops-diana异常检测算法的完整开发流程解析下一篇openeuler/embedded-ipc开发者手册Proxy与Stub模式的设计与实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考