如何对电子邮件执行异步 IMAP 操作
使用 ImapClient 的异步操作
使用 Aspose.Email 可以异步处理消息 ImapClient。本文展示了如何异步检索邮箱中的消息。本文还展示了如何通过提供搜索条件使用 MailQuery。将单独展示如何使用基于任务的异步模式(TAP)方法。
异步检索邮件
以下代码片段展示了如何异步检索邮件。
使用 MailQuery 异步列出消息
该 MailQuery 该类可用于指定搜索条件,以异步检索指定的邮件列表,如下代码示例所示。
异步发送消息
异步发送电子邮件非常方便,因为该过程不会阻塞程序或线程的执行。程序无需等待邮件发送完成即可继续执行其他任务,而邮件在后台发送时程序可以继续运行。
以下功能将帮助您在项目中实现异步发送:
-
IAsyncImapClient - 允许应用程序使用 Internet Message Access Protocol(IMAP)访问和操作消息。
-
ImapClient.CreateAsync - 创建 Aspose.Email.Clients.Imap.ImapClient 类的新实例
下面的代码示例演示了如何在后台列出消息:
// Authenticate the client to obtain necessary permissions
static readonly string tenantId = "YOU_TENANT_ID";
static readonly string clientId = "YOU_CLIENT_ID";
static readonly string redirectUri = "http://localhost";
static readonly string username = "username";
static readonly string[] scopes = { "https://outlook.office.com/IMAP.AccessAsUser.All" };
// Use the ImapAsync method for asynchronous operations
static async Task Main(string[] args)
{
await ImapAsync();
Console.ReadLine();
}
// Establish the connection with the server
// Create an instance of the ImapClient asynchronously using the CreateAsync method
// Select the Inbox folder using SelectFolderAsync method to complete and fetch the list of email messages asynchronously using the ListMessagesAsync method.
static async Task ImapAsync()
{
var tokenProvider = new TokenProvider(clientId, tenantId, redirectUri, scopes);
var client = ImapClient.CreateAsync("outlook.office365.com", username, tokenProvider, 993).GetAwaiter().GetResult();
await client.SelectFolderAsync(ImapFolderInfo.InBox);
var messages = await client.ListMessagesAsync();
Console.WriteLine("Messages :" + messages.Count);
}
// Token provider implementation
public class TokenProvider : IAsyncTokenProvider
{
private readonly PublicClientApplicationOptions _pcaOptions;
private readonly string[] _scopes;
public TokenProvider(string clientId, string tenantId, string redirectUri, string[] scopes)
{
_pcaOptions = new PublicClientApplicationOptions
{
ClientId = clientId,
TenantId = tenantId,
RedirectUri = redirectUri
};
_scopes = scopes;
}
public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false, CancellationToken cancellationToken = default)
{
var pca = PublicClientApplicationBuilder
.CreateWithApplicationOptions(_pcaOptions).Build();
try
{
var result = await pca.AcquireTokenInteractive(_scopes)
.WithUseEmbeddedWebView(false)
.ExecuteAsync(cancellationToken);
return new OAuthToken(result.AccessToken);
}
catch (MsalException ex)
{
Console.WriteLine($"Error acquiring access token: {ex}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex}");
}
return null;
}
public void Dispose()
{
}
}
管理异步操作
中断 TAP 方法
从 .NET Framework 4.5 开始,您可以使用符合 TAP 模型实现的异步方法。下面的代码片段展示了如何使用名为 AppendMessagesAsync 然后在一段时间后中断此过程。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
List<MailMessage> mailMessages = new List<MailMessage>();
// create mail messages
for (int i = 0; i < 100; i++)
mailMessages.Add(new MailMessage(senderEmail, receiverEmail, $"Message #{i}", "Text"));
using (ImapClient client = new ImapClient(host, 993, senderEmail, password, SecurityOptions.SSLImplicit))
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
Exception exception = null;
ThreadPool.QueueUserWorkItem(delegate
{
try
{
// start uploading the messages
var task = client.AppendMessagesAsync(mailMessages, cancellationTokenSource.Token);
AppendMessagesResult appendMessagesResult = task.GetAwaiter().GetResult();
Console.WriteLine("All messages have been appended.");
}
catch (Exception e)
{
exception = e;
}
finally
{
autoResetEvent.Set();
}
});
Thread.Sleep(5000);
// stop uploading the messages
cancellationTokenSource.Cancel();
autoResetEvent.WaitOne();
foreach (MailMessage mailMessage in mailMessages)
mailMessage.Dispose();
if (exception is OperationCanceledException)
Console.WriteLine("Operation has been interrupted: " + exception.Message);
}
取消异步操作
有时您可能需要停止异步操作。为此,我们的库通过使用 CancellationToken 参数提供了对异步操作的取消功能。调用支持取消的异步方法时,您可以将 CancellationToken 实例作为参数传入。CancellationToken 用于发出信号并控制操作的取消。
要启用取消,首先需要创建一个提供 CancellationToken 的 CancellationTokenSource 实例。然后,将 CancellationToken 传递给异步方法,使其在执行期间能够检查取消请求。
下面的示例演示了使用 CancellationToken 进行取消:
CancellationTokenSource tokenSource = new CancellationTokenSource();
AppendMessagesResult appendMessagesResult = null;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate(object state)
{
try
{
appendMessagesResult = imapClient.AppendMessagesAsync(mmList, tokenSource.Token).GetAwaiter().GetResult();
}
catch (Exception ex)
{
}
finally
{
autoResetEvent.Set();
}
});
tokenSource.Cancel();
autoResetEvent.WaitOne();