C# 使用OpenPop如何将下载的电子邮件以消息格式保存,并将附件保存到硬盘?

C# 使用OpenPop如何将下载的电子邮件以消息格式保存,并将附件保存到硬盘?,c#,.net,winforms,C#,.net,Winforms,也许当下载所有电子邮件在硬盘上创建一个包含所有电子邮件的大文件时,或者当再次运行程序解析电子邮件时?或者将每封电子邮件保存到自己的邮件文件中,并为附件创建一个特定的目录 我想做的是,一旦我下一次从服务器下载了所有电子邮件,我将运行我的程序,我将看到所有的电子邮件,而无需再次下载它们,如果我点击一个按钮或使用计时器,它将下一次只从服务器下载新的电子邮件 以下是我今天下载电子邮件的方式: using System; using System.Collections.Generic; using Sy

也许当下载所有电子邮件在硬盘上创建一个包含所有电子邮件的大文件时,或者当再次运行程序解析电子邮件时?或者将每封电子邮件保存到自己的邮件文件中,并为附件创建一个特定的目录

我想做的是,一旦我下一次从服务器下载了所有电子邮件,我将运行我的程序,我将看到所有的电子邮件,而无需再次下载它们,如果我点击一个按钮或使用计时器,它将下一次只从服务器下载新的电子邮件

以下是我今天下载电子邮件的方式:

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;
using OpenPop;
using OpenPop.Pop3;
using OpenPop.Mime;

namespace Pop3_Emails
{
    public partial class Form1 : Form
    {
        static OpenPop.Pop3.Pop3Client cc = new Pop3Client();
        ProgressBarWithText pbt = new ProgressBarWithText();
        List<OpenPop.Mime.Message> allMessages;
        ListViewNF lvnf;

        public Form1()
        {
            InitializeComponent();

            lvnf = new ListViewNF();
            lvnf.Location = new Point(250, 18);
            lvnf.Size = new Size(474, 168);
            lvnf.View = View.Details;
            lvnf.Columns.Add("From", 100, HorizontalAlignment.Left);
            lvnf.Columns.Add("Subject", 200);
            lvnf.Columns.Add("Date", 300);
            this.Controls.Add(lvnf);

            label8.Visible = false;
            pbt.Size = new Size(216, 10);
            pbt.Location = new Point(8, 312);
            groupBox1.Controls.Add(pbt);

            backgroundWorker1.RunWorkerAsync();
            pbt.Text = "0%";
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private int numberofallmessages = 0;
        private int countMsg = 0;

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            OpenPop.Pop3.Pop3Client PopClient = new OpenPop.Pop3.Pop3Client();
            PopClient.Connect("mail", 110, false);
            PopClient.Authenticate("me", "me",
                OpenPop.Pop3.AuthenticationMethod.UsernameAndPassword);

            int messageCount = PopClient.GetMessageCount();
            numberofallmessages = messageCount;
            allMessages = new List<OpenPop.Mime.Message>(messageCount);
            for (int i = messageCount; i > 0; i--)
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    return;
                }
                allMessages.Add(PopClient.GetMessage(i));
                int nProgress = (messageCount - i + 1) * 100 / messageCount;
                backgroundWorker1.ReportProgress(nProgress, PopClient.GetMessageCount().ToString() + "/" + i);
            }
            PopClient.Disconnect();        
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbt.Value = e.ProgressPercentage;
            pbt.Text = e.ProgressPercentage.ToString() + "%";
            pbt.Invalidate();
            label8.Text = e.UserState.ToString();
            label8.Visible = true;
            lvnf.Items.Add(new ListViewItem(new string[]
            {
              allMessages[countMsg].Headers.From.ToString(),         //From Column
              allMessages[countMsg].Headers.Subject,                 //Subject Column
              allMessages[countMsg].Headers.DateSent.ToString()      //Date Column
            }));

            countMsg += 1;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (closingForm)
                this.Close();
            label8.Text = numberofallmessages.ToString() + "/" + "0";
        }

        public class ProgressBarWithText : ProgressBar
        {
            const int WmPaint = 15;
            SizeF TextSize;
            PointF TextPos;
            bool dontpaint = false;

            public ProgressBarWithText()
            {
                this.DoubleBuffered = true;
                this.TextChanged += ProgressBarWithText_TextChanged;
                this.SizeChanged += ProgressBarWithText_SizeChanged;
            }

            public override string Text
            {
                get { return base.Text; }
                set { base.Text = value; }
            }

            void RecalcTextPos()
            {
                if (this.IsDisposed == true)
                    return;
                if (string.IsNullOrEmpty(base.Text))
                    return;

                using (var graphics = Graphics.FromHwnd(this.Handle))
                {
                    TextSize = graphics.MeasureString(base.Text, this.Font);
                    TextPos.X = (this.Width / 2) - (TextSize.Width / 2);
                    TextPos.Y = (this.Height / 2) - (TextSize.Height / 2);
                }
            }

            void ProgressBarWithText_SizeChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            void ProgressBarWithText_TextChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                base.WndProc(ref m);

                if (dontpaint == false)
                {
                    switch (m.Msg)
                    {
                        case WmPaint:
                            using (var graphics = Graphics.FromHwnd(Handle))
                                graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y);

                            break;
                    }
                }
            }

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams result = base.CreateParams;
                    result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
                    return result;
                }
            }
        }

        private bool closingForm = false;
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!closingForm && MessageBox.Show("You sure?", "Form1", MessageBoxButtons.YesNo) == DialogResult.No)
            {
                e.Cancel = true;
            }
            else if (backgroundWorker1.IsBusy)
            {
                e.Cancel = true;
                closingForm = true;
                if (!backgroundWorker1.CancellationPending)
                    backgroundWorker1.CancelAsync();
            }
        }

        class ListViewNF : System.Windows.Forms.ListView
        {
            public ListViewNF()
            {
                //Activate double buffering
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

                //Enable the OnNotifyMessage event so we get a chance to filter out 
                // Windows messages before they get to the form's WndProc
                this.SetStyle(ControlStyles.EnableNotifyMessage, true);
            }

            protected override void OnNotifyMessage(System.Windows.Forms.Message m)
            {
                //Filter out the WM_ERASEBKGND message
                if (m.Msg != 0x14)
                {
                    base.OnNotifyMessage(m);
                }
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用OpenPop;
使用OpenPop.Pop3;
使用OpenPop.Mime;
名称空间Pop3_电子邮件
{
公共部分类Form1:Form
{
静态OpenPop.Pop3.Pop3Client cc=new Pop3Client();
ProgressBarWithText pbt=新的ProgressBarWithText();
列出所有消息;
ListViewNF-lvnf;
公共表格1()
{
初始化组件();
lvnf=新的ListViewNF();
lvnf.位置=新点(250,18);
lvnf.Size=新尺寸(474168);
lvnf.View=View.Details;
lvnf.Columns.Add(“From”,100,HorizontalAlignment.Left);
lvnf.列。添加(“主题”,200);
lvnf.列。添加(“日期”,300);
this.Controls.Add(lvnf);
标签8.可见=假;
pbt.尺寸=新尺寸(216,10);
位置=新点(8312);
groupBox1.Controls.Add(pbt);
backgroundWorker1.RunWorkerAsync();
pbt.Text=“0%”;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
私有int numberofallmessages=0;
私有int countMsg=0;
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
OpenPop.Pop3.Pop3Client-PopClient=new-OpenPop.Pop3.Pop3Client();
连接(“邮件”,110,假);
PopClient.Authenticate(“我”、“我”,
OpenPop.Pop3.AuthenticationMethod.username和password);
int messageCount=PopClient.GetMessageCount();
numberofallmessages=messageCount;
allMessages=新列表(messageCount);
对于(int i=messageCount;i>0;i--)
{
if(backgroundWorker1.CancellationPending==true)
{
e、 取消=真;
返回;
}
添加(PopClient.GetMessage(i));
int nProgress=(messageCount-i+1)*100/messageCount;
backgroundWorker1.ReportProgress(nProgress,PopClient.GetMessageCount().ToString()+“/”+i);
}
PopClient.Disconnect();
}
私有void backgroundWorker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
pbt.值=e.百分比;
pbt.Text=e.ProgressPercentage.ToString()+“%”;
pbt.Invalidate();
label8.Text=e.UserState.ToString();
label8.可见=真实;
添加(新ListViewItem(新字符串[])
{
allMessages[countMsg].Headers.From.ToString(),//From列
allMessages[countMsg].Headers.Subject,//主题列
allMessages[countMsg].Headers.DateSent.ToString()//日期列
}));
countMsg+=1;
}
私有void backgroundWorker1\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
if(closingForm)
这个。关闭();
label8.Text=numberofallmessages.ToString()+“/”+“0”;
}
公共类ProgressBarWithText:ProgressBar
{
常数int WmPaint=15;
SizeF TextSize;
点f TextPos;
bool dontpoint=false;
PublicProgressBarWithText()
{
this.DoubleBuffered=true;
this.TextChanged+=ProgressBarWithText\u TextChanged;
this.SizeChanged+=ProgressBarWithText\u SizeChanged;
}
公共重写字符串文本
{
获取{return base.Text;}
set{base.Text=value;}
}
void RecalcTextPos()
{
if(this.IsDisposed==true)
返回;
if(string.IsNullOrEmpty(base.Text))
返回;
使用(var graphics=graphics.FromHwnd(this.Handle))
{
TextSize=graphics.MeasureString(base.Text,this.Font);
TextPos.X=(this.Width/2)-(TextSize.Width/2);
TextPos.Y=(this.Height/2)-(TextSize.Height/2);
}
}
void ProgressBarWithText_SizeChanged(对象发送方,事件参数e)
{
RecalcTextPos();
}
void ProgressBarWithText\u TextChanged(对象发送方,事件参数e)
{
RecalcTextPos();
}
受保护的覆盖无效WndProc(参考System.Windows.Forms.Message m)
{
基准WndProc(参考m);
如果(dontpoint==false)
{
开关(m.Msg)
{
案例WmPaint:
使用(var graphics=graphics.FromHwnd(Handle))
图形.抽绳(base.Text,base.Font,画笔.黑色,TextPos.X,TextPos.Y);
打破
}