我如何检查新电子邮件以及是否有新电子邮件以使用 MailKit 获取它们?

How can i check for new emails and if there are new emails to get them using MailKit?

现在我只是在 backgroundworker dowork 事件中获取所有消息:

private int numberofallmessages = 0; 私人 int countMsg = 0;

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        List<string> uids = new List<string>();
        using (var client = new Pop3Client())
        {
            client.Connect(textServer.Text, Convert.ToInt32(textPort.Text), ssl);
            client.AuthenticationMechanisms.Remove("XOAUTH2");
            client.Authenticate(textUser.Text, textPassword.Text);

            for (int i = client.Count -1; i > 0; i--)
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    return;
                }
                if (i > 0)
                {
                    allMessages.Add(client.GetMessage(i));
                }
                    int nProgress = (client.Count - i + 1) * 100 / client.Count;
                    backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i);
            }

            client.Disconnect(true);
        }
   }

我收到了大约 6000 条的所有消息。 现在我想在按钮点击事件中添加一个代码,这样每次我点击按钮时它都会检查一封新电子邮件。例如,与 outlook 中的想法相同。

也许还可以使用一个事件,在收到新电子邮件时自动发出通知。

我看到了这个代码示例:

MailKit E_MailKit_MailFolder_CountChanged

但首先我不确定这是否是我 need/want 在我的例子中,第二个在他们使用 imap 的例子中,但在我的代码中我使用的是 pop3,我的帐户也是在Authenticate中的backgroundworker中使用的是pop3账号。

我希望在我收到所有消息(如 6000 条)之后单击按钮时,它将 check/get 仅发送新电子邮件,而不是再次发送 6000 封电子邮件。

您需要做的是跟踪您已下载的邮件的 UID。不幸的是,并非所有 POP3 服务器都支持 UID...

假设你这样做,你会这样做:

private HashSet<string> downloaded = new HashSet<string> ();

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    using (var client = new Pop3Client())
    {
        client.Connect(textServer.Text, Convert.ToInt32(textPort.Text), ssl);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate(textUser.Text, textPassword.Text);

        var uids = client.GetMessageUids ();

        for (int i = 0; i < client.Count; i++)
        {
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            if (!downloaded.Contains (uids[i]))
            {
                allMessages.Add(client.GetMessage(i));
                downloaded.Add (uids[i]);
            }

            int nProgress = (client.Count - i + 1) * 100 / client.Count;
            backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i);
        }

        client.Disconnect(true);
    }

}

显然,这只有在程序保持打开状态时才有效。关闭程序并重新 运行 后,downloaded 变量将被清除,它将再次重新下载所有内容,因此您需要添加逻辑以在 运行s(假设你关心)。

检查 POP3 服务器是否支持 UID 的方法是:

if (client.Capabilities.HasFlag (Pop3Capabilities.UIDL))
{
    // UIDs are supported
}