你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:如何使用 Azure 通信服务发送电子邮件

注意

请完成此简短调查,与我们分享有关 Azure 通信服务的想法和反馈。

本快速入门介绍如何使用电子邮件 SDK 发送电子邮件。

首先使用通信服务 Try Email 发送电子邮件,以此开始使用 Azure 通信服务。

先决条件

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

使用 Try Email 发送电子邮件

借助 Try Email,可开始使用 Azure 通信服务向所需收件人发送电子邮件,并验证应用程序的电子邮件发送的配置。 借助该工具还可使用以首选语言显示的所选代码片段快速开始开发电子邮件通知。

若要向收件人发送邮件及指定邮件主题和正文,

  1. 在预配的 Azure 通信服务资源的概述页的左侧导航面板中单击“电子邮件”下的“试用电子邮件”。

    屏幕截图显示左侧 Try Email 导航面板。

  2. 可从下拉列表中选择一个已验证的域。

    屏幕截图显示从下拉列表中显示验证的域。

  3. 撰写要发送的电子邮件

    • 输入收件人电子邮件地址
    • 输入主题
    • 编写电子邮件正文

    显示如何筛选并选择要连接的已验证电子邮件域之一的屏幕截图。

  4. 单击“发送”

    显示已验证的电子邮件域之一现已连接的屏幕截图。

  5. 电子邮件发送成功。

    屏幕截图显示电子邮件成功发送。

  6. 现在还可以复制用于发送电子邮件的示例代码片段,在示例项目中用来发送通知。

    • 使用所需语言

    • 单击“插入我的连接”

    • 单击 “复制”

      屏幕截图显示用于发送电子邮件的代码段。

  7. 电子邮件代码片段现已可在通知项目中使用。

要开始使用 Azure 通信服务,请首先使用 Azure CLI 通信扩展来发送电子邮件。

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

先决条件

先决条件检查

  • 在终端或命令窗口中,运行 az --version 命令来检查是否已安装 Azure CLI 和通信扩展。
  • 若要查看经过电子邮件通信服务资源验证的域,请登录到 Azure 门户。 找到电子邮件通信服务资源,并从左侧导航窗格中打开“预配域”选项卡。

设置

添加扩展

使用 az extension 命令为 Azure CLI 添加 Azure 通信服务扩展。

az extension add --name communication

登录 Azure CLI

你需要登录到 Azure CLI。 可以从终端运行 az login 命令并提供凭据进行登录。

将连接字符串存储在环境变量中

可通过配置 AZURE_COMMUNICATION_CONNECTION_STRING 环境变量以使用 Azure CLI 密钥操作,而无需使用 --connection_string 来传入连接字符串。 若要配置环境变量,请打开控制台窗口,然后从以下选项卡中选择操作系统。 将 <connectionString> 替换为实际的连接字符串。

注意

不要将连接字符串存储为生产环境的未加密环境变量。 这仅用于测试目的。 对于生产环境,你应该生成新的连接字符串。 建议加密连接字符串并定期更改它们。

setx AZURE_COMMUNICATION_CONNECTION_STRING "<yourConnectionString>"

添加环境变量后,可能需要重启任何正在运行的、需要读取环境变量的程序(包括控制台窗口)。 例如,如果使用 Visual Studio 作为编辑器,请在运行示例之前重启 Visual Studio。

发送电子邮件

az communication email send
	--connection-string "yourConnectionString"
	--sender "<donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net>"
	--to "<emailalias@emaildomain.com>"
	--subject "Welcome to Azure Communication Services Email" --text "This email message is sent from Azure Communication Services Email using Azure CLI." 

在代码中进行下述替换:

  • <yourConnectionString> 替换为你的连接字符串。
  • <emailalias@emaildomain.com> 替换为要向其发送邮件的电子邮件地址。
  • <donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net> 替换为经验证的域的 MailFrom 地址。

上述命令还会对 messageId 执行轮询,并返回电子邮件送达状态。 状态可以是下列其中一项:

状态名称 说明
NotStarted 目前,我们不会从我们的服务发送此状态。
正在运行 电子邮件发送操作当前正在进行且正在处理中。
已成功 如果电子邮件发送操作已完成且未出错,并且电子邮件正在传送中。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件
已失败 电子邮件发送操作未成功,并遇到错误。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。

可选参数

