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

# Email Send 端口

> 通过 SMTP 邮件服务器或 SendGrid 发送消息，支持 OAuth 2.0、基于模板的内容生成以及用于文件传递的附件模式。

export const NameDescription = ({extraRows}) => <table>
    <thead>
      <tr>
        <th>设置</th>
        <th>描述</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><strong>端口 Id</strong></td>
        <td>端口的静态、唯一标识符。</td>
      </tr>
      <tr>
        <td><strong>端口类型</strong></td>
        <td>显示端口类型及其用途的描述。</td>
      </tr>
      <tr>
        <td><strong>端口描述</strong></td>
        <td>一个可选字段，用于提供端口及其在流中的角色的自由格式描述。</td>
      </tr>
      {extraRows}
    </tbody>
  </table>;

export const CommonProxySettings = () => <>
    <p>这是一组用于识别连接所经代理并对其进行身份验证的设置。默认情况下，本节使用 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/security">安全设置</a> 页面的 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/proxy-settings">代理设置</a> 部分中的全局设置。清除此复选框可为您的端口提供特定的设置。</p>
    <table>
      <thead>
        <tr><th>设置</th><th>描述</th></tr>
      </thead>
      <tbody>
        <tr>
          <td><strong>代理类型</strong></td>
          <td>基于代理的防火墙使用的协议。</td>
        </tr>
        <tr>
          <td><strong>代理主机</strong></td>
          <td>基于代理的防火墙的名称或 IP 地址。</td>
        </tr>
        <tr>
          <td><strong>代理端口</strong></td>
          <td>基于代理的防火墙的 TCP 端口。</td>
        </tr>
        <tr>
          <td><strong>代理用户</strong></td>
          <td>用于通过基于代理的防火墙进行身份验证的用户名。</td>
        </tr>
        <tr>
          <td><strong>代理密码</strong></td>
          <td>用于对基于代理的防火墙进行身份验证的密码。</td>
        </tr>
        <tr>
          <td><strong>身份验证方案</strong></td>
          <td>保留默认值 <strong>None</strong> 或选择以下身份验证方案之一：<strong>Basic</strong>、<strong>Digest</strong>、<strong>Proprietary</strong> 或 <strong>NTLM</strong>。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const SlasTab = ({siteName = "知行之桥"}) => <>
    <p><em>与配置服务级别协议 (SLA) 相关的设置。</em></p>
    <p>
      SLA 允许配置预期流程中端口发送或接收的数据量，并设置预期达到该数据量的时间范围。当 SLA 未达到时，{siteName} 会发送电子邮件警告用户，并将 SLA 标记为 <em>存在风险</em>，这意味着如果 SLA 未能尽快达到，则会被标记为 <em>已违反</em>。这让用户有机会介入并确定 SLA 未达到的原因，并采取适当的措施。如果在风险时间段结束时仍未达到 SLA，则会将 SLA 标记为已违反，并再次通知用户。
    </p>
    <p>
      要定义 SLA，请启用 <strong>预期数据量</strong>，然后点击 <strong>设置</strong> 选项卡。
    </p>
    <img src="/public/images/sla_empty.png" alt="SLA Empty" />
    <ul>
      <li>如果端口具有单独的发送和接收操作，请使用单选按钮指定 SLA 适用的方向。</li>
      <li>在窗口的 <strong>预计至少</strong> 部分中：
        <ul>
          <li>设置预计处理的最小事务数量（交易量）</li>
          <li>使用 <strong>每个</strong> 字段指定时间范围</li>
          <li>指示 SLA 生效的时间。如果选择 <strong>开始于</strong>，请填写日期和时间字段。</li>
          <li>勾选希望 SLA 生效的星期几对应的复选框。如有必要，请使用下拉菜单选择 <strong>每天</strong>。</li>
        </ul>
      </li>
      <li>在窗口的 <strong>将状态设置为“有风险”</strong> 部分中，指定应将 SLA 标记为有风险的时间。
        <ul>
          <li>默认情况下，只有在违反 SLA 的情况下才会发送通知。要更改此设置，请勾选 <strong>发送“有风险”通知</strong>。</li>
        </ul>
      </li>
    </ul>
    <p>
      以下示例显示了为端口配置的 SLA，该端口预计在周一至周五每天接收 1000 个文件。如果尚未收到 1000 个文件，则会在时间段结束前 1 小时发送风险通知。
    </p>
    <img src="/public/images/sla_defined.png" alt="SLA Configuration Example" />
    <Note>
      如果有必要，可以关闭 SLA 通知。这在维护窗口期间非常有用。点击导航栏上的 <strong>设置</strong>，然后跳转到 <strong>通知 &gt; 通用通知</strong>。点击平板和铅笔图标进行编辑，并取消勾选 <strong>SLA 通知</strong> 设置。
    </Note>
  </>;

export const AlertsTab = ({siteNameShort = "知行之桥"}) => <>
    <p><em>与配置通知相关的设置。</em></p>
    <p>
      在执行服务级别协议 (SLA) 之前，需要设置电子邮件通知以接收通知。默认情况下，{siteNameShort} 使用 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/alerts">通知</a> 选项卡上的全局设置。要为此端口使用其他设置，请启用 <strong>覆盖全局设置</strong>。
    </p>
    <p>
      默认情况下，错误通知处于启用状态，这意味着每当出现错误时都会发送电子邮件。要关闭错误通知，请取消选中 <strong>启用</strong> 复选框。
    </p>
    <p>
      输入 <strong>主题</strong>（必填），然后（可选）输入以逗号分隔的 <strong>收件人</strong> 电子邮件列表。
    </p>
  </>;

export const Message = () => <>
    <p><em>消息设置确定端口如何搜索消息并在处理后管理它们。</em></p>
    <table>
      <thead>
        <tr><th>设置</th><th>描述</th></tr>
      </thead>
      <tbody>
        
          <tr>
            <td><strong>保存到已发送文件夹</strong></td>
            <td>选中此项可将端口处理的文件复制到该端口的“已发送”文件夹中。</td>
          </tr>
        
        <tr>
          <td><strong>已发送文件夹方案</strong></td>
          <td>端口根据选定的时间间隔对 <strong>已发送</strong> 文件夹中的文件进行分组。例如，<strong>Weekly</strong> 选项指示端口每周创建一个新的子文件夹，并将本周发送的所有文件存储在该文件夹中。空白设置告诉端口将所有文件直接保存在 <strong>已发送</strong> 文件夹中。对于处理许多事务的端口，使用子文件夹可以帮助保持文件有序并提高性能。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const MiscConnector = () => <>
    <p><em>特殊设置适用于特定用例。</em></p>
    <table>
      <thead>
        <tr>
          <th>设置</th>
          <th>描述</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><strong>其他设置</strong></td>
          <td>允许在以分号分隔的列表中配置隐藏的端口设置，例如 <code>setting1=value1;setting2=value2</code>。正常的端口用例和功能不需要使用这些设置。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const Logging = () => <>
    <p><em>用于管理日志创建和存储的设置。</em></p>
    <table>
      <thead>
        <tr>
          <th>设置</th>
          <th>描述</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><strong>日志级别</strong></td>
          <td>指定要记录在端口日志目录中的信息类型：
            <ul>
              <li><b>None</b> - 不创建任何日志。</li>
              <li><b>Error</b> - 仅当端口遇到错误时才创建日志。</li>
              <li><b>Warning</b> - 仅当端口发出警告时才创建日志。</li>
              <li><b>Info</b> - 记录工作流的一般信息，包括任何错误和警告（如果适用）。</li>
              <li><b>Debug</b> - 记录成功和失败工作流的详细调试信息。</li>
              <li><b>Trace</b> - 记录成功和失败工作流的详细跟踪信息。</li>
            </ul>
            <strong>请注意：</strong><strong>Debug</strong> 和 <strong>Trace</strong> 级别的日志可能会记录敏感信息，包括消息内容和 SSL 证书。尽管连接属性（例如密码）被屏蔽了，但在与您的组织外部共享它们之前，请查看此级别的日志以避免泄漏敏感信息。</td>
        </tr>
        <tr>
          <td><strong>日志文件夹结构</strong></td>
          <td>指示端口根据选定的时间间隔将日志文件夹中的文件分组。例如，<strong>Weekly</strong> 选项指示端口每周创建一个新的子文件夹，并将该周的所有日志存储在该文件夹中。空白设置告诉端口将所有日志直接保存在日志文件夹中。对于处理许多事务的端口，使用子文件夹有助于保持日志的有序性并提高性能。</td>
        </tr>
        <tr>
          <td><strong>保留消息副本</strong></td>
          <td>指示端口在日志目录中保存最新消息副本的切换。请注意，端口每个子文件夹只保留一个消息，并且端口在再次运行时会覆盖以前保存的消息。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const Performance = () => <>
    <p><em>与端口资源分配相关的设置。</em></p>
    <table>
      <thead>
        <tr>
          <th>设置</th>
          <th>描述</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><strong>最大工作线程数</strong></td>
          <td>此端口上处理文件时从线程池中消耗的最大工作线程数。如果设置，则会覆盖 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/advanced-settings">高级设置</a> 页面的 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/performance-settings">性能设置</a> 部分的默认设置。</td>
        </tr>
        <tr>
          <td><strong>最大文件数</strong></td>
          <td>分配给端口的每个线程发送的最大文件数。如果设置，则会覆盖 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/advanced-settings">高级设置</a> 页面的 <a href="/26.2/self-hosted/zh/getting-started/administration/settings/performance-settings">性能设置</a> 部分的默认设置。</td>
        </tr>
      </tbody>
    </table>
  </>;

export const siteNameShort = "知行之桥";

export const siteName = "知行之桥";

Email Send 端口通过 SMTP 邮件服务器发送邮件。

## 核心功能

* 基于 SMTP 的邮件投递，支持用户指定的服务器或 SendGrid，并支持现代服务商的 OAuth 2.0 认证
* 支持模板模式，可根据 XML 数据或 {siteNameShort}Script 生成动态内容
* 支持附件模式，可在发送文件的同时自定义邮件正文
* 支持多个收件人（To、CC 和 BCC）及动态字段填充

## 概览

Email Send 端口连接到 SMTP 服务器（用户指定或 SendGrid）投递服务，将文件作为传出电子邮件消息发送。端口处理的输入文件可以作为电子邮件附件直接发送，也可以从输入文件中解析数据，并通过脚本模板包含在传出消息中。有关创建脚本模板的更多信息，请参阅[模板模式](#模板模式)部分。

<Note>Outlook 和 Gmail 邮件服务器的 OAuth 2.0 配置是 Email Send 端口中最常见的两种连接配置。</Note>

## 端口配置

本节包含所有可配置的端口属性。

### 邮件配置

#### 建立连接

要允许 {siteNameShort} 发送电子邮件，必须先建立 Email Send 连接。建立后，该连接可以在多个 Email Send 端口之间共享。建立此连接有以下两种方式：

1. 在流程中添加一个 Email Send 端口。然后使用 **Connection** 下拉菜单选择现有连接，或点击 **Create** 添加新连接。
2. 打开 {siteNameShort} **系统设置** 页面，然后打开 **Connections** 选项卡。点击 **Add**，选择 **Email Send**，然后点击 **Next**。
   <Note>
     如果通过此方式创建连接，仍需在端口的 **Connection** 下拉菜单中选择该连接。
   </Note>

完成以下属性配置：

| 设置                           | 描述                                                                                                                                                                                                                                                    |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Email Protocol**           | 选择使用用户指定的 SMTP 服务器还是 SendGrid。如果选择 SendGrid，则只保留 **TLS Type**。所有其他字段均与 SMTP 相关。                                                                                                                                                                       |
| **API Key**                  | 你的 SendGrid API 密钥。不适用于 {siteNameShort} Cloud 实现。                                                                                                                                                                                                     |
| **Host**                     | SMTP 服务器的主机名或 IP 地址。                                                                                                                                                                                                                                  |
| **Port**                     | 连接到 SMTP 服务器的端口。典型值包括 143 和 993。                                                                                                                                                                                                                      |
| **Authentication Mechanism** | 用于登录服务器的身份验证类型。可用选项会根据你的选择而变化。                                                                                                                                                                                                                        |
| **Password**                 | （Basic 和 NTLM）IMAP 服务器的密码。                                                                                                                                                                                                                            |
| **Auth URL**                 | （OAuth 2.0）服务的授权 URL。点击 **Connect** 按钮登录并授予应用程序权限时，会定向到此 URL。                                                                                                                                                                                         |
| **Access Token URL**         | （OAuth 2.0）访问令牌的 URL。                                                                                                                                                                                                                                 |
| **Client Id**                | （OAuth 2.0）注册 OAuth 时分配的客户端 Id。                                                                                                                                                                                                                       |
| **Client Secret**            | （OAuth 2.0）注册 OAuth 时分配的密钥。                                                                                                                                                                                                                           |
| **Scope**                    | （OAuth 2.0）应用程序应有权访问的作用域列表。                                                                                                                                                                                                                           |
| **Callback URL**             | （OAuth 2.0）所连接服务返回令牌以提供访问权限的 URL。服务通常要求你将允许的 URL 加入白名单，因此在服务中配置应用程序注册时应使用此值。                                                                                                                                                                          |
| **None**                     | 不需要身份验证。                                                                                                                                                                                                                                              |
| **User**                     | 登录 SMTP 服务器的用户名。当 **Authentication Mechanism** 设置为 None 时不可见。                                                                                                                                                                                         |
| **TLS Type**                 | 连接到服务器时用于协商 TLS/SSL 的方法：<br />**STARTTLS**：先建立明文连接，然后可以通过显式命令启动 TLS/SSL。<br />**SSL/TLS**：无需先建立明文连接，立即进行协商。<br />**None (Plain Text)**：建立明文连接，不使用 TLS/SSL。<br />**Automatic**：根据端口号检测并应用合适的 TLS/SSL 协商方法。标准邮件端口（25、587）使用 STARTTLS，端口 465 使用 TLS/SSL。 |

建立与 SMTP 服务器的网络级连接需要以下设置：

* Host
* Port
* TLS Type

建立网络级连接后，需要以下设置才能访问服务器上存储的消息：

* User
* Password 或 OAuth 2.0 身份验证凭据
* Mailbox

SendGrid 唯一需要的设置是 TLS Type。

使用 **Add and Test** 按钮验证端口是否可以连接到服务器。

#### 其他配置

*与传出电子邮件消息相关的设置。大多数字段可以包含来自传出文件的动态数据（有关更多信息，请参阅[动态字段](#动态字段)）。*

| 设置                     | 描述                                                                                                                                                                     |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Message Type**       | 指定处理消息的方法：<br />**Attachment**：将到达端口的文件作为附件发送。有关更多信息和示例，请参阅[附件模式](#附件模式)。<br />**Template**：将消息正文解释为从输入文件读取值的 {siteNameShort}Script 模板。有关创建脚本模板的更多信息，请参阅[模板模式](#模板模式)。 |
| **To**                 | 传出电子邮件消息收件人的电子邮件地址。使用逗号分隔的列表发送给多个收件人。                                                                                                                                  |
| **Show From**          | 展开一个字段，用于输入传出电子邮件消息发件人的电子邮件地址。端口会尝试根据传递给 SMTP 服务器的 **User** 凭据自动确定此字段的值。                                                                                               |
| **Show Cc / Show Bcc** | 展开字段，用于输入要抄送（CC）或密件抄送（BCC）的电子邮件地址。使用逗号分隔的列表发送给多个收件人。                                                                                                                   |
| **Subject**            | 传出电子邮件消息的主题行。                                                                                                                                                          |
| **Message Body**       | 电子邮件正文。                                                                                                                                                                |

### 设置

#### 邮件发送配置

*与端口名称和描述相关的设置。*

<NameDescription />

### 高级页面

#### 高级设置

*与处理相关的额外设置。*

| 设置                                                 | 描述                                                                                                                                                                |
| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Allow {siteNameShort}Script in Attachment mode** | 当 **Message Type** 为 Attachment 时，勾选此项以允许在消息正文中计算 {siteNameShort}Script。                                                                                          |
| **Attachment Filter**                              | 在发送消息之前应用的 glob 模式过滤器。模式可以是正向或负向的。例如，`*.edi` 仅发送扩展名为 `.edi` 的文件，`-*.tmp` 排除扩展名为 `.tmp` 的文件。可以提供逗号分隔的过滤器列表。除非使用精确匹配，否则后面的过滤器优先级更高。                                 |
| **Outgoing Server Public Certificate**             | 用于验证 TLS/SSL 服务器身份的公钥证书。如果目标服务器使用 TLS/SSL，请将此字段设置为标识服务器的证书。如果服务器证书不可用，可以将此设置留空以允许底层 OS/JVM 执行证书验证，或将其设置为 `Any Certificate` 以隐式信任服务器身份。                            |
| **Extension Map**                                  | 逗号分隔的名称-值对列表，用于确定附件的 Content-Type 消息头值。例如，*.txt=text/plain、.dat=application/edi-x12、.edi=application/edifact*<br />**注意**：在输入消息中包含 Content-Type 消息头会覆盖此设置确定的内容类型。 |
| **处理延迟**                                           | 放置在 **交易** 选项卡中的文件在处理前延迟的时间（以秒为单位）。这是旧版设置。最佳做法是[使用 File 端口](../flows/designing-a-flow#interacting-with-the-local-file-system)来管理本地文件系统，而不是使用此设置。                  |

#### 代理配置

<CommonProxySettings />

#### 消息

<Message />

#### 日志

<Logging />

#### 其他设置

<MiscConnector />

### 自动化

#### 自动化设置

| 设置                 | 描述                                                                               |
| ------------------ | -------------------------------------------------------------------------------- |
| **发送**             | 指示端口在文件准备就绪时自动发送文件的开关。                                                           |
| **Retry Interval** | 端口在重试失败发送之前等待的间隔。                                                                |
| **Max Attempts**   | 端口尝试发送消息的次数。将此值设置为 *1* 会指示端口仅进行初始发送尝试而不重试。每次尝试之间，端口会等待 **Retry Interval** 指定的时长。 |

#### 性能

<Performance />

### 警报

<AlertsTab />

### SLA

<SlasTab />

### 交易

此选项卡列出与该端口关联的所有消息。使用搜索栏查找特定消息，或点击漏斗图标应用过滤器。可以按跟踪消息头、时间和/或状态进行过滤。

## 发送邮件

[邮件配置](#邮件配置)选项卡决定要发送的电子邮件消息：

* 如果 **Message Type** 设置为 **Attachment**，端口处理的文件将作为电子邮件附件发送，并且应在消息文本编辑器中指定消息正文。有关更多信息，请参阅[附件模式](#附件模式)。
* 如果 **Message Type** 设置为 **Template**，消息文本编辑器将被视为 {siteNameShort}Script 模板。在脚本模板中，可以从端口处理的文件中解析值，并将其包含在电子邮件正文中。有关更多信息，请参阅[模板模式](#模板模式)。

要在一封电子邮件中发送多个附件，需要构建一个包含所有要包含附件的[批处理组](../getting-started/architecture#batch-groups)，然后将该批处理组发送到 Email Send 端口进行处理。

### 动态字段

**To**、**From**、**CC**、**BCC** 和 **Subject** 字段支持来自传出文件的动态信息（例如文件名和已处理该文件的端口）。

文件信息可通过 [*\_message*](../scripting/introduction-to-arcscript#message-_message) 项获得。*\_message* 项具有一组带有 `header:` 前缀的属性，对应于传出文件中可用的每个消息头。这些消息头包括文件名、与在 {siteNameShort} 流程中处理文件相关的任何元数据，以及通过脚本提升到文件的任何自定义消息头。

与任何其他 {siteNameShort}Script 项一样，*\_message* 项和消息头属性在方括号中引用：

`[_message.header:headerName]`

例如，可以将 Subject 设置为以下值，以包含传出文件的文件名：

`[_message.header:filename]`

### 模板模式

将 **Message Type** 设置为 Template 会指示端口将消息正文解释为 {siteNameShort}Script 模板。模板使用简单的语法与输入文件交互，并检索要在电子邮件正文中使用的值。这些值可以与静态文本组合，生成根据端口处理的文件动态填充的标准正文格式。

要使用 Template 模式，端口必须接收 XML 文件作为输入。模板只能解析 XML 文件中的信息。

#### 基本模板

有关模板消息的示例，请考虑以下输入 XML 文档：

```xml theme={null}
<Lead>
  <Company>ABC, Inc.</Company>
  <Email>john@abcinc.com</Email>
  <FirstName>John</FirstName>
  <Description>Blue Widget</Description>
</Lead>
```

此文件在 `Lead` 标签内包含一组属性：`Company`、`Email`、`FirstName`、`Description`。将 `Email` 字段传入消息的 {siteNameShort}Script 表达式如下所示：

`[document.lead_email]`

此表达式包含三个组件：

* *document* 项，指向当前打开的文件。
* *lead\_email* 属性，指向 `john@abcinc.com`。
* 方括号（`[]`），表示使用格式化器而不是文字字符。

上述 XML 输入文件的电子邮件正文模板可能如下所示：

```
Hi [document.lead_firstname],
<br>
We saw that you might be interested in the following product:
<br>
[document.lead_description]
<br>
Would you like to set up a demo to learn more about how we can help you with your work at [document.lead_company]?
```

此消息将生成以下电子邮件：

```
Hi John,

We saw that you might be interested in the following product:

Blue Widget

Would you like to set up a demo to learn more about how we can help you with your work at ABC, Inc.?
```

有关 {siteNameShort}Script 的更多信息，请参阅[脚本](../scripting/scripting)部分。

#### XPath 格式化

XPath 格式化器（在表达式中写为 `xpath`）提供了从文件中检索动态值的替代方法。对于已经在 {siteNameShort} 其他位置使用 {siteNameShort}Script 的用户来说，这种方法可能更熟悉。XPath 要求输入文件是 XML 文件。

使用与上面相同的输入文件示例：

```xml theme={null}
<Lead>
  <Company>ABC, Inc.</Company>
  <Email>john@abcinc.com</Email>
  <FirstName>John</FirstName>
  <Description>Blue Widget</Description>
</Lead>
```

返回电子邮件地址的 XPath 表达式如下：

`[xpath(/Lead/Email)]`

此表达式包含三个组件：

* *xpath* 后跟括号，表示该表达式为 XPath 表达式。
* 数据路径，每个级别用斜杠分隔。
* 方括号（`[]`），表示使用格式化器而不是文字字符。

##### 在模板模式下使用 XPath 格式化器

考虑以下 XML：

```xml theme={null}
<Items>
    <projectName>myProject</projectName>
    <assignee>Bob Ross</assignee>
    <dueDate>02/27/2024</dueDate>
    <resources>
        <description>http://mydomain.com/desc</description>
        <images>http://mydomain.com/images</images>
        <colors>http://mydomain.com/colors</colors>
    </resources>
</Items>
```

对上面的 XML 输入文件使用 xpath 表达式的电子邮件正文模板可能如下所示：

```xml theme={null}
Hi [xpath(/Items/assignee)],
<br>
You have a new project to start working on. The name of the project is [xpath(/Items/projectName)].
<br>
All the resources you need can be found at the following links:
<br>
<ul>
  <li>Description: [xpath(/Items/resources/description)]</li>
  <li>Images: [xpath(/Items/resources/images)]</li>
  <li>Colors: [xpath(/Items/resources/colors)]</li>
</ul>
<br>
The due date for this project is [xpath(/Items/dueDate)].
```

此消息将生成以下电子邮件：

```
Hi Bob Ross,

You have a new project to start working on. The name of the project is myProject.

All the resources you need can be found at the following links:

  - Description: http://mydomain.com/desc
  - Images: http://mydomain.com/images
  - Colors: http://mydomain.com/colors

The due date for this project is 02/27/2024.
```

#### 代码视图编辑器

代码视图编辑器支持创建自定义 {siteNameShort}Script，以对来自 XML 文件的信息进行高级处理。要打开代码视图编辑器，请点击消息编辑器中的 **Code View** 按钮。

<img src="https://mintcdn.com/qiao/U-KEZ9JbQY4Wqs1D/public/images/code_view_editor.png?fit=max&auto=format&n=U-KEZ9JbQY4Wqs1D&q=85&s=bc2067eb53f76b5756c48fcede3d3837" width="600" data-path="public/images/code_view_editor.png" />

在此模式下，{siteNameShort}Script 表达式可用于一次处理多个数据条目。以下输入文件示例包含名称列表：

```xml theme={null}
<record>
  <to>Dave</to>
  <items>
    <item>
      <first_name>James</first_name>
      <last_name>Satchel</last_name>
    </item>
    <item>
      <first_name>John</first_name>
      <last_name>Smith</last_name>
    </item>
    <item>
      <first_name>Gina</first_name>
      <last_name>Newberry</last_name>
    </item>
  </items>
</record>
```

在代码视图编辑器中编写的以下消息使用 {siteNameShort}Script 合并了来自该输入文件的数据：

```xml theme={null}
Hi [document.record_to],
<br>
Here are the people you were asking about:
<br>
<arc:set attr="xml.xpath" value="/record/items/item" />
<arc:call op="xmlDOMSearch" in="xml">
  <arc:set attr="first.names" value="[xpath(first_name)]" />
  <arc:set attr="last.names" value="[xpath(last_name)]" />
  <arc:enum attr="first.names">
    [_value]
  </arc:enum>
  <arc:enum attr="last.names">
    [_value]
  </arc:enum>
  <br>
</arc:call>
```

此代码会循环输入 XML 文件中的所有名字和姓氏值，并将它们打印在消息正文中。使用上面的输入文件运行时，最终电子邮件如下所示：

```
Hi Dave,

Here are the people you were asking about:

James Satchel
John Smith
Gina Newberry
```

有关 {siteNameShort}Script 和自定义表达式的更多信息，请参阅[脚本](../scripting/scripting)部分。

### 附件模式

如果将 **Message Type** 设置为 Attachment，请在编辑器中输入电子邮件正文。如有必要，可以引用输入消息上的消息头来丰富电子邮件正文。然后，Email Send 端口会计算这些消息头，并将输入文件附加到传出电子邮件。

<Note>这依赖于流程中的前一步将必要的值作为消息头提升到消息上。根据文件内容，可以使用各种[操作](../scripting/operations/operations)和端口设置来执行此操作。</Note>

考虑以下 XML：

```xml theme={null}
<Items>
    <projectName>myProject</projectName>
    <assignee>Bob Ross</assignee>
    <dueDate>02/27/2024</dueDate>
    <resources>
        <description>http://mydomain.com/desc</description>
        <images>http://mydomain.com/images</images>
        <colors>http://mydomain.com/colors</colors>
    </resources>
</Items>
```

电子邮件正文可能如下所示：

```xml theme={null}
Hi [_message.header:assignee],
<br>
You have a new project to start working on. The name of the project is [_message.header:projectname].
<br>
All the resources you need can be found at the following links:
<br>
<ul>
  <li>Description: [_message.header:description]</li>
  <li>Images: [_message.header:images]</li>
  <li>Colors: [_message.header:colors]</li>
</ul>
<br>
The due date for this project is [_message.header:duedate].
```

此消息将生成以下电子邮件，并包含输入文件作为附件：

```
Hi Bob Ross,

You have a new project to start working on. The name of the project is myProject.

All the resources you need can be found at the following links:

  - Description: http://mydomain.com/desc
  - Images: http://mydomain.com/images
  - Colors: http://mydomain.com/colors

The due date for this project is 02/27/2024.
```
