C# POP3编程
POP3的使用很簡單,所以.net沒有向SMTP那樣給出相應(yīng)的類來控制.
廢話少說,程序員最需要的使代碼,:)!
1.打開VS.NET 2003.
2.新建一個(gè)WinForm Application.
3.添加命名空間
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
4.主要代碼
為了防止界面在連接服務(wù)器時(shí)死鎖,我另開了一個(gè)線程
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ù)就是通過這個(gè)對象讀出來的
ns=this.myClient.GetStream();
sr=new StreamReader(ns);
sw=new StreamWriter(ns);
}
catch(Exception ex)
{
this.messageListBox.Items.Add(ex.Message);
}
}
//驗(yàn)證用戶名,密碼
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("沒有這個(gè)用戶名");
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("無法登錄,可能使用戶名密碼錯(cuò)誤!");
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后就可以用這些命令了,大小寫不敏感, 不包括口令本身,注意不要讓口令回顯,等驗(yàn)證通過后再允許回顯好了。
user username 用戶認(rèn)可
pass password 認(rèn)可 執(zhí)行成功則狀態(tài)轉(zhuǎn)換
apop name,digest 認(rèn)可一種安全傳輸口令的辦法,執(zhí)行成功導(dǎo)致狀態(tài)轉(zhuǎn)換,請參見RFC 1321 。
stat 處理請求server回送郵箱統(tǒng)計(jì)資料,如郵件數(shù)、 郵件總字節(jié)數(shù)
uidl n 處理 server返回用于該指定郵件的唯一標(biāo)識(shí), 如果沒有指定,返回所有的。
list n 處理 server返回指定郵件的大小等
retr n 處理 server返回郵件的全部文本
dele n 處理 server標(biāo)記刪除,quit命令執(zhí)行時(shí)才真正刪除
rset 處理撤消所有的dele命令
top n,m 處理 返回n號郵件的前m行內(nèi)容,m必須是自然數(shù)
noop 處理 server返回一個(gè)肯定的響應(yīng)
quit client 希望結(jié)束會(huì)話。如果server處于"處理" 狀態(tài),則現(xiàn)在進(jìn)入"更新"狀態(tài),刪除那些標(biāo)記成刪除的郵件。如果server處于"認(rèn)可"狀態(tài), 則結(jié)束會(huì)話時(shí)server不進(jìn)入"更新"狀態(tài) 。
使用telnet 的一個(gè)完整的收信例子如下:
telnet pop3Server 110
user username
pass ****
stat
list
retr 1
retr 2
...
dele 1
dele 2
...
quit?
?
廢話少說,程序員最需要的使代碼,:)!
1.打開VS.NET 2003.
2.新建一個(gè)WinForm Application.
3.添加命名空間
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
4.主要代碼
為了防止界面在連接服務(wù)器時(shí)死鎖,我另開了一個(gè)線程
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ù)就是通過這個(gè)對象讀出來的
ns=this.myClient.GetStream();
sr=new StreamReader(ns);
sw=new StreamWriter(ns);
}
catch(Exception ex)
{
this.messageListBox.Items.Add(ex.Message);
}
}
//驗(yàn)證用戶名,密碼
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("沒有這個(gè)用戶名");
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("無法登錄,可能使用戶名密碼錯(cuò)誤!");
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后就可以用這些命令了,大小寫不敏感, 不包括口令本身,注意不要讓口令回顯,等驗(yàn)證通過后再允許回顯好了。
user username 用戶認(rèn)可
pass password 認(rèn)可 執(zhí)行成功則狀態(tài)轉(zhuǎn)換
apop name,digest 認(rèn)可一種安全傳輸口令的辦法,執(zhí)行成功導(dǎo)致狀態(tài)轉(zhuǎn)換,請參見RFC 1321 。
stat 處理請求server回送郵箱統(tǒng)計(jì)資料,如郵件數(shù)、 郵件總字節(jié)數(shù)
uidl n 處理 server返回用于該指定郵件的唯一標(biāo)識(shí), 如果沒有指定,返回所有的。
list n 處理 server返回指定郵件的大小等
retr n 處理 server返回郵件的全部文本
dele n 處理 server標(biāo)記刪除,quit命令執(zhí)行時(shí)才真正刪除
rset 處理撤消所有的dele命令
top n,m 處理 返回n號郵件的前m行內(nèi)容,m必須是自然數(shù)
noop 處理 server返回一個(gè)肯定的響應(yīng)
quit client 希望結(jié)束會(huì)話。如果server處于"處理" 狀態(tài),則現(xiàn)在進(jìn)入"更新"狀態(tài),刪除那些標(biāo)記成刪除的郵件。如果server處于"認(rèn)可"狀態(tài), 則結(jié)束會(huì)話時(shí)server不進(jìn)入"更新"狀態(tài) 。
使用telnet 的一個(gè)完整的收信例子如下:
telnet pop3Server 110
user username
pass ****
stat
list
retr 1
retr 2
...
dele 1
dele 2
...
quit?
?
總結(jié)
- 上一篇: 求杜十娘歌词。
- 下一篇: C#分析数据库结构,使用XSL模板自动生