.NET下的POP3編程
2024-07-10 13:00:18
供稿:網友
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。前一段時間在論壇上看見有人問如何使用.net進行pop3編程,其實pop3的使用很簡單,所以.net沒有向smtp那樣給出相應的類來控制.
廢話少說,程序員最需要的使代碼,:)!
1.打開vs.net 2003.
2.新建一個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.主要代碼
為了防止界面在連接服務器時死鎖,我另開了一個線程
private void button1_click(object sender, system.eventargs e)
{
thread mythread=new thread(new threadstart(treadget));
mythread.start();
}
private void treadget()
{
connecttoserver();
logonserver();
getemaillist();
}
//連接服務器
private void connecttoserver()
{
this.myclient=new tcpclient();
try
{
this.myclient.connect(this.servernametextbox.text,110);
this.messagelistbox.items.add("連接服務器成功");
//初始化網絡流,數據就是通過這個對象讀出來的
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();
}
參考資料
網絡郵件收取使用的是pop3協議,了解pop3協議有助于我們加深對郵件系統的理解。而且使用pop3協議你還可以直接telnet 到郵件服務器上去收信。
一般telnet pop3 server 110后就可以用這些命令了,大小寫不敏感, 不包括口令本身,注意不要讓口令回顯,等驗證通過后再允許回顯好了。
user username 用戶認可
pass password 認可 執行成功則狀態轉換
apop name,digest 認可一種安全傳輸口令的辦法,執行成功導致狀態轉換,請參見rfc 1321 。
stat 處理請求server回送郵箱統計資料,如郵件數、 郵件總字節數
uidl n 處理 server返回用于該指定郵件的唯一標識, 如果沒有指定,返回所有的。
list n 處理 server返回指定郵件的大小等
retr n 處理 server返回郵件的全部文本
dele n 處理 server標記刪除,quit命令執行時才真正刪除
rset 處理撤消所有的dele命令
top n,m 處理 返回n號郵件的前m行內容,m必須是自然數
noop 處理 server返回一個肯定的響應
quit client 希望結束會話。如果server處于"處理" 狀態,則現在進入"更新"狀態,刪除那些標記成刪除的郵件。如果server處于"認可"狀態, 則結束會話時server不進入"更新"狀態 。
使用telnet 的一個完整的收信例子如下:
telnet pop3server 110
user username
pass ****
stat
list
retr 1
retr 2
...
dele 1
dele 2
...
quit
<c#網絡應用編程>