高级电子邮件模板

2016年3月25日

电子邮件

1 min read

高级电子邮件模板

关键要点

    • SparkPost模板支持简单和高级电子邮件撰写,包括HTML、文本、条件逻辑、循环和通过替换变量的每个接收者动态数据。

    • 数组可以传递到替换数据中,允许您遍历项目(例如,文件列表、最近活动、自定义表格行)以为每个接收者生成个性化的部分。

    • 三重大括号{{{ }}}允许您插入原始的、未转义的HTML,当您的替换数据已经包含标记时,这是必需的。

    • 使用传输端点(content.attachments)时可以轻松发送附件,这将为您抽象MIME边界和编码。

    • 内联图像与附件类似,但使用cid:引用在正文中呈现。

    • 模板本身不原生支持附件,但您可以通过制作完整的RFC 5322带有MIME部分的电子邮件并将其存储为email_rfc822模板来包含它们。

    • 在构建原始RFC 5322模板时,替换仍然有效—但仅在头部和第一个HTML和文本MIME部分中。

    • 使用您编程语言的邮件客户端(例如,JavaMail)提供了另一种路径:以编程方式生成完整MIME电子邮件,并通过SparkPost传输API发送。

    • 为了可维护性,尽可能将标记和数据分开——尤其是构建包含循环或多个MIME部分的模板时。

    • 高级模板功能(条件、表达式、数组迭代)允许开发人员构建复杂的、个性化的电子邮件,而无需为每个用例重写整个模板。

Q&A 精华

  • SparkPost 模板可以处理 loops 和 arrays 吗?

    是的。模板可以使用for each构造遍历数组。这使得可以为每个收件人生成动态表格、列表或重复的HTML块。

  • 三个大括号用于什么?

    {{{ variable }}} 插入未经转义的原始 HTML。当您的替换数据已经包含 HTML 标记时,这是必需的。

  • Can I send attachments with templates?

    不能直接通过模板字段 — 但您可以通过存储包含 MIME 附件部分的email_rfc822 模板来实现。

  • 替换在RFC 5322模板中仍然有效吗?

    是的,但仅限于标头和第一个HTML +文本MIME部分内。

  • 我什么时候应该使用传输端点而不是模板?

    当发送动态附件、内嵌图片或需要SparkPost自动处理MIME时。

  • 将视图逻辑嵌入更好还是单独保持分离更好?

    最佳做法是将视图标记和数据保持分离。使用模板进行展示,并传递干净、结构化的替换数据。

  • 我可以使用编程库生成完整的MIME电子邮件吗?

    是的。像 JavaMail 这样的库允许您通过程序构建 RFC 5322 消息并通过 SparkPost 的传输 API 发送。

  • 高级模板功能是否被广泛使用?

    令人惊讶的是,很少有开发者使用它们,但它们能够解锁强大的个性化功能:循环、条件语句、内联逻辑和自定义 MIME 结构。

  • 为什么我会需要 RFC 5322 templates?

    仅在发送复杂的多部分电子邮件(附件、自定义 MIME 类型)时,SparkPost 的标准模板抽象不支持。

这篇文章是针对希望充分利用SparkPost 的电子邮件模板功能的开发人员编写的。假设您对阅读 JSON 内容和遵循基本编程流程感到舒适。当引入可能对您来说陌生的术语时,例如RFC 5322,文本将链接到其来源参考。

准备好了,我们就直接开始吧。

SparkPost 的模板传输能力使发送电子邮件变得简单。那些功能为文本HTML内容提供了抽象,这意味着大多数时候无需直接编码由RFC 5322(以前称为RFC 822)定义的原始电子邮件格式。但有时您可能希望创建更复杂的消息,这些消息具有其他多用途互联网邮件扩展(MIME)部分,这些部分并未通过 SparkPost 的 RESTful 接口直接公开。

这篇文章是针对希望充分利用SparkPost 的电子邮件模板功能的开发人员编写的。假设您对阅读 JSON 内容和遵循基本编程流程感到舒适。当引入可能对您来说陌生的术语时,例如RFC 5322,文本将链接到其来源参考。

准备好了,我们就直接开始吧。

SparkPost 的模板传输能力使发送电子邮件变得简单。那些功能为文本HTML内容提供了抽象,这意味着大多数时候无需直接编码由RFC 5322(以前称为RFC 822)定义的原始电子邮件格式。但有时您可能希望创建更复杂的消息,这些消息具有其他多用途互联网邮件扩展(MIME)部分,这些部分并未通过 SparkPost 的 RESTful 接口直接公开。

这篇文章是针对希望充分利用SparkPost 的电子邮件模板功能的开发人员编写的。假设您对阅读 JSON 内容和遵循基本编程流程感到舒适。当引入可能对您来说陌生的术语时,例如RFC 5322,文本将链接到其来源参考。

准备好了,我们就直接开始吧。

SparkPost 的模板传输能力使发送电子邮件变得简单。那些功能为文本HTML内容提供了抽象,这意味着大多数时候无需直接编码由RFC 5322(以前称为RFC 822)定义的原始电子邮件格式。但有时您可能希望创建更复杂的消息,这些消息具有其他多用途互联网邮件扩展(MIME)部分,这些部分并未通过 SparkPost 的 RESTful 接口直接公开。

发送模板

好消息是创建 RFC 5322 内容是最难的部分。从现在开始,用 SparkPost 发送该模板与发送任何其他模板完全相同。

以下是我们如何发送该模板并填充替换数据的方法:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

好消息是创建 RFC 5322 内容是最难的部分。从现在开始,用 SparkPost 发送该模板与发送任何其他模板完全相同。

以下是我们如何发送该模板并填充替换数据的方法:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

好消息是创建 RFC 5322 内容是最难的部分。从现在开始,用 SparkPost 发送该模板与发送任何其他模板完全相同。

以下是我们如何发送该模板并填充替换数据的方法:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

简化 Email Composition

首先,让我们回顾一下发送电子邮件的一个晴天情境。使用transmission端点提供 text 和 HTML 内容。在后台,SparkPost负责撰写有效的RFC 5322电子邮件。SparkPost会将substitution_data 中的替换变量插入文本和HTML内容。这是为每个收件人在通用模板中生成自定义内容的强大方式。

以下是一个包含HTML和文本内容以及substitution_data的示例 transmission

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


替换功能概述

功能

描述

基本变量替换

将单个动态值插入文本或HTML内容

条件逻辑

根据布尔值或表达式评估渲染不同内容

数组迭代

循环数组(例如,文件列表)以生成重复内容

原始HTML插入 ({{{ }}})

允许不转义HTML用于来源于数据源的标记

按收件人个性化

支持每位收件人的完全唯一内容


首先,让我们回顾一下发送电子邮件的一个晴天情境。使用transmission端点提供 text 和 HTML 内容。在后台,SparkPost负责撰写有效的RFC 5322电子邮件。SparkPost会将substitution_data 中的替换变量插入文本和HTML内容。这是为每个收件人在通用模板中生成自定义内容的强大方式。

以下是一个包含HTML和文本内容以及substitution_data的示例 transmission

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


替换功能概述

功能

描述

基本变量替换

将单个动态值插入文本或HTML内容

条件逻辑

根据布尔值或表达式评估渲染不同内容

数组迭代

循环数组(例如,文件列表)以生成重复内容

原始HTML插入 ({{{ }}})

允许不转义HTML用于来源于数据源的标记

按收件人个性化

支持每位收件人的完全唯一内容


首先,让我们回顾一下发送电子邮件的一个晴天情境。使用transmission端点提供 text 和 HTML 内容。在后台,SparkPost负责撰写有效的RFC 5322电子邮件。SparkPost会将substitution_data 中的替换变量插入文本和HTML内容。这是为每个收件人在通用模板中生成自定义内容的强大方式。

以下是一个包含HTML和文本内容以及substitution_data的示例 transmission

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


替换功能概述

功能

描述

基本变量替换

将单个动态值插入文本或HTML内容

条件逻辑

根据布尔值或表达式评估渲染不同内容

数组迭代

