معالجة البريد الإلكتروني غير المتزامنة باستخدام عميل POP3

العمليات غير المتزامنة مع Pop3Client

يمكن أيضًا تنفيذ العمل مع الرسائل بشكل غير متزامن باستخدام Aspose.Email Pop3Client. توضح هذه المقالة كيفية استرجاع الرسائل من صندوق البريد بشكل غير متزامن. كما توضح كيفية سرد الرسائل بتوفير معايير البحث باستخدام MailQuery. سيتم توضيح بشكل منفصل كيفية إيقاف عملية مع صندوق بريد تم بدء تشغيله بنمط غير متزامن مبني على المهام (TAP) طريقة.

استرجاع الرسائل بشكل غير متزامن

يوضح المقتطف البرمجي التالي كيفية استرجاع الرسائل بشكل غير متزامن.

Pop3Client client = new Pop3Client();
client.Host = "pop.gmail.com";
client.Port = 995;
client.SecurityOptions = SecurityOptions.SSLImplicit;
client.Username = "username";
client.Password = "password";
            
try
{
    Pop3MessageInfoCollection messages = client.ListMessages();
    Console.WriteLine("Total Number of Messages in inbox:" + messages.Count);
    AutoResetEvent evnt = new AutoResetEvent(false);
    MailMessage message = null;
    AsyncCallback callback = delegate(IAsyncResult ar)
    {
        message = client.EndFetchMessage(ar);
        evnt.Set();
    };
    client.BeginFetchMessage(messages[0].SequenceNumber, callback, null);
    evnt.WaitOne();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

قائمة الرسائل بشكل غير متزامن باستخدام MailQuery

الـ MailQuery يمكن استخدام الفئة لتحديد معايير البحث لاسترجاع قائمة الرسائل بشكل غير متزامن كما هو موضح في عينة الكود التالية.

MailQueryBuilder builder = new MailQueryBuilder();
builder.Subject.Contains("Subject");
MailQuery query = builder.GetQuery();
IAsyncResult asyncResult = client.BeginListMessages(query);
Pop3MessageInfoCollection messages = client.EndListMessages(asyncResult);

إيقاف طريقة TAP

بدءًا من .NET Framework 4.5، يمكنك استخدام الطرق غير المتزامنة التي تم تنفيذها وفق نموذج TAP. يوضح المقتطف البرمجي أدناه كيفية الحصول على معلومات حول صندوق البريد باستخدام طريقة النمط غير المتزامن القائم على المهام المسماة GetMailboxInfoAsync ثم قم بقطع هذه العملية بعد فترة.


using (Pop3Client client = new Pop3Client(host, 995, senderEmail, password, SecurityOptions.Auto))
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    Exception exception = null;

    ThreadPool.QueueUserWorkItem(delegate
    {
        try
        {
            // start receiving mailbox information
            var task = client.GetMailboxInfoAsync(cancellationTokenSource.Token);
            Pop3MailboxInfo mailboxInfo = task.GetAwaiter().GetResult();
            Console.WriteLine("Message count: " + mailboxInfo.MessageCount);
        }
        catch (Exception e)
        {
            exception = e;
        }
        finally
        {
            autoResetEvent.Set();
        }
    });

    Thread.Sleep(2000);

    // stop receiving mailbox information
    cancellationTokenSource.Cancel();
    autoResetEvent.WaitOne();

    if (exception is OperationCanceledException)
        Console.WriteLine("Operation has been interrupted: " + exception.Message);
}