Azure CLI 中提供了以下可选参数。

  • 对于 html 电子邮件正文,可以使用 --html 而非 --text

  • --importance 设置电子邮件的重要性类型。 已知值为:high、normal 和 low。 默认值为 normal。

  • --to 设置电子邮件收件人的列表。

  • --cc 设置抄送电子邮件地址。

  • --bcc 设置密送电子邮件地址。

  • --reply-to 设置回复电子邮件地址。

  • --disable-tracking 指示是否应为此请求禁用用户参与跟踪。

  • --attachments 设置电子邮件附件的列表。

  • --attachment-types 按与附件相同的顺序设置电子邮件附件类型的列表。

另外,你还可以通过 --cc--bcc 使用收件人列表,类似于 --to--to--cc--bcc 中至少需要有一名收件人。

通过使用通信服务 C# 电子邮件客户端库来发送电子邮件,开启 Azure 通信服务使用旅程。

提示

通过直接跳到 GitHub 上的基本电子邮件发送高级电子邮件发送示例代码,率先启动使用 Azure 通信服务发送电子邮件的体验。

了解电子邮件对象模型

以下类和接口处理适用于 C# 的 Azure 通信服务电子邮件客户端库的某些主要功能。

名称 说明
EmailAddress 此类包含一个电子邮件地址和一个显示名称选项。
EmailAttachment 此类通过接受唯一 ID、电子邮件附件 MIME 类型字符串、内容的二进制数据以及用于将其定义为内联附件的可选内容 ID 来创建电子邮件附件。
EmailClient 所有电子邮件功能需要此类。 使用连接字符串将其实例化,然后使用它来发送电子邮件。
EmailClientOptions 可将此类添加到EmailClient 实例化以面向特定的 API 版本。
EmailContent 此类包含电子邮件的主题和正文。 必须至少指定纯文本或 Html 内容之一
EmailCustomHeader 使用此类可为自定义标头添加名称和值对。 还可以使用标头名称“x-priority”或“x-msmail-priority”通过这些标头指定电子邮件重要性
EmailMessage 此类合并发件人、内容和收件人。 还可以选择添加自定义标头、附件和回复电子邮件地址。
EmailRecipients 此类包含电子邮件收件人的 EmailAddress 对象列表,包括抄送和密件抄送收件人的可选列表。
EmailSendOperation 此类表示异步电子邮件发送操作,并从电子邮件发送 API 调用返回。
EmailSendResult 此类保存电子邮件发送操作的结果。 它具有操作 ID、操作状态和错误对象(如果适用)。

EmailSendResult 返回执行的电子邮件操作的以下状态。

状态 说明
NotStarted 目前,我们不会从我们的服务发送此状态。
正在运行 电子邮件发送操作当前正在进行且正在处理中。
已成功 如果电子邮件发送操作已完成且未出错,并且电子邮件正在传送中。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件
已失败 电子邮件发送操作未成功,并遇到错误。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。

先决条件

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

注意

我们还可以从我们自己的已验证域发送电子邮件。 将自定义的已验证域添加到电子邮件通信服务

先决条件检查

  • 在终端或命令窗口中,运行 dotnet 命令来查看是否安装了 .NET 客户端。
  • 若要查看与电子邮件通信服务资源关联的子域,请登录到 Azure 门户,找到你的电子邮件通信服务资源,然后从左侧导航窗格中打开“预配域”选项卡。

新建 C# 应用程序

在控制台窗口(例如 cmd、PowerShell 或 Bash)中,使用 dotnet new 命令创建名为 EmailQuickstart 的新控制台应用。 此命令将创建包含单个源文件的简单“Hello World”C# 项目:Program.cs

dotnet new console -o EmailQuickstart

将目录更改为新创建的应用文件夹,并使用 dotnet build 命令编译应用程序。

cd EmailQuickstart
dotnet build

安装包

仍在应用程序目录中时,使用 dotnet add package 命令安装适用于 .NET 包的 Azure 通信服务电子邮件客户端库。

dotnet add package Azure.Communication.Email

创建具有身份验证的电子邮件客户端

打开 Program.cs,将现有代码替换为以下内容,以添加 using 指令,用于包含 Azure.Communication.Email 命名空间和程序的执行起点。

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

using Azure;
using Azure.Communication.Email;

namespace SendEmail
{
  internal class Program
  {
    static async Task Main(string[] args)
    {

    }
  }
}

可使用几个不同的选项对电子邮件客户端进行身份验证:

在文本编辑器中打开 Program.cs,并将 Main 方法的主体替换为使用连接字符串初始化 EmailClient 的代码。 以下代码从名为 COMMUNICATION_SERVICES_CONNECTION_STRING 的环境变量中检索资源的连接字符串。 了解如何管理资源的连接字符串

