我如何检查新电子邮件以及是否有新电子邮件以使用 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
}
现在我只是在 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
}