

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 高级电子邮件个性化
<a name="send-personalized-email-advanced"></a>

 如果您使用的是*存储的模板*，即您已通过使用 SES v2 API 的 `CreateEmailTemplate` 操作在 Amazon SES 中创建了 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Template.html) 资源，您可以利用 Handlebars 系统创建包含高级功能的模板，例如嵌套属性、数组迭代、基本条件语句和创建内联部分。本部分提供有关这些特征的一些示例。

除本部分介绍的特征以外，Handlebars 还包含许多其他特征。欲了解更多信息，请参阅 [Built-Inh [and](http://handlebarsjs.com) lebarsjs.com 上的 Helpers](https://handlebarsjs.com/guide/builtin-helpers.html)。

**注意**  
为消息呈现 HTML 模板时，SES 不会转义 HTML 内容。这意味着，如果您包括用户输入的数据，例如联系人表单的用户输入数据，则需要在客户端将其转义。

**Topics**
+ [解析嵌套属性](#send-personalized-email-advanced-nested)
+ [遍历列表](#send-personalized-email-advanced-iterating)
+ [使用基本条件语句](#send-personalized-email-advanced-conditionals)
+ [创建内联部分](#send-personalized-email-advanced-inline-partials)

## 解析嵌套属性
<a name="send-personalized-email-advanced-nested"></a>

Handlebars 包括对嵌套路径的支持，这让您能够轻松组织复杂的客户数据，然后在电子邮件模板中引用这些数据。

例如，您可以将收件人数据组织到多个常规类别中。在每个类别中，您可以包含详细信息。以下代码示例显示了包含单一收件人的此种结构：

```
{
  "meta":{
    "userId":"51806220607"
  },
  "contact":{
    "firstName":"Anaya",
    "lastName":"Iyengar",
    "city":"Bengaluru",
    "country":"India",
    "postalCode":"560052"
  },
  "subscription":[
    {
      "interest":"Sports"
    },
    {
      "interest":"Travel"
    },
    {
      "interest":"Cooking"
    }
  ]
}
```

在电子邮件模板中，您可以通过以下方式引用嵌套属性：提供父属性名称，后跟句点 (.)，然后是要包含其值的属性的名称。例如，对于上例中显示的数据结构，要在电子邮件模板中包含每个收件人的名字，请在电子邮件模板中包含以下文本：`Hello {{contact.firstName}}!`

Handlebars 能够解析多层嵌套路径，这意味着您可以灵活地组织模板数据结构。

## 遍历列表
<a name="send-personalized-email-advanced-iterating"></a>

`each` 帮助程序函数可遍历数组中的项目。以下代码是一个电子邮件模板的示例，此模板使用 `each` 帮助程序函数创建每个收件人兴趣的明细列表。

```
{
  "Template": {
    "TemplateName": "Preferences",
    "SubjectPart": "Subscription Preferences for {{contact.firstName}} {{contact.lastName}}",
    "HtmlPart": "<h1>Your Preferences</h1>
                 <p>You have indicated that you are interested in receiving 
                   information about the following subjects:</p>
                 <ul>
                   {{#each subscription}}
                     <li>{{interest}}</li>
                   {{/each}}
                 </ul>
                 <p>You can change these settings at any time by visiting 
                    the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                    Preference Center</a>.</p>",
    "TextPart": "Your Preferences\n\nYou have indicated that you are interested in 
                 receiving information about the following subjects:\n
                 {{#each subscription}}
                   - {{interest}}\n
                 {{/each}}
                 \nYou can change these settings at any time by 
                 visiting the Preference Center at 
                 https://www.example.com/prefererences/i.aspx?id={{meta.userId}}"
  }
}
```

**重要**  
在前面的代码示例中，`HtmlPart` 和 `TextPart` 属性的值包含换行符，以便提高示例的可读性。您的模板的 JSON 文件不能在这些值中包含换行符。如果您将此示例复制并粘贴到自己的 JSON 文件中，请在继续前从 `HtmlPart` 和 `TextPart` 部分中删除换行符和多余空格。

创建模板后，您可以使用 `SendEmail` 或 `SendBulkEmail` 操作使用此模板向收件人发送电子邮件。只要每个收件人在 `Interests` 对象中至少有一个值，他们就会收到包含其兴趣明细列表的电子邮件。以下示例显示了可用于使用上述模板向多个收件人发送电子邮件的 JSON 文件：

```
{
  "Source":"Sender Name <sender@example.com>",
  "Template":"Preferences",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
          "anaya.iyengar@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"51806220607\"},\"contact\":{\"firstName\":\"Anaya\",\"lastName\":\"Iyengar\"},\"subscription\":[{\"interest\":\"Sports\"},{\"interest\":\"Travel\"},{\"interest\":\"Cooking\"}]}"
      },
    {
      "Destination":{ 
        "ToAddresses":[
          "shirley.rodriguez@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"1981624758263\"},\"contact\":{\"firstName\":\"Shirley\",\"lastName\":\"Rodriguez\"},\"subscription\":[{\"interest\":\"Technology\"},{\"interest\":\"Politics\"}]}"
    }
  ],
  "DefaultTemplateData":"{\"meta\":{\"userId\":\"\"},\"contact\":{\"firstName\":\"Friend\",\"lastName\":\"\"},\"subscription\":[]}"
}
```

当您使用 `SendBulkEmail` 操作向前面示例中列出的收件人发送电子邮件时，他们会收到类似下图所示示例的邮件：

![偏好通知将体育、旅行和烹饪列为选定兴趣。](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/images/send-personalized-email-advanced-condition-interest.png)


## 使用基本条件语句
<a name="send-personalized-email-advanced-conditionals"></a>

本部分基于前一部分中介绍的示例。前一部分中的示例使用 `each` 帮助程序遍历兴趣列表。但是，未指定兴趣的收件人会收到包含空列表的电子邮件。通过使用 `{{if}}` 帮助程序，您可根据模板数据中是否存在特定属性以不同方式设置电子邮件格式。以下代码使用了 `{{if}}` 帮助程序：如果 `Subscription` 数组包含任何值，则显示前一部分中的项目符号列表。如果数组为空，则显示其他的文本块。

```
{
  "Template": {
    "TemplateName": "Preferences2",
    "SubjectPart": "Subscription Preferences for {{contact.firstName}} {{contact.lastName}}",
    "HtmlPart": "<h1>Your Preferences</h1>
                 <p>Dear {{contact.firstName}},</p>
                 {{#if subscription}}
                   <p>You have indicated that you are interested in receiving 
                     information about the following subjects:</p>
                     <ul>
                     {{#each subscription}}
                       <li>{{interest}}</li>
                     {{/each}}
                     </ul>
                     <p>You can change these settings at any time by visiting 
                       the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                       Preference Center</a>.</p>
                 {{else}}
                   <p>Please update your subscription preferences by visiting 
                     the <a href=https://www.example.com/prefererences/i.aspx?id={{meta.userId}}>
                     Preference Center</a>.
                 {{/if}}",
    "TextPart": "Your Preferences\n\nDear {{contact.firstName}},\n\n
                 {{#if subscription}}
                   You have indicated that you are interested in receiving 
                   information about the following subjects:\n
                   {{#each subscription}}
                     - {{interest}}\n
                   {{/each}}
                   \nYou can change these settings at any time by visiting the 
                   Preference Center at https://www.example.com/prefererences/i.aspx?id={{meta.userId}}.
                 {{else}}
                   Please update your subscription preferences by visiting the 
                   Preference Center at https://www.example.com/prefererences/i.aspx?id={{meta.userId}}.
                 {{/if}}"
  }
}
```

**重要**  
在前面的代码示例中，`HtmlPart` 和 `TextPart` 属性的值包含换行符，以便提高示例的可读性。您的模板的 JSON 文件不能在这些值中包含换行符。如果您将此示例复制并粘贴到自己的 JSON 文件中，请在继续前从 `HtmlPart` 和 `TextPart` 部分中删除换行符和多余空格。

以下示例显示了可用于使用上述模板向多个收件人发送电子邮件的 JSON 文件：

```
{
  "Source":"Sender Name <sender@example.com>",
  "Template":"Preferences2",
  "Destinations":[
    {
      "Destination":{
        "ToAddresses":[
          "anaya.iyengar@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"51806220607\"},\"contact\":{\"firstName\":\"Anaya\",\"lastName\":\"Iyengar\"},\"subscription\":[{\"interest\":\"Sports\"},{\"interest\":\"Cooking\"}]}"
      },
    {
      "Destination":{ 
        "ToAddresses":[
          "shirley.rodriguez@example.com"
        ]
      },
      "ReplacementTemplateData":"{\"meta\":{\"userId\":\"1981624758263\"},\"contact\":{\"firstName\":\"Shirley\",\"lastName\":\"Rodriguez\"}}"
    }
  ],
  "DefaultTemplateData":"{\"meta\":{\"userId\":\"\"},\"contact\":{\"firstName\":\"Friend\",\"lastName\":\"\"},\"subscription\":[]}"
}
```

在此示例中，模板数据包含兴趣列表的收件人会收到与前一部分中所示示例相同的电子邮件。模板数据不包含任何兴趣的收件人会收到类似下图所示示例的电子邮件：

![标题为 “您的首选项” 的电子邮件以及有关更新订阅首选项的文本。](http://docs.aws.amazon.com/zh_cn/ses/latest/dg/images/send-personalized-email-advanced-condition-nointerest.png)


## 创建内联部分
<a name="send-personalized-email-advanced-inline-partials"></a>

您可以使用内联部分简化包含重复字符串的模板。例如，您可以在模板开头添加以下代码，从而创建一个内联部分，其中包含收件人的名字和姓氏 (如果可用)：

```
{{#* inline \"fullName\"}}{{firstName}}{{#if lastName}} {{lastName}}{{/if}}{{/inline}}\n
```

**注意**  
需要使用换行符 (`\n`) 将 `{{inline}}` 块与模板内容分开。最终输出中不显示换行符。

创建 `fullName` 部分后，您可以通过在此部分的名称前加上一个大于号 (>) 并后跟一个空格来将其包含在模板中的任何位置，如下例所示：`{{> fullName}}`。内联部分不会在电子邮件部分间转移。例如，要在电子邮件的 HTML 和文本版本中使用相同的内联部分，则必须在 `HtmlPart` 和 `TextPart` 部分中都定义此部分。

遍历数组时，也可以使用内联部分。您可以使用以下代码创建使用 `fullName` 内联部分的模板。在此示例中，内联部分应用至收件人姓名和一个其他名称数组：

```
{
  "Template": {
    "TemplateName": "Preferences3",
    "SubjectPart": "{{firstName}}'s Subscription Preferences",
    "HtmlPart": "{{#* inline \"fullName\"}}
                   {{firstName}}{{#if lastName}} {{lastName}}{{/if}}
                 {{/inline~}}\n
                 <h1>Hello {{> fullName}}!</h1>
                 <p>You have listed the following people as your friends:</p>
                 <ul>
                 {{#each friends}}
                   <li>{{> fullName}}</li>
                 {{/each}}</ul>",
    "TextPart": "{{#* inline \"fullName\"}}
                   {{firstName}}{{#if lastName}} {{lastName}}{{/if}}
                 {{/inline~}}\n
                 Hello {{> fullName}}! You have listed the following people 
                 as your friends:\n
                 {{#each friends}}
                   - {{> fullName}}\n
                 {{/each}}"
  }
}
```

**重要**  
在前面的代码示例中，`HtmlPart` 和 `TextPart` 属性的值包含换行符，以便提高示例的可读性。您的模板的 JSON 文件不能在这些值中包含换行符。如果您将此示例复制并粘贴到自己的 JSON 文件中，请从这些部分中删除换行符和多余空格。