如何使用OpenPop获取所有电子邮件,还显示在progressBar上检索邮件的进度?

时间:2015-12-31 13:51:15

标签: c# .net winforms

这是我在项目中使用的OpenPop链接:

OpenPop

这是一个包含示例的页面:

Example

这是我的代码。在form1设计器中,我添加了progressBar。

我想要做的是获取我在服务器上的所有消息,并在progressBar中显示检索消息的进度。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Pop3_Emails
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            backgroundWorker1.RunWorkerAsync();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            OpenPop.Pop3.Pop3Client PopClient = new OpenPop.Pop3.Pop3Client();
            PopClient.Connect("mail.bezeqint.net", 110, false);
            PopClient.Authenticate("meemail", "password",
                OpenPop.Pop3.AuthenticationMethod.UsernameAndPassword);
            int messageCount = PopClient.GetMessageCount();
            List<Message> allMessages = new List<Message>(messageCount);
            for (int i = messageCount; i > 0; i--)
            {
                allMessages.Add(PopClient.GetMessage(i));
            }

            backgroundWorker1.ReportProgress(0,PopClient.GetMessageCount().ToString());
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            label1.Text = e.UserState.ToString();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }
    }
}

第一个问题是我在线上遇到两个错误:

allMessages.Add(PopClient.GetMessage(i));
  

错误1最佳重载方法匹配   &#39; System.Collections.Generic.List.Add(System.Windows.Forms.Message)&#39;   有一些无效的论点

     

错误2参数1:无法转换为&#39; OpenPop.Mime.Message&#39;至   &#39; System.Windows.Forms.Message&#39;

第二个问题是如何向progressBar报告进度?不知何故从FOR循环内部。

1 个答案:

答案 0 :(得分:0)

我认为,第一个问题是由AlexK解决的。

第二个问题可以通过设置来解决:

backgroundWorker1.WorkerReportsProgress = true;

在您的for循环中,您可以通过以下方式计算和报告进度:

int nProgress = (messageCount - i) * 100 / messageCount;
backgroundWorker1.ReportProgress(0, nProgress);

现在,您可以展示自己的进步:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    int nProgress = (int)e.UserState;
    label1.Text = nProgress.ToString();
    progressBar1.Value = nProgress;
}

但我也看到,您正在将所有下载的消息添加到本地变量List<Message> allMessages。因此,下载完成后会丢失。也许你应该把它移到课堂上......