循环数组(例如,文件列表)以生成重复内容

原始HTML插入 ({{{ }}})

允许不转义HTML用于来源于数据源的标记

按收件人个性化

支持每位收件人的完全唯一内容


替换数据数组

许多人意识到SparkPost的传输和模板端点可以在电子邮件头和电子邮件正文中进行简单的内容替换。但许多人忽视了提供条件内容或可替换数组数据的能力。您还可以为每个收件人提供唯一的内容。在此示例中,我们为每个收件人发送一个唯一链接数组。

这可以通过提供将填充到电子邮件正文中的JSON数据数组来实现。一旦提供了数据,SparkPost将使用模板中的逻辑来填充它。

在此示例中,SparkPost将寻找名为“files_html”的替换数据,并对数组中的每个元素进行“for each”操作。它将在“files_html”元素中创建一个具有“file”值的行。注意“loop_var.file”周围的三重大括号。这是因为数组中的每个元素都包含HTML,我们需要告诉服务器按原样使用而不是逃逸它。文本部分将是一个简单的文本标签和文件的URL。

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


这是完整的工作示例:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

专家提示:在您的代码中,建议将视图标记与数据分开,但这里的目标是尽可能简单和易于理解,因此我们创建了两个数组。一个数组用于HTML部分,另一个用于文本部分。在实际使用中,通常会有一组数据,并在模板代码中编写逻辑。

许多人意识到SparkPost的传输和模板端点可以在电子邮件头和电子邮件正文中进行简单的内容替换。但许多人忽视了提供条件内容或可替换数组数据的能力。您还可以为每个收件人提供唯一的内容。在此示例中,我们为每个收件人发送一个唯一链接数组。

这可以通过提供将填充到电子邮件正文中的JSON数据数组来实现。一旦提供了数据,SparkPost将使用模板中的逻辑来填充它。

在此示例中,SparkPost将寻找名为“files_html”的替换数据,并对数组中的每个元素进行“for each”操作。它将在“files_html”元素中创建一个具有“file”值的行。注意“loop_var.file”周围的三重大括号。这是因为数组中的每个元素都包含HTML,我们需要告诉服务器按原样使用而不是逃逸它。文本部分将是一个简单的文本标签和文件的URL。

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


这是完整的工作示例:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

专家提示:在您的代码中,建议将视图标记与数据分开,但这里的目标是尽可能简单和易于理解,因此我们创建了两个数组。一个数组用于HTML部分,另一个用于文本部分。在实际使用中,通常会有一组数据,并在模板代码中编写逻辑。

许多人意识到SparkPost的传输和模板端点可以在电子邮件头和电子邮件正文中进行简单的内容替换。但许多人忽视了提供条件内容或可替换数组数据的能力。您还可以为每个收件人提供唯一的内容。在此示例中,我们为每个收件人发送一个唯一链接数组。

这可以通过提供将填充到电子邮件正文中的JSON数据数组来实现。一旦提供了数据,SparkPost将使用模板中的逻辑来填充它。

在此示例中,SparkPost将寻找名为“files_html”的替换数据,并对数组中的每个元素进行“for each”操作。它将在“files_html”元素中创建一个具有“file”值的行。注意“loop_var.file”周围的三重大括号。这是因为数组中的每个元素都包含HTML,我们需要告诉服务器按原样使用而不是逃逸它。文本部分将是一个简单的文本标签和文件的URL。

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


这是完整的工作示例:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

专家提示:在您的代码中,建议将视图标记与数据分开,但这里的目标是尽可能简单和易于理解,因此我们创建了两个数组。一个数组用于HTML部分,另一个用于文本部分。在实际使用中,通常会有一组数据,并在模板代码中编写逻辑。

Transmission Capabilities 中的 Attachments

传输端点还提供了发送附件的抽象。 在下面,您将看到附件被指定在content.attachments 数组中,其中数组中的每个对象描述一个单独的附件项。与之前一样,SparkPost 将负责编码textHTMLsubstitutions,并通过附件数组进行迭代以编码出格式正确的电子邮件消息。

最佳实践表明,除非服务明确要求,否则最好避免发送附件。

以下是附件所需的字段:

  • type:附件的 MIME 类型

  • name:附件的文件名

  • data:Base64 编码的文件数据

附件所需字段

字段

含义

type

附件的 MIME 类型

name

文件名将显示给收件人

data

Base64 编码的文件负载


这是传输内容节中附件的样子:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

您还可以在传输中发送“内联图像”。这些与附件非常相似,并在 content.inline_images 数组中指定,其中每个 inline_image 对象都类似于上面显示的附件对象。

传输端点还提供了发送附件的抽象。 在下面,您将看到附件被指定在content.attachments 数组中,其中数组中的每个对象描述一个单独的附件项。与之前一样,SparkPost 将负责编码textHTMLsubstitutions,并通过附件数组进行迭代以编码出格式正确的电子邮件消息。

最佳实践表明,除非服务明确要求,否则最好避免发送附件。

以下是附件所需的字段:

  • type:附件的 MIME 类型

  • name:附件的文件名

  • data:Base64 编码的文件数据

附件所需字段

字段

含义

type

附件的 MIME 类型

name

文件名将显示给收件人

data

Base64 编码的文件负载


这是传输内容节中附件的样子:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

您还可以在传输中发送“内联图像”。这些与附件非常相似,并在 content.inline_images 数组中指定,其中每个 inline_image 对象都类似于上面显示的附件对象。

传输端点还提供了发送附件的抽象。 在下面,您将看到附件被指定在content.attachments 数组中,其中数组中的每个对象描述一个单独的附件项。与之前一样,SparkPost 将负责编码textHTMLsubstitutions,并通过附件数组进行迭代以编码出格式正确的电子邮件消息。

最佳实践表明,除非服务明确要求,否则最好避免发送附件。

以下是附件所需的字段:

  • type:附件的 MIME 类型

  • name:附件的文件名

  • data:Base64 编码的文件数据

附件所需字段

字段

含义

type

附件的 MIME 类型

name

文件名将显示给收件人

data

Base64 编码的文件负载


这是传输内容节中附件的样子:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

您还可以在传输中发送“内联图像”。这些与附件非常相似,并在 content.inline_images 数组中指定,其中每个 inline_image 对象都类似于上面显示的附件对象。

模板中的Attachments

现在我们已经为使用传输端点发送附件做好了适当的背景准备,让我们来看看如何使用模板来实现这一点。在撰写本文时,并没有像您在内联传输中找到的那样的附件抽象。有人可能会得出结论,无法使用附件来创建模板。部分是正确的,但有一个解决方法,尽管您不再与RFC 5322格式隔离。

您可以通过自行编码RFC 5322内容实现模板中的附件,其中包括附件。好消息是您仍然可以在您的电子邮件标题HTML文本部分中使用替换数据。请注意,这种类型的模板限制了替换仅限于标题以及第一个HTML和第一个文本部分。


RFC 5322模板限制

限制

描述

替换限制

仅适用于标题、第一HTML部分和第一文本部分

手动MIME处理

开发者必须构建所有MIME边界和附件部分

维护开销较高

更难更新、审计和版本管理

不适合抽象

绕过了SparkPost的模板系统的便利性


以下是如何完成的示例。

RFC822电子邮件

使用您想要的替换数据创建您的RFC 5322电子邮件。我在我的邮件客户端中创建了这个,并发送给自己。一旦我收到它,我复制了源代码并替换我想要动态替换的字段。

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

在此消息的最后一个MIME部分中,您会看到Content-Disposition: attachment; filename=myfile.txt”。这就是定义文件名的地方。您的附件内容一定会复杂得多,但此示例尝试保持简单。

现在我们已经为使用传输端点发送附件做好了适当的背景准备,让我们来看看如何使用模板来实现这一点。在撰写本文时,并没有像您在内联传输中找到的那样的附件抽象。有人可能会得出结论,无法使用附件来创建模板。部分是正确的,但有一个解决方法,尽管您不再与RFC 5322格式隔离。

您可以通过自行编码RFC 5322内容实现模板中的附件,其中包括附件。好消息是您仍然可以在您的电子邮件标题HTML文本部分中使用替换数据。请注意,这种类型的模板限制了替换仅限于标题以及第一个HTML和第一个文本部分。


RFC 5322模板限制

限制

描述

替换限制

仅适用于标题、第一HTML部分和第一文本部分

手动MIME处理

开发者必须构建所有MIME边界和附件部分

维护开销较高

更难更新、审计和版本管理

不适合抽象

绕过了SparkPost的模板系统的便利性


以下是如何完成的示例。

RFC822电子邮件

使用您想要的替换数据创建您的RFC 5322电子邮件。我在我的邮件客户端中创建了这个,并发送给自己。一旦我收到它,我复制了源代码并替换我想要动态替换的字段。

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

在此消息的最后一个MIME部分中,您会看到Content-Disposition: attachment; filename=myfile.txt”。这就是定义文件名的地方。您的附件内容一定会复杂得多,但此示例尝试保持简单。

现在我们已经为使用传输端点发送附件做好了适当的背景准备,让我们来看看如何使用模板来实现这一点。在撰写本文时,并没有像您在内联传输中找到的那样的附件抽象。有人可能会得出结论,无法使用附件来创建模板。部分是正确的,但有一个解决方法,尽管您不再与RFC 5322格式隔离。

您可以通过自行编码RFC 5322内容实现模板中的附件,其中包括附件。好消息是您仍然可以在您的电子邮件标题HTML文本部分中使用替换数据。请注意,这种类型的模板限制了替换仅限于标题以及第一个HTML和第一个文本部分。


RFC 5322模板限制

限制

描述

替换限制

仅适用于标题、第一HTML部分和第一文本部分

手动MIME处理

开发者必须构建所有MIME边界和附件部分

维护开销较高

更难更新、审计和版本管理

不适合抽象

绕过了SparkPost的模板系统的便利性


以下是如何完成的示例。

RFC822电子邮件

使用您想要的替换数据创建您的RFC 5322电子邮件。我在我的邮件客户端中创建了这个,并发送给自己。一旦我收到它,我复制了源代码并替换我想要动态替换的字段。

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

在此消息的最后一个MIME部分中,您会看到Content-Disposition: attachment; filename=myfile.txt”。这就是定义文件名的地方。您的附件内容一定会复杂得多,但此示例尝试保持简单。

存储模板

一旦您有了有效的RFC 5322电子邮件,请使用模板端点的email_rfc822格式存储它,而不是使用textHTML字段。以下是该邮件content的示例:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

请求完成后,SparkPost将返回一个用于新模板的唯一标识符。例如xxxxxxx

一旦您有了有效的RFC 5322电子邮件,请使用模板端点的email_rfc822格式存储它,而不是使用textHTML字段。以下是该邮件content的示例:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

请求完成后,SparkPost将返回一个用于新模板的唯一标识符。例如xxxxxxx

一旦您有了有效的RFC 5322电子邮件,请使用模板端点的email_rfc822格式存储它,而不是使用textHTML字段。以下是该邮件content的示例:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

请求完成后,SparkPost将返回一个用于新模板的唯一标识符。例如xxxxxxx

结论

现在,您可以看到如何使用SparkPost发送几乎任何复杂性的电子邮件,您可能想看看“SparkPost Supports Sending Email on Apple Watch”或者查看替换语法,看看如何在您的模板或传输内容中使用“if then else”、“条件中的表达式”或“数组迭代”。

现在,您可以看到如何使用SparkPost发送几乎任何复杂性的电子邮件,您可能想看看“SparkPost Supports Sending Email on Apple Watch”或者查看替换语法,看看如何在您的模板或传输内容中使用“if then else”、“条件中的表达式”或“数组迭代”。

现在,您可以看到如何使用SparkPost发送几乎任何复杂性的电子邮件,您可能想看看“SparkPost Supports Sending Email on Apple Watch”或者查看替换语法,看看如何在您的模板或传输内容中使用“if then else”、“条件中的表达式”或“数组迭代”。

其他新闻

阅读更多来自此类别的内容

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird