你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍了如何在使用 Email SDK 发送电子邮件时手动轮询电子邮件状态。
通过使用通信服务 .NET 电子邮件客户端库来发送电子邮件,开启 Azure 通信服务使用旅程。
完成本文需要从你的 Azure 帐户中扣取最多几美分的费用。
了解电子邮件对象模型
以下类和接口处理适用于 C# 的 Azure 通信服务电子邮件客户端库的某些主要功能。
名称 | 说明 |
---|---|
电子邮件地址 | 此类包含一个电子邮件地址和一个显示名称选项。 |
电子邮件附件 | 此类通过接受唯一 ID、电子邮件附件 MIME 类型字符串、内容的二进制数据以及用于将其定义为内联附件的可选内容 ID 来创建电子邮件附件。 |
电子邮件客户端 | 所有电子邮件功能需要此类。 使用连接字符串将其实例化,然后使用它来发送电子邮件。 |
电子邮件客户端选项 | 可将此类添加到EmailClient 实例化以面向特定的 API 版本。 |
电子邮件内容 | 此类包含电子邮件的主题和正文。 必须至少指定纯文本或 Html 内容之一 |
电子邮件自定义标头 | 使用此类可为自定义标头添加名称和值对。 还可以使用标头名称“x-priority”或“x-msmail-priority”通过这些标头指定电子邮件重要性 |
电子邮件消息 | 此类合并发件人、内容和收件人。 还可以选择添加自定义标头、附件和回复电子邮件地址。 |
邮件接收者 | 此类包含电子邮件收件人的 EmailAddress 对象列表,包括抄送和密件抄送收件人的可选列表。 |
电子邮件发送作 | 此类表示异步电子邮件发送操作,并从电子邮件发送 API 调用返回。 |
电子邮件发送结果 | 此类保存电子邮件发送操作的结果。 它具有操作 ID、操作状态和错误对象(如果适用)。 |
EmailSendResult 返回执行的电子邮件操作的以下状态。
状态 | 说明 |
---|---|
未启动 | 目前,我们不会从我们的服务发送此状态。 |
正在运行 | 电子邮件发送操作当前正在进行且正在处理中。 |
已成功 | 电子邮件发送作已完成且未出错,并且电子邮件已传出以供传递。 在此阶段之外传送的电子邮件的任何详细状态都可以通过 Azure Monitor 或 Azure 事件网格获取。 了解如何订阅电子邮件事件 |
已失败 | 电子邮件发送操作未成功,并遇到错误。 电子邮件未发送。 结果包含错误对象,以及有关失败原因的更多详细信息。 |
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- 适用于你的操作系统的最新版本 .NET Core 客户端库。
- 已使用预配的域创建并准备好了一个 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
的代码。 以下代码从名为 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);
发送电子邮件异步和轮询电子邮件发送状态
当您使用 Azure.WaitUntil.Started
调用 SendAsync 时,您的方法会在启动作后返回。 该方法返回 EmailSendOperation
object。 你可以调用 UpdateStatusAsync
method 来刷新邮件作状态。
返回 EmailSendOperation
的对象包含一个 EmailSendStatus
对象,该对象包含:
- 电子邮件发送操作的当前状态。
- 一个错误对象,如果当前状态处于失败状态,其中包含失败详细信息。
//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";
/// 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 Azure 示例 电子邮件示例高级下载示例应用程序。
故障排除
电子邮件发送
要排查与电子邮件发送相关的问题,可以获取电子邮件发送状态来捕获发送详细信息。
重要
轮询发送作状态返回的成功结果仅验证电子邮件是否已送达。 有关收件人端送达状态的详细信息,请参阅 如何处理电子邮件事件。
电子邮件限制
如果您的应用程序出现卡顿现象,可能是因为电子邮件发送速度受到了限制。 可以通过日志记录或实现自定义策略来处理电子邮件限制。
注意
此沙盒旨在帮助开发人员开始构建应用程序。 应用程序准备好发布后,可以逐渐请求增加发送量。 如果需要发送超出速率限制的消息量,请提交支持请求以提高所需的发送限制。
清理 Azure 通信服务资源
如果想要清理并删除通信服务订阅,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。 了解有关清理资源的详细信息。
后续步骤
- 了解如何向多名收件人发送电子邮件
- 详细了解如何发送包含附件的电子邮件
- 熟悉电子邮件客户端库