使用 OAuth 认证和 EWS 客户端进行异步电子邮件操作
获取 OAuth 令牌的异步方法
与同步方法不同,异步方法是非阻塞的,允许同时执行多个请求。异步方法的名称以 Async 为后缀。
注意: 异步方法在面向 .NET Core、.NET Framework 4.5 及更高版本的情况下可用。
以下代码示例定义了一个 SomeAsyncTokenProvider 类,实现了 IAsyncTokenProvider 接口。该类实现 GetAccessTokenAsync 异步方法,返回 OAuthToken 类型的 Task。此方法获取有效的 OAuthToken 异步地。
private class SomeAsyncTokenProvider : IAsyncTokenProvider
{
public SomeAsyncTokenProvider( /*some parameters*/)
{
...
}
public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false,
CancellationToken cancellationToken = default)
{
//Some asynchronous code to get a valid OAuthToken
...
}
public void Dispose()
{
...
}
}
使用 OAuth 身份验证的异步 EWS 客户端设置
下一个代码示例使用 OAuth 身份验证以异步方式获取 Exchange Web Services(EWS)客户端。代码执行以下步骤:
- 创建一个新的 CancellationToken 可用于取消异步操作的对象。
- 实例化
SomeAsyncTokenProvider实现该接口的类 IAsyncTokenProvider 接口。此类用作构造新 OAuthNetworkCredential 对象。 - 将邮箱 URI 设置为 Exchange Web Services 端点。
- 调用 GetEwsClientAsync 方法的 EWSClient 带有的类
mailboxUri和OAuthNetworkCredential对象作为参数。此方法返回一个 Task 对象,因此它在继续之前会等待结果。ThecancellationToken对象作为可选参数传递给 GetEwsClientAsync 方法。
//The cancellationToken can be used
var cancellationToken = new CancellationToken();
//Create IAsyncEwsClientInstance
IAsyncTokenProvider tokenProvider = new SomeAsyncTokenProvider(/*some parameters*/);
const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
var ewsClient = await EWSClient.GetEwsClientAsync(mailboxUri, new OAuthNetworkCredential(tokenProvider),
cancellationToken: cancellationToken);
发送电子邮件
下面的代码示例尝试以异步方式发送电子邮件。代码执行以下步骤:
- 创建一个新的 MailMessage 包含消息参数的对象。
- 调用 SendAsync 方法的 EWSClient 对象,传入 MailMessage 作为参数。由于返回 Task 对象,已对方法使用 await。
cancellationToken对象作为可选参数传递给 SendAsync 方法。
MailMessage message = new MailMessage("from@aspose.com", "to@aspose.com", "Some subject", "Some body");
await ewsClient.SendAsync(message, cancellationToken: cancellationToken);
获取电子邮件消息
要异步获取电子邮件消息,请使用以下代码示例并遵循下面的步骤:
-
调用 FetchItemAsync EWSclient 的方法。该方法接受两个参数:
messageUri是表示要获取的消息 URI 的字符串cancellationToken是一个可选参数,可用于取消异步操作。该方法返回一个 Task 对象,解析为一个 MapiMessage 对象,当异步操作完成时。使用 "await" 关键字等待 Task 对象完成后再继续。
-
分配给
fetched变量为已完成 Task 的结果,即一个 MapiMessage 包含获取的消息数据的对象。var fetched = await ewsClient.FetchItemAsync(messageUri, cancellationToken: cancellationToken);
追加电子邮件消息
下面的代码示例尝试异步追加电子邮件消息。代码执行以下步骤:
-
调用 AppendMessagesAsync 方法属于一个 EWSclient 对象。该方法接受一个 EwsAppendMessage 包含参数的对象:要追加的消息、目标文件夹 URI 和取消令牌。
-
创建 EwsAppendMessage 使用… 对象 Create 方法并使用以下方法调用进行配置:
- AddMessage 向追加操作添加一条消息。
- SetFolder 设置追加操作的目标文件夹 URI。
- SetCancellationToken 设置可用于取消异步操作的取消令牌。
-
该 AppendMessagesAsync 该方法返回一个 Task 对象,异步操作完成后解析为 IEnumerable
对象。使用 "await" 关键字等待 Task 对象完成后再继续。 -
该
uris变量被赋值为已完成 Task 的结果,即包含已追加消息 URI 的 IEnumerable对象。
IEnumerable<string> uris = await ewsClient.AppendMessagesAsync(
EwsAppendMessage.Create()
.AddMessage(message)
.AddMessage(fetched)
.SetFolder(folderUri)
.SetCancellationToken(cancellationToken));
复制项目
下面的代码示例展示了如何复制项目并执行以下步骤:
-
调用 CopyItemAsync 方法属于一个 EWSClient 对象。该方法接受三个参数:
messageUri是表示要复制的消息 URI 的字符串destinationFolderUri是表示目标文件夹 URI 的字符串cancellationToken是一个可选参数,可用于取消异步操作。
该方法返回一个 Task 对象,异步操作完成后解析为字符串。使用 "await" 关键字等待 Task 对象完成后再继续。
-
newItemUri变量被赋值为已完成 Task 的结果,即包含新创建的消息副本 URI 的字符串。
string newItemUri = await ewsClient.CopyItemAsync(messageUri, destinationFolderUri, cancellationToken);
删除项目
以下代码尝试异步删除电子邮件消息。
它调用 DeleteItemAsync EWSClient 对象的方法。该方法接受三个参数:
newItemUri是表示要删除的项目 URI 的字符串DeletionOptions.DeletePermanently指定该项目应被永久删除cancellationToken是一个可选参数,可用于取消异步操作。
该方法返回一个 Task 对象,当异步操作完成时结束。使用 "await" 关键字等待 Task 对象完成后再继续。
await ewsClient.DeleteItemAsync(newItemUri, DeletionOptions.DeletePermanently, cancellationToken);
删除文件夹
以下代码尝试异步删除文件夹。
它调用 DeleteFolderAsync EWSClient 对象的方法。该方法接受三个参数:
folderUri是表示要删除的文件夹 URI 的字符串deletePermanently指定是永久删除文件夹还是将其移动到 “已删除项目” 文件夹cancellationToken是一个可选参数,可用于取消异步操作。
该方法返回一个 Task 对象,当异步操作完成时结束。使用 "await" 关键字等待 Task 对象完成后再继续。
const bool deletePermanently = true;
await ewsClient.DeleteFolderAsync(folderUri, deletePermanently, cancellationToken);
更新项目
下面的代码示例尝试异步更新一个项目。它执行以下步骤:
- 创建一个 EwsUpdateItem 使用… 对象 Create 方法,传入一个项目对象。EwsUpdateItem 表示更新操作的参数。 SetCancellationToken 方法在 EwsUpdateItem 对象,传入
cancellationToken参数,这是一个可选参数,可用于取消异步操作。 - 传递 EwsUpdateItem 对象作为参数传递给 UpdateItemAsync 方法属于一个 EWSClient.
- 该 UpdateItemAsync 该方法返回一个 Task 对象,当异步操作完成时结束。使用 "await" 关键字等待 Task 对象完成后再继续。
await ewsClient.UpdateItemAsync(
EwsUpdateItem.Create(mapiNote)
.SetCancellationToken(cancellationToken));