// This code demonstrates how to fetch your connection string
// from an environment variable.
string connectionString = Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");
EmailClient emailClient = new EmailClient(connectionString);

注意

建议使用手动轮询(使用异步状态轮询发送电子邮件)发送电子邮件。

基本电子邮件发送

构造电子邮件

若要发送电子邮件,需要:

  • 定义电子邮件主题和正文。
  • 定义发件人地址。 使用发件人信息构造电子邮件,可以从已验证的域获取 MailFrom 地址。
  • 定义收件人地址。
  • 调用 SendAsync 方法。 将此代码添加到 Program.cs 中的 Main 方法末尾:

替换为你的域详细信息,并根据需要修改内容、收件人详细信息


//Replace with your domain and modify the content, recipient details as required

var subject = "Welcome to Azure Communication Service Email APIs.";
var htmlContent = "<html><body><h1>Quick send email test</h1><br/><h4>This email message is sent from Azure Communication Service Email.</h4><p>This mail was sent using .NET SDK!!</p></body></html>";
var sender = "donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net";
var recipient = "emailalias@contoso.com";

发送并获取电子邮件发送状态

使用 Azure.WaitUntil.Started 调用 SendAsync 时,方法在启动操作后返回。 方法返回 EmailSendOperation 对象。 可以调用 UpdateStatusAsync 方法来刷新电子邮件操作状态。

返回的 EmailSendOperation 对象包含 EmailSendStatus 对象,该对象包含:

  • 电子邮件发送操作的当前状态。
  • 一个错误对象,如果当前状态处于失败状态,其中包含失败详细信息。

/// Send the email message with WaitUntil.Started
EmailSendOperation emailSendOperation = await emailClient.SendAsync(
    Azure.WaitUntil.Started,
    sender,
    recipient,
    subject,
    htmlContent);

/// Call UpdateStatus on the email send operation to poll for the status
/// manually.
try
{
    while (true)
    {
        await emailSendOperation.UpdateStatusAsync();
        if (emailSendOperation.HasCompleted)
        {
            break;
        }
        await Task.Delay(100);
    }

    if (emailSendOperation.HasValue)
    {
        Console.WriteLine($"Email queued for delivery. Status = {emailSendOperation.Value.Status}");
    }
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Email send failed with Code = {ex.ErrorCode} and Message = {ex.Message}");
}

/// Get the OperationId so that it can be used for tracking the message for troubleshooting
string operationId = emailSendOperation.Id;
Console.WriteLine($"Email operation id = {operationId}");

从应用程序目录使用 dotnet run 命令运行应用程序。

dotnet run

代码示例

可以从 GitHub 下载示例应用

通过使用通信服务 JS 电子邮件客户端库来发送电子邮件,开启 Azure 通信服务使用旅程。

提示

通过直接跳到 GitHub 上的基本电子邮件发送高级电子邮件发送示例代码,率先启动使用 Azure 通信服务发送电子邮件的体验。

了解电子邮件对象模型

以下类和接口处理适用于 JavaScript 的 Azure 通信服务电子邮件客户端库的某些主要功能。

名称 说明
EmailAddress 此类包含一个电子邮件地址和一个显示名称选项。
EmailAttachment 此类通过接受唯一 ID、电子邮件附件 MIME 类型字符串、内容的二进制数据以及用于将其定义为内联附件的可选内容 ID 来创建电子邮件附件。
EmailClient 所有电子邮件功能需要此类。 使用连接字符串将其实例化,然后使用它来发送电子邮件。
EmailClientOptions 可将此类添加到EmailClient 实例化以面向特定的 API 版本。
EmailContent 此类包含电子邮件的主题和正文。 必须至少指定纯文本或 Html 内容之一。
EmailCustomHeader 使用此类可为自定义标头添加名称和值对。 还可以使用标头名称“x-priority”或“x-msmail-priority”通过这些标头指定电子邮件重要性。
EmailMessage 此类合并发件人、内容和收件人。 还可以选择添加自定义标头、附件和回复电子邮件地址。
EmailRecipients 此类包含电子邮件收件人的 EmailAddress 对象列表,包括抄送和密件抄送收件人的可选列表。
EmailSendResult 此类保存电子邮件发送操作的结果。 它具有操作 ID、操作状态和错误对象(如果适用)。
EmailSendStatus 此类表示电子邮件发送操作的状态集。

EmailSendResult 返回执行的电子邮件操作的以下状态。

状态名称 说明
isStarted 电子邮件发送操作当前正在进行且正在处理中,则返回 true。
isCompleted 如果电子邮件发送操作已完成且未出错,并且电子邮件正在传送中,则返回 true。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件
result 如果电子邮件发送操作已结束,则为存在的属性。
error 电子邮件发送操作未成功,并遇到错误,则为存在的属性。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。

先决条件

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

注意

我们还可以从我们自己的已验证域发送电子邮件。 将自定义的已验证域添加到电子邮件通信服务

先决条件检查

  • 在终端或命令窗口中,运行 node --version 以查看是否安装了 Node.js。
  • 若要查看使用电子邮件通信服务资源验证的子域,请登录到 Azure 门户,找到你的电子邮件通信服务资源,然后从左侧导航窗格中打开“预配域”选项卡。

设置应用程序环境

创建新的 Node.js 应用程序

首先,打开终端或命令窗口,为应用创建一个新目录,并导航到该目录。

mkdir email-quickstart && cd email-quickstart

运行 npm init -y 以使用默认设置创建 package.json 文件。

npm init -y

使用文本编辑器在项目根目录中创建名为“send-email.js”的文件。 将 package.json 中的“main”属性更改为“send-email.js”。 以下部分演示如何将本快速入门的源代码添加到新创建的文件。

安装包

使用 npm install 命令安装适用于 JavaScript 的 Azure 通信服务电子邮件客户端库。

npm install @azure/communication-email --save

--save 选项将该库作为 package.json 文件中的依赖项列出。

创建具有身份验证的电子邮件客户端

可使用几个不同的选项对电子邮件客户端进行身份验证:

从客户端库导入 EmailClient,并使用连接字符串将其实例化。

以下代码使用 dotenv 包从名为 COMMUNICATION_SERVICES_CONNECTION_STRING 的环境变量中检索资源的连接字符串。 使用 npm install 命令安装 dotenv 包。 了解如何管理资源的连接字符串

npm install dotenv

将以下代码添加到 send-email.js:

const { EmailClient } = require("@azure/communication-email");
require("dotenv").config();

// This code demonstrates how to fetch your connection string
// from an environment variable.
const connectionString = process.env['COMMUNICATION_SERVICES_CONNECTION_STRING'];
const emailClient = new EmailClient(connectionString);

为简单起见,本快速入门使用了连接字符串,但在生产环境中,我们建议使用服务主体

基本电子邮件发送

发送电子邮件

若要发送电子邮件,请从 EmailClient 调用 beginSend 函数。 此方法返回一个轮询器,用于检查操作的状态,并在操作完成后检索结果。


async function main() {
  const POLLER_WAIT_TIME = 10
  try {
    const message = {
      senderAddress: "<donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net>",
      content: {
        subject: "Welcome to Azure Communication Services Email",
        plainText: "This email message is sent from Azure Communication Services Email using the JavaScript SDK.",
      },
      recipients: {
        to: [
          {
            address: "<emailalias@emaildomain.com>",
            displayName: "Customer Name",
          },
        ],
      },
    };

    const poller = await emailClient.beginSend(message);

    if (!poller.getOperationState().isStarted) {
      throw "Poller was not started."
    }

    let timeElapsed = 0;
    while(!poller.isDone()) {
      poller.poll();
      console.log("Email send polling in progress");

      await new Promise(resolve => setTimeout(resolve, POLLER_WAIT_TIME * 1000));
      timeElapsed += 10;

      if(timeElapsed > 18 * POLLER_WAIT_TIME) {
        throw "Polling timed out.";
      }
    }

    if(poller.getResult().status === KnownEmailSendStatus.Succeeded) {
      console.log(`Successfully sent the email (operation id: ${poller.getResult().id})`);
    }
    else {
      throw poller.getResult().error;
    }
  } catch (e) {
    console.log(e);
  }
}

main();

在代码中进行下述替换:

  • <emailalias@emaildomain.com> 替换为要向其发送邮件的电子邮件地址。
  • <donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net> 替换为经验证的域的 MailFrom 地址。

运行代码

使用 node 命令运行添加到 send-email.js 文件中的代码。

node ./send-email.js

代码示例

可以从 GitHub 下载示例应用

首先使用通信服务 Java 电子邮件 SDK 发送电子邮件,以此开始使用 Azure 通信服务。

提示

通过直接跳到 GitHub 上的基本电子邮件发送高级电子邮件发送示例代码,率先启动使用 Azure 通信服务发送电子邮件的体验。

了解电子邮件对象模型

以下类和接口用于处理适用于 Python 的 Azure 通信服务电子邮件 SDK 的某些主要功能。

名称 说明
EmailAddress 此类包含一个电子邮件地址和一个显示名称选项。
EmailAttachment 此接口通过接受唯一 ID、电子邮件附件 MIME 类型字符串、内容字节的字符串以及用于将其定义为内联附件的可选内容 ID 来创建电子邮件附件。
EmailClient 所有电子邮件功能需要此类。 使用连接字符串将其实例化,然后使用它来发送电子邮件。
EmailMessage 此类合并发件人、内容和收件人。 还可以选择添加自定义标头、附件和回复电子邮件地址。
EmailSendResult 此类保存电子邮件发送操作的结果。 它具有操作 ID、操作状态和错误对象(如果适用)。
EmailSendStatus 此类表示电子邮件发送操作的状态集。

EmailSendResult 返回执行的电子邮件操作的以下状态。

状态名称 说明
NOT_STARTED 目前,我们不会从我们的服务发送此状态。
IN_PROGRESS 电子邮件发送操作当前正在进行且正在处理中。
SUCCESSFULLY_COMPLETED 如果电子邮件发送操作已完成且未出错,并且电子邮件正在传送中。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件
FAILED 电子邮件发送操作未成功,并遇到错误。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。

先决条件

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

注意

我们还可以从我们自己的已验证域发送电子邮件,将自定义验证域添加到电子邮件通信服务

先决条件检查

  • 在终端或命令窗口中,运行 mvn -v 检查是否安装了 Maven。
  • 若要查看经过电子邮件通信服务资源验证的域,请登录到 Azure 门户。 找到电子邮件通信服务资源,并从左侧导航窗格中打开“预配域”选项卡。

设置应用程序环境

若要设置用于发送电子邮件的环境,请执行以下部分中所述的步骤。

创建新的 Java 应用程序

打开终端或命令窗口,并导航到要在其中创建 Java 应用程序的目录。 运行以下命令以从 maven-archetype-quickstart 模板生成 Java 项目。

mvn archetype:generate -DarchetypeArtifactId="maven-archetype-quickstart" -DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4" -DgroupId="com.communication.quickstart" -DartifactId="communication-quickstart"

generate 目标将创建一个名称与 artifactId 值相同的目录。 在此目录下,src/main/java 目录包含项目源代码,src/test/java 目录包含测试源,pom.xml 文件是项目的项目对象模型 (POM)。

安装包

在文本编辑器中打开 pom.xml 文件。 将以下依赖项元素添加到依赖项组。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-email</artifactId>
    <version>1.0.0-beta.2</version>
</dependency>

设置应用框架

在文本编辑器中打开 /src/main/java/com/communication/quickstart/App.java,添加 import 指令并删除 System.out.println("Hello world!"); 语句:

package com.communication.quickstart;

import com.azure.communication.email.models.*;
import com.azure.communication.email.*;
import com.azure.core.util.polling.*;

public class App
{
    public static void main( String[] args )
    {
        // Quickstart code goes here.
    }
}

创建具有身份验证的电子邮件客户端

可使用几个不同的选项对电子邮件客户端进行身份验证。

若要对客户端进行身份验证,请使用连接字符串实例化 EmailClient。 了解如何管理资源的连接字符串。 还可以使用任何实现 com.azure.core.http.HttpClient 接口的自定义 HTTP 客户端来初始化此客户端。

要实例化同步客户端,请将以下代码添加到main方法:

// You can get your connection string from your resource in the Azure portal.
String connectionString = "endpoint=https://<resource-name>.communication.azure.com/;accesskey=<access-key>";

EmailClient emailClient = new EmailClientBuilder()
    .connectionString(connectionString)
    .buildClient();

要实例化同步客户端,请将以下代码添加到main方法:

// You can get your connection string from your resource in the Azure portal.
String connectionString = "endpoint=https://<resource-name>.communication.azure.com/;accesskey=<access-key>";

EmailAsyncClient emailClient = new EmailClientBuilder()
    .connectionString(connectionString)
    .buildAsyncClient();

为简单起见,本快速入门使用了连接字符串,但在生产环境中,我们建议使用服务主体

基本电子邮件发送

可以使用 SDK 中的EmailMessage对象创建电子邮件。

EmailMessage message = new EmailMessage()
    .setSenderAddress("<donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net>")
    .setToRecipients("<emailalias@emaildomain.com>")
    .setSubject("Welcome to Azure Communication Services Email")
    .setBodyPlainText("This email message is sent from Azure Communication Services Email using the Java SDK.");

在代码中进行下述替换:

  • <emailalias@emaildomain.com> 替换为要向其发送邮件的电子邮件地址。
  • <donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net> 替换为经验证的域的 MailFrom 地址。

要发送电子邮件,请从EmailClient调用beginSend函数。

在同步客户端上调用beginSend会返回SyncPoller对象,该对象可用于检查操作的状态,并在操作完成后检索结果。 请注意,调用beginSend方法后,将立即发送发送电子邮件的初始请求。 发送电子邮件是长时间运行的操作。 请务必注意,轮询器上的getFinalResult()方法是阻止操作,直到达到终端状态(SUCCESSFULLY_COMPLETEDFAILED)。 推荐方法是按适合应用程序需求的间隔执行手动轮询,如以下示例所示。

try
{
    SyncPoller<EmailSendResult, EmailSendResult> poller = emailClient.beginSend(message, null); // This will send out the initial request to send an email

    PollResponse<EmailSendResult> pollResponse = null;

    Duration timeElapsed = Duration.ofSeconds(0);
    Duration POLLER_WAIT_TIME = Duration.ofSeconds(10);

    // Polling is done manually to avoid blocking the application in case of an error
    while (pollResponse == null
            || pollResponse.getStatus() == LongRunningOperationStatus.NOT_STARTED
            || pollResponse.getStatus() == LongRunningOperationStatus.IN_PROGRESS)
    {
        pollResponse = poller.poll();
        System.out.println("Email send poller status: " + pollResponse.getStatus());

        Thread.sleep(POLLER_WAIT_TIME.toMillis());
        timeElapsed = timeElapsed.plus(POLLER_WAIT_TIME);

        if (timeElapsed.compareTo(POLLER_WAIT_TIME.multipliedBy(18)) >= 0)
        {
            throw new RuntimeException("Polling timed out.");
        }
    }

    if (poller.getFinalResult().getStatus() == EmailSendStatus.SUCCEEDED)
    {
        System.out.printf("Successfully sent the email (operation id: %s)", poller.getFinalResult().getId());
    }
    else
    {
        throw new RuntimeException(poller.getFinalResult().getError().getMessage());
    }
}
catch (Exception exception)
{
    System.out.println(exception.getMessage());
}

运行代码

  1. 导航到包含 pom.xml 文件的目录,并使用 mvn 命令编译该项目。

    mvn compile
    
  2. 生成包。

    mvn package
    
  3. 运行以下 mvn 命令以执行应用。

    mvn exec:java -D"exec.mainClass"="com.communication.quickstart.App" -D"exec.cleanupDaemonThreads"="false"
    

代码示例

可以从 GitHub 下载示例应用

首先使用通信服务 Python 电子邮件 SDK 发送电子邮件,以此开始使用 Azure 通信服务。

提示

通过直接跳到 GitHub 上的基本电子邮件发送高级电子邮件发送示例代码,率先启动使用 Azure 通信服务发送电子邮件的体验。

了解电子邮件对象模型

以下 JSON 消息模板和响应对象展示适用于 Python 的 Azure 通信服务电子邮件 SDK 的某些主要功能。

message = {
    "content": {
        "subject": "str",  # Subject of the email message. Required.
        "html": "str",  # Optional. Html version of the email message.
        "plainText": "str"  # Optional. Plain text version of the email
            message.
    },
    "recipients": {
        "to": [
            {
                "address": "str",  # Email address. Required.
                "displayName": "str"  # Optional. Email display name.
            }
        ],
        "bcc": [
            {
                "address": "str",  # Email address. Required.
                "displayName": "str"  # Optional. Email display name.
            }
        ],
        "cc": [
            {
                "address": "str",  # Email address. Required.
                "displayName": "str"  # Optional. Email display name.
            }
        ]
    },
    "senderAddress": "str",  # Sender email address from a verified domain. Required.
    "attachments": [
        {
            "contentInBase64": "str",  # Base64 encoded contents of the attachment. Required.
            "contentType": "str",  # MIME type of the content being attached. Required.
            "name": "str"  # Name of the attachment. Required.
        }
    ],
    "userEngagementTrackingDisabled": bool,  # Optional. Indicates whether user engagement tracking should be disabled for this request if the resource-level user engagement tracking setting was already enabled in the control plane.
    "headers": {
        "str": "str"  # Optional. Custom email headers to be passed.
    },
    "replyTo": [
        {
            "address": "str",  # Email address. Required.
            "displayName": "str"  # Optional. Email display name.
        }
    ]
}

response = {
    "id": "str",  # The unique id of the operation. Uses a UUID. Required.
    "status": "str",  # Status of operation. Required. Known values are:
        "NotStarted", "Running", "Succeeded", and "Failed".
    "error": {
        "additionalInfo": [
            {
                "info": {},  # Optional. The additional info.
                "type": "str"  # Optional. The additional info type.
            }
        ],
        "code": "str",  # Optional. The error code.
        "details": [
            ...
        ],
        "message": "str",  # Optional. The error message.
        "target": "str"  # Optional. The error target.
    }
}

下表进一步说明了 response.status 值。

状态名称 说明
正在进行 电子邮件发送操作当前正在进行且正在处理中。
已成功 如果电子邮件发送操作已完成且未出错,并且电子邮件正在传送中。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件
已失败 电子邮件发送操作未成功,并遇到错误。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。

先决条件

完成本快速入门会从你的 Azure 帐户中扣取最多几美分的费用。

注意

我们还可以从我们自己的已验证域发送电子邮件。 将自定义的已验证域添加到电子邮件通信服务

先决条件检查

  • 在终端或命令窗口中,运行 python --version 命令来查看是否安装了 Python。
  • 若要查看经过电子邮件通信服务资源验证的域,请登录到 Azure 门户。 找到电子邮件通信服务资源,并从左侧导航窗格中打开“预配域”选项卡。

设置应用程序环境

若要设置用于发送电子邮件的环境,请执行以下部分中所述的步骤。

创建新的 Python 应用程序

  1. 打开终端或命令窗口。 然后使用以下命令来创建一个虚拟环境并将其激活。 此命令为应用创建新目录。

    python -m venv email-quickstart
    
  2. 导航到虚拟环境的根目录,并使用以下命令激活它。

    cd email-quickstart
    .\Scripts\activate
    
  3. 使用文本编辑器在项目根目录中创建名为“send-email.py”的文件,并添加程序的结构,包括基本异常处理。

    import os
    from azure.communication.email import EmailClient
    
    try:
        # Quickstart code goes here.
    except Exception as ex:
        print('Exception:')
        print(ex)
    

在以下部分,你要将本快速入门的所有源代码添加到你创建的 send-email.py 文件。

安装包

仍在应用程序目录中操作,使用以下命令安装适用于 Python 的 Azure 通信服务电子邮件 SDK 包。

pip install azure-communication-email

创建具有身份验证的电子邮件客户端

可使用几个不同的选项对电子邮件客户端进行身份验证:

使用连接字符串实例化 EmailClient。 了解如何管理资源的连接字符串

# Create the EmailClient object that you use to send Email messages.
email_client = EmailClient.from_connection_string(<connection_string>)

为简单起见,本快速入门使用了连接字符串,但在生产环境中,我们建议使用服务主体

基本电子邮件发送

发送电子邮件

若要发送电子邮件,需要:

  • 使用以下值构造消息:
    • senderAddress:有效的发件人电子邮件地址,位于链接到电子邮件通信服务资源的域的概述窗格中的 MailFrom 字段中。
    • recipients:一个对象,其中包含电子邮件收件人的列表,以及(可选)抄送和密件抄送电子邮件收件人列表。
    • content:一个对象,其中包含电子邮件的主题以及(可选)纯文本或 HTML 内容。
  • 调用 begin_send 方法,该方法返回操作的结果。
message = {
    "content": {
        "subject": "This is the subject",
        "plainText": "This is the body",
        "html": "<html><h1>This is the body</h1></html>"
    },
    "recipients": {
        "to": [
            {
                "address": "<emailalias@emaildomain.com>",
                "displayName": "Customer Name"
            }
        ]
    },
    "senderAddress": "<donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net>"
}

poller = email_client.begin_send(message)
print("Result: " + poller.result())

在代码中进行下述替换:

  • <emailalias@emaildomain.com> 替换为要向其发送邮件的电子邮件地址。
  • <donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net> 替换为经验证的域的 MailFrom 地址。

获取电子邮件送达状态

我们可以通过在 EmailClient 的 begin_send 方法返回的操作状态对象上设置循环来轮询电子邮件传送的状态:

POLLER_WAIT_TIME = 10

try:
    email_client = EmailClient.from_connection_string(connection_string)

    poller = email_client.begin_send(message);

    time_elapsed = 0
    while not poller.done():
        print("Email send poller status: " + poller.status())

        poller.wait(POLLER_WAIT_TIME)
        time_elapsed += POLLER_WAIT_TIME

        if time_elapsed > 18 * POLLER_WAIT_TIME:
            raise RuntimeError("Polling timed out.")

    if poller.result()["status"] == "Succeeded":
        print(f"Successfully sent the email (operation id: {poller.result()['id']})")
    else:
        raise RuntimeError(str(poller.result()["error"]))

except Exception as ex:
    print(ex)

运行代码

从应用程序目录使用 python 命令运行应用程序。

python send-email.py

代码示例

可以从 GitHub 下载示例应用

先决条件

发送电子邮件

若要使用 Azure 通信服务电子邮件连接器向工作流添加新步骤,请执行以下步骤:

  1. 在设计器中,打开逻辑应用工作流。

    消耗

    1. 在要添加新操作的步骤下,选择“新建步骤”。 或者,若要在步骤之间添加新操作,请将指针移到这些步骤之间的箭头上方,选择加号 (+),然后选择“添加操作”。

    2. 在“选择操作”搜索框中,选择“高级”。 在搜索框中,输入 Azure 通信电子邮件

    3. 从操作列表中选择“发送电子邮件”。

      显示 Azure 通信服务电子邮件连接器“发送电子邮件”操作的屏幕截图。

    标准

    1. 在要添加新操作的步骤下,选择加号 (+)。 或者,若要在步骤之间添加新操作,请将指针移到这些步骤之间的箭头上方,选择加号 (+),然后选择“添加操作”。

    2. 在“添加操作”搜索框下,在运行时下拉列表中选择“高级”。 在搜索框中,输入 Azure 通信电子邮件

    3. 从操作列表中选择“发送电子邮件”。

  2. 为连接提供一个名称。

  3. 输入 Azure 通信服务资源的连接字符串。 若要查找此字符串,请执行以下步骤:

    1. Azure 门户中,打开 Azure 通信服务资源。

    2. 在资源菜单上的“设置”下,选择“密钥”,然后复制连接字符串。

      显示 Azure 通信服务连接字符串的屏幕截图。

  4. 完成操作后,选择“创建”。

  5. 在“发件人”字段中,使用你在先决条件中配置的电子邮件地址。 输入“收件人电子邮箱”、“主题”和“正文”字段的值,例如:

    显示 Azure 通信服务电子邮件连接器“发送电子邮件”操作输入的屏幕截图。

  6. 保存工作流。 在设计器工具栏上选择“保存”。

测试工作流

根据你的工作流是消耗型还是标准型,手动启动你的工作流:

  • 消耗型:在设计器工具栏中,选择“运行触发器”>“运行”。
  • 标准型:在工作流菜单上,选择“概述”。 在工具栏上选择“运行触发器”>“运行”。

该工作流将创建用户,为该用户颁发访问令牌,然后移除并删除该用户。 可以在工作流成功运行后检查这些操作的输出。

你应该会在指定的地址收到一封电子邮件。 此外,可以使用“获取电子邮件状态”操作检查通过“发送电子邮件”操作发送的电子邮件的状态。 有关更多操作,请参阅 Azure 通信服务电子邮件连接器参考文档

清理工作流资源

若要清理逻辑应用资源、工作流和相关资源,请参阅如何清理消耗型逻辑应用资源如何清理标准型逻辑应用资源

疑难解答

电子邮件发送

要排查与电子邮件发送相关的问题,可以获取电子邮件发送状态来捕获发送详细信息。

重要

通过轮询发送操作的状态返回的成功结果只能确认电子邮件已成功发送以供传递这一事实。 要获取有关收件人端送达状态的其他信息,需要参考如何处理电子邮件事件

电子邮件限制

如果看到应用程序挂起,可能是由于电子邮件发送被限制。 可以通过日志记录或实现自定义策略来处理此问题

注意

此沙盒设置可帮助开发人员开始构建应用程序。 应用程序准备好发布后,可以逐渐请求增加发送量。 如果需要发送超出速率限制的消息量,请提交支持请求以提高所需的发送限制。

清理 Azure 通信服务资源

要清理并删除通信服务订阅,可以删除资源或资源组。 删除资源组时也会删除任何其他关联的资源。 了解有关清理资源的详细信息。

后续步骤

在本快速入门中,你已了解如何使用 Azure 通信服务发送电子邮件。 你可能还需要: