VisualC#編寫實現(xiàn)POP3的程序

字號:

1.打開VS.net 2003.
    2.新建一個WinForm Application.
    3.添加命名空間
    4.主要代碼
    為了防止界面在連接服務(wù)器時死鎖,我另開了一個線程
    private void button1_Click(object sender, System.EventArgs e)
    {
    Thread myThread=new Thread(new ThreadStart(TreadGet));
    myThread.Start();
    }
    private void TreadGet()
    {
    ConnectToServer();
    LogonServer();
    GetEmailList();
    }
    //連接服務(wù)器
    private void ConnectToServer()
    {
    this.myClient=new TcpClient();
    try
    {
    this.myClient.Connect(this.serverNameTextBox.Text,110);
    this.messageListBox.Items.Add("連接服務(wù)器成功");
    //初始化網(wǎng)絡(luò)流,數(shù)據(jù)就是通過這個對象讀出來的
    ns=this.myClient.GetStream();
    sr=new StreamReader(ns);
    sw=new StreamWriter(ns);
    }
    catch(Exception ex)
    {
    this.messageListBox.Items.Add(ex.Message);
    }
    }
    //驗證用戶名,密碼
    private void LogonServer()
    {
    result=sr.ReadLine();
    this.messageListBox.Items.Add(result);
    sw.WriteLine("USER "+this.nameTextBox.Text);
    sw.Flush();
    result=sr.ReadLine();
    if(result.Substring(0,3)=="-ER")
    {
    this.messageListBox.Items.Add("沒有這個用戶名");
    return;
    }
    sw.WriteLine("PASS "+this.passTextBox.Text);
    sw.Flush();
    try
    {
    result=sr.ReadLine();
    }
    catch(IOException ioex)
    {
    this.messageListBox.Items.Add(ioex.Message);
    return;
    }
    if(result.Substring(0,4)=="-ERR")
    {
    this.messageListBox.Items.Add("無法登錄,可能使用戶名密碼錯誤!");
    return;
    }
    this.messageListBox.Items.Add("登錄成功");
    }
    //獲取郵件列表
    private void GetEmailList()
    {
    string from=null;
    string subject=null;
    sw.WriteLine("stat");
    sw.Flush();
    result=sr.ReadLine();
    // MessageBox.Show(result);
    string[] nummessage=result.Split(' ');
    int totalnum=Convert.ToInt32(nummessage[1]);
    if(totalnum>0)
    this.messageListBox.Items.Add("你有"+totalnum.ToString()+"郵件");
    else
    this.messageListBox.Items.Add("郵箱里沒有郵件");
    for(int i=1;i<=totalnum;i++)
    {
    sw.WriteLine("top "+i.ToString()+" 0");
    sw.Flush();
    result=sr.ReadLine();
    while(true)
    {
    result=sr.ReadLine();
    if(result==".")
     break;
    if(result.Length>4)
    {
     if(result.Substring(0,5)=="From:")
    from=result ;
     if(result.Substring(0,8)=="Subject:")
    subject=result ;
    }
    }
    this.listBox1 .Items.Add(i.ToString()+" "+from+ " "+ subject);
    }
    }
    private void button2_Click(object sender, System.EventArgs e)
    {
    this.listBox1.Items.Clear();
    }
    參考資料
    網(wǎng)絡(luò)郵件收取使用的是Pop3協(xié)議,了解Pop3協(xié)議有助于我們加深對郵件系統(tǒng)的理解。而且使用Pop3協(xié)議你還可以直接telnet 到郵件服務(wù)器上去收信。
    一般telnet Pop3 Server 110后就可以用這些命令了,大小寫不敏感, 不包括口令本身,注意不要讓口令回顯,等驗證通過后再允許回顯好了。
    user username 用戶認可
    pass password 認可 執(zhí)行成功則狀態(tài)轉(zhuǎn)換
    apop name,digest 認可一種安全傳輸口令的辦法,執(zhí)行成功導(dǎo)致狀態(tài)轉(zhuǎn)換,請參見RFC 1321 。
    stat 處理請求server回送郵箱統(tǒng)計資料,如郵件數(shù)、 郵件總字節(jié)數(shù)
    uidl n 處理 server返回用于該指定郵件的標識, 如果沒有指定,返回所有的。
    list n 處理 server返回指定郵件的大小等
    retr n 處理 server返回郵件的全部文本
    dele n 處理 server標記刪除,quit命令執(zhí)行時才真正刪除
    rset 處理撤消所有的dele命令
    top n,m 處理 返回n號郵件的前m行內(nèi)容,m必須是自然數(shù)
    noop 處理 server返回一個肯定的響應(yīng)
    quit client 希望結(jié)束會話。如果server處于"處理" 狀態(tài),則現(xiàn)在進入"更新"狀態(tài),刪除那些標記成刪除的郵件。如果server處于"認可"狀態(tài), 則結(jié)束會話時server不進入"更新"狀態(tài) 。
    使用telnet 的一個完整的收信例子如下:
    telnet pop3Server 110
    user username
    pass ****
    stat
    list
    retr 1
    retr 2
    ...
    dele 1
    dele 2
    ...
    quit