> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 发送验证、魔术链接、OTP 和双重选择加入消息

> 使用 OneSignal 的邮件和短信验证消息示例，包括一次性密码、魔术链接和带有模板和 API 示例的双重选择加入流程。

无论您需要账户身份验证、注册新用户/密码，还是确认交易，您有时只需要向某人发送一次性密码、魔术链接或注册 URL。邮件验证是一个很好的例子，也是防止虚假或不活跃邮件地址的一种方法。遵循本指南将有助于确保您的用户能够实际接收您发送的邮件，同时也提高您的发送者声誉和送达性。

## 要求

* 一个用于生成和发送 OTP 或确认代码的服务器。

## 通过 API 发送 `custom_data`

我们的[创建消息 API](/reference/create-message)具有 `custom_data` 属性，您可以使用它将数据从您的服务器传递到消息中。

根据您如何生成确认代码、魔术链接或自定义 URL，一旦您做到了，就可以在向用户发送消息时将其传递到 `custom_data` 对象中。例如：

<CodeGroup>
  ```Text JSON theme={null}
  "custom_data": {
      "user": {
          "first_name": "George"
      },
      "verify": {
          "URL" : "https://yourdomain.com/users/confirm?confirmation_token=OS4EVA",
          "otp" : "OS4EVA"
      }
  }
  ```
</CodeGroup>

## 验证邮件模板

此邮件模板示例将演示如何显示用户名称、一次性密码和带有链接的按钮来确认他们的邮件地址。

<Frame caption="验证邮件示例">
  <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/e653d20-Screenshot_2023-08-28_at_3.07.09_PM.png?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=8633ab043badb9bf58acb90ef326052c" alt="" width="649" height="729" data-path="images/docs/e653d20-Screenshot_2023-08-28_at_3.07.09_PM.png" />
</Frame>

### 邮件模板设置

导航到**消息 > 模板 > 新建邮件模板**并使用**拖放编辑器**。

创建 1 行并拖入以下块：

* **标题**块
* **段落**块
* **按钮**块

<Frame caption="拖放编辑器示例">
  <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/eaf02d3-Screenshot_2023-08-28_at_2.46.21_PM.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=bebf50444f6d7733961279be58712871" alt="" width="859" height="209" data-path="images/docs/eaf02d3-Screenshot_2023-08-28_at_2.46.21_PM.png" />
</Frame>

### 在邮件中显示用户姓名

这是可选的，但您可以通过添加用户姓名来使消息更个性化。如果您可能没有姓名，可以省略它或设置默认值。

在我们的模板**标题**块中，根据需要设置您的副本。示例：

```
Hey {{ message.custom_data.user.first_name | default: "there" }},
```

### 在邮件中显示一次性密码

此示例显示了发送一次性密码和带有确认 URL 按钮的选项。根据您想要的设置方式，在**段落**块中根据需要设置您的副本。示例：

```
要加入松鼠团队，请使用一次性密码验证您的电子邮件：
{{message.custom_data.verify.otp}}

或使用下面的链接！
```

如果您想让密码更大或与文本区别开来，您可以使用多个**段落**或**文本**块。在此示例中，我们将其设为粗体：

<Frame caption="在邮件内容中加粗显示的 OTP">
  <img src="https://mintcdn.com/onesignal/Xl2NHJvxakrK4JbL/images/docs/f534afb-Screenshot_2023-08-28_at_3.05.35_PM.png?fit=max&auto=format&n=Xl2NHJvxakrK4JbL&q=85&s=9ebc5e94bdc7afad54e0a39ffd994f0f" alt="" width="566" height="199" data-path="images/docs/f534afb-Screenshot_2023-08-28_at_3.05.35_PM.png" />
</Frame>

### 在邮件中添加自定义 URL

设置验证 URL 有几种方法。在此示例中，我们将包含确认代码的完整 URL 传递给 `custom_data`。

在**按钮**块 > 内容属性 > 操作 > Url 中，设置：

* `{{message.custom_data.verify.URL}}`

<Frame caption="按钮块中的自定义 URL 设置">
  <img src="https://mintcdn.com/onesignal/6v_cVPknFpo5qSVB/images/docs/075aacf-Screenshot_2023-08-28_at_3.06.14_PM.png?fit=max&auto=format&n=6v_cVPknFpo5qSVB&q=85&s=34a80930c78a39d662dcf787677e565f" alt="" width="1185" height="624" data-path="images/docs/075aacf-Screenshot_2023-08-28_at_3.06.14_PM.png" />
