使用 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)客户端。代码执行以下步骤:

  1. 创建一个新的 CancellationToken 可用于取消异步操作的对象。
  2. 实例化 SomeAsyncTokenProvider 实现该接口的类 IAsyncTokenProvider 接口。此类用作构造新 OAuthNetworkCredential 对象。
  3. 将邮箱 URI 设置为 Exchange Web Services 端点。
  4. 调用 GetEwsClientAsync 方法的 EWSClient 带有的类 mailboxUriOAuthNetworkCredential 对象作为参数。此方法返回一个 Task 对象,因此它在继续之前会等待结果。The cancellationToken 对象作为可选参数传递给 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);

发送电子邮件

下面的代码示例尝试以异步方式发送电子邮件。代码执行以下步骤:

  1. 创建一个新的 MailMessage 包含消息参数的对象。
  2. 调用 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);

获取电子邮件消息

要异步获取电子邮件消息,请使用以下代码示例并遵循下面的步骤:

  1. 调用 FetchItemAsync EWSclient 的方法。该方法接受两个参数:

    • messageUri 是表示要获取的消息 URI 的字符串
    • cancellationToken 是一个可选参数,可用于取消异步操作。该方法返回一个 Task 对象,解析为一个 MapiMessage 对象,当异步操作完成时。使用 "await" 关键字等待 Task 对象完成后再继续。
  2. 分配给 fetched 变量为已完成 Task 的结果,即一个 MapiMessage 包含获取的消息数据的对象。

       var fetched = await ewsClient.FetchItemAsync(messageUri, cancellationToken: cancellationToken);
    

追加电子邮件消息

下面的代码示例尝试异步追加电子邮件消息。代码执行以下步骤:

  1. 调用 AppendMessagesAsync 方法属于一个 EWSclient 对象。该方法接受一个 EwsAppendMessage 包含参数的对象:要追加的消息、目标文件夹 URI 和取消令牌。

  2. 创建 EwsAppendMessage 使用… 对象 Create 方法并使用以下方法调用进行配置:

  3. AppendMessagesAsync 该方法返回一个 Task 对象,异步操作完成后解析为 IEnumerable 对象。使用 "await" 关键字等待 Task 对象完成后再继续。

  4. uris 变量被赋值为已完成 Task 的结果,即包含已追加消息 URI 的 IEnumerable 对象。

IEnumerable<string> uris = await ewsClient.AppendMessagesAsync(
    EwsAppendMessage.Create()
        .AddMessage(message)
        .AddMessage(fetched)
        .SetFolder(folderUri)
        .SetCancellationToken(cancellationToken));

复制项目

下面的代码示例展示了如何复制项目并执行以下步骤:

  1. 调用 CopyItemAsync 方法属于一个 EWSClient 对象。该方法接受三个参数:

    • messageUri 是表示要复制的消息 URI 的字符串
    • destinationFolderUri 是表示目标文件夹 URI 的字符串
    • cancellationToken 是一个可选参数,可用于取消异步操作。

    该方法返回一个 Task 对象,异步操作完成后解析为字符串。使用 "await" 关键字等待 Task 对象完成后再继续。

  2. 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);

更新项目

下面的代码示例尝试异步更新一个项目。它执行以下步骤:

  1. 创建一个 EwsUpdateItem 使用… 对象 Create 方法,传入一个项目对象。EwsUpdateItem 表示更新操作的参数。 SetCancellationToken 方法在 EwsUpdateItem 对象,传入 cancellationToken 参数,这是一个可选参数,可用于取消异步操作。
  2. 传递 EwsUpdateItem 对象作为参数传递给 UpdateItemAsync 方法属于一个 EWSClient.
  3. UpdateItemAsync 该方法返回一个 Task 对象,当异步操作完成时结束。使用 "await" 关键字等待 Task 对象完成后再继续。
await ewsClient.UpdateItemAsync(
    EwsUpdateItem.Create(mapiNote)
        .SetCancellationToken(cancellationToken));