MailKit:尝试在 ASP.NET 核心中实现 IMAP 客户端以接收新邮件事件

MailKit: Trying to implement IMAP Client in ASP.NET Core for Receiving new mail event

我正在尝试在我的 ASP.NET 核心 Web 项目中实现一个 IMAP 客户端,以便它可以 运行 在自己的线程上,每当收到新电子邮件 MailRecieved 事件时将被解雇,我正在接收解析电子邮件正文并保存在数据库中。

但问题是我必须让我的 MailClient 保持活动状态,这样我才能继续收听新电子邮件,这在我 case.I 阅读 MailKit 文档中的代码示例时不起作用不幸的是,他们使用 System.Timer 的地方 ASP.NET 没有计时器。

这是我正在使用的代码:-

 public static async Task MailSubscribe(IMAPConnection connection)
    {
        try
        {
            using (var client = new ImapClient())
            {
                client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                await client.ConnectAsync(connection.Host, connection.Port, connection.EnableSSL);
                client.AuthenticationMechanisms.Remove("XOAUTH2");
                if (client.IsConnected)
                    client.Authenticate(connection.UserName, connection.Password);
                if (client.IsAuthenticated)
                {
                    var inbox = client.Inbox;
                    inbox.Open(FolderAccess.ReadOnly);
                    inbox.MessagesArrived += async (s, e) =>
                    {
                        using (var mailFetch = new ImapClient())
                        {
                            mailFetch.ServerCertificateValidationCallback = (g, c, h, k) => true;
                            await mailFetch.ConnectAsync(connection.Host, connection.Port, connection.EnableSSL);
                            mailFetch.AuthenticationMechanisms.Remove("XOAUTH2");
                            if (mailFetch.IsConnected)
                                mailFetch.Authenticate(connection.UserName, connection.Password);
                            if (mailFetch.IsAuthenticated)
                            {
                                mailFetch.Inbox.Open(FolderAccess.ReadOnly);
                                var mailIds = mailFetch.Inbox.Search(SearchQuery.NotSeen);
                                foreach (var id in mailIds)
                                {
                                    var mail = mailFetch.Inbox.GetMessage(id);
                                    var htmlDoc = new HtmlDocument();
                                    htmlDoc.LoadHtml(mail.HtmlBody);
                                    var context = htmlDoc.GetElementbyId("context")?.InnerText;
                                    if (context != null)
                                    {
                                        var entity = context;
                                    }
                                }
                            }
                        };
                    };
                }
                using (var done = new CancellationTokenSource())
                {
                    var task = client.IdleAsync(done.Token);
                    int timeout = client.Timeout;
                    while (true)
                    {
                        Thread.Sleep(10000);
                        if (client.IsIdle)
                        {
                            if (!client.Inbox.IsOpen)
                                client.Inbox.Open(FolderAccess.ReadOnly);
                           client.Idle(done.Token);
                        }
                    }
                    // done.Cancel();
                    // task.Wait();
                }
                //client.Disconnect(true);
            };
        }
        catch (Exception ex)
        {
            string exception = ex.Message;
            string innerexception = ex.InnerException.ToString();
        }
    }

有一个 CancellationTokenSource 构造函数,它采用您可以使用的 int 超时值。我认为这适用于 ASP.NET 核心。

如果没有,请尝试类似这样的操作:

while (true) {
    if (!client.Inbox.IsOpen)
        client.Inbox.Open(FolderAccess.ReadOnly);
    var task = client.IdleAsync (done.Token);
    Thread.Sleep(10000);
    done.Cancel();
    task.Wait();
}