</Frame>

## 更新邮件模板并发送消息

有关自定义模板的更多详细信息，请参阅[使用拖放设计邮件](./design-emails-with-drag-and-drop)。

示例 API 请求 JSON：

<CodeGroup>
  ```Text JSON theme={null}
  {
      "include_email_tokens": [
          "Email Address"
      ],
      "app_id": "YOUR_APP_ID",
      "template_id": "YOUR_TEMPLATE_ID",
      "custom_data": {
          "user": {
              "first_name": "George"
          },
          "verify": {
              "URL" : "https://yourdomain.com/users/confirm?confirmation_token=OS4EVA",
              "otp" : "OS4EVA"
          }
      }
  }
  ```
</CodeGroup>

<Check>
  准备就绪后，您可以在[创建通知](/reference/create-message) API 请求中使用 `template_id` 和 `custom_data` 属性。
</Check>

## 验证短信模板

此短信模板示例将演示如何显示一次性验证码。

### 短信模板设置

短信应该只发送有限的数据以减少费用。

导航到**消息 > 模板 > 新建短信模板**。

为模板命名一个容易记住的名称，如 `OTP Template`。

### 在短信模板中显示 OTP

在模板**消息**字段中，添加以下内容：

* `{{message.custom_data.verify.otp}} is your OneSignal verification code.`

我们建议将 "OneSignal" 更改为您的应用名称。

### 更新短信模板并发送消息

创建模板后，您可以生成一次性密码并使用以下示例 API 请求 JSON 将其传递给 OneSignal：

<CodeGroup>
  ```Text JSON theme={null}
  {
      "include_phone_numbers": ["+19999999999"],
      "app_id": "YOUR_APP_ID",
      "template_id": "YOUR_TEMPLATE_ID",
      "custom_data": {
          "verify": {
              "otp" : "OS4EVA"
          }
      }
  }
  ```
</CodeGroup>

<Check>
  准备就绪后，您可以在[创建通知](/reference/create-message) API 请求中使用 `template_id` 和 `custom_data` 属性。
</Check>

## 设置邮件双重选择加入

双重选择加入是一个要求用户确认其邮件订阅的过程，以提高邮件列表质量并遵守法规。

### 1. 将邮件地址添加到 OneSignal

将邮件地址添加到 OneSignal 时，它们默认情况下会自动订阅。但是，对于双重选择加入，在用户点击通过邮件发送的验证链接之前，请先不要[通过我们的创建用户 API 添加用户](/reference/create-user)。

### 2. 发送验证邮件

OneSignal 允许您使用我们的[创建通知 API](/reference/create-message)向收件人发送验证邮件。如果应用中尚不存在该地址，端点将发送邮件并将地址作为邮件订阅添加到 OneSignal。

#### API 端点：发送验证邮件

* 使用[创建通知端点](/reference/create-message)创建并发送[验证邮件](./example-verification-magic-link-otp)给收件人。

### 3. 处理验证响应

根据收件人对验证链接的响应，请遵循以下步骤：

**对于非订阅者**

1. 通过我们的[创建通知 API](/reference/create-message)以自定义数据通知针对邮件收件人。
2. 如果用户点击验证链接，使用 API 的“[创建用户](/reference/create-user)”端点将其添加为订阅。

**对于现有订阅者**

1. 单独向现有订阅者发送验证邮件。
2. 在预定义的时间内监控收件人对验证链接的响应。

**如果他们没有响应**

* [更新订阅](/reference/update-subscription)以取消订阅或通过 API [完全删除](/reference/delete-subscription)。

**如果他们点击了验证链接**

* 不做任何操作 - 他们已经订阅了 OneSignal。

### 总结，使用 OneSignal 设置双重选择加入涉及以下步骤：

#### 对于目前不在您受众中的邮件地址

1. 通过 API 向收件人发送验证邮件。
2. 如果收件人点击验证链接，使用“创建用户” API 端点创建订阅。

#### 对于已在 OneSignal 中的邮件地址

1. 通过 API 向现有订阅者发送验证邮件。
2. 监控他们对验证链接的响应。
3. 如果他们在指定时间内没有响应，请更新其订阅以取消订阅或删除它。
4. 如果他们点击了验证链接，则不采取任何行动，因为他们已经订阅了。

通过遵循这些步骤，您可以在邮件订阅过程中有效实现双重选择加入功能，同时确保遵守法规并维护高质量的邮件列表。

***
