在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

Email 服務器的容易完成

Email 服務器的容易完成

更新時間:2022-04-29 文章作者:未知 信息來源:網絡 閱讀次數:

我們知道從Delphi 3 開始,它自帶的控件中有基于Internet開發的控件。如果我們充分利用這些控件開發Internet程序則可以簡化編程工作,提高效率。鑒于目前POP3客戶端的軟件的種類繁多,(如Outlook Express,Foxmail 以及Web 方式下的各免費郵局),而服務器端(除Unix Email系統)很少公開原代碼,下面我就向大家著重介紹一下利用 Delphi 4中Internet控件組的TClientSocket 和TServerSocket 控件來實現 Email POP3服務器端。如果您理解了Email POP3服務器的構造,相信也可以依葫蘆畫瓢寫出Email SMTP服務器程序。在此基礎上加入多線程技術使服務器能同時處理多個客戶的連接請求,您就可以輕松地實現一個簡單的Email服務器了。

一. 設計思路
Email 系統采用C/S 結構。當用戶想發送郵件時或收取郵件時在客戶機上運行任意一個客戶端程序,如Foxmail。在菜單’工具->選項’的郵件服務器里填上運行我們服務器程序的主機名。服務器主機24小時一直運行我們的服務器端程序,SMTP和POP3服務器程序分別在25端口和110端口偵聽連接請求。當用戶發信時,首先客戶端會與服務器端建立Socket連接。然后開始一應一答的Client/Server間的通信。發信和收信時建立連接后服務器端分別要發送一個’250 OK’ 和’+OK pop3 server is ready ’的應答。客戶端收到此應答后開始發送SMTP或POP3命令。POP3通信時一般最開始的命令是’user ‘和’pass’或’ apop’用以進行身份驗證。注意由于POP3會話有3個狀態,某些命令只在某特定狀態下有效。當用戶進行完所有的操作后發送一個’quit’命令。服務器端收到此命令即終止此次socket連接并繼續偵聽其他的連接請求。注意:POP3通信時客戶端在Transaction狀態下’quit’則進入update狀態。如果從Authorization狀態下’quit’則終止通信,而不進入Update狀態。如果客戶端不通過’quit’命令終止連接,POP3會話不會進入Update狀態。而只有在Update狀態下收到’quit’命令后服務器才會在斷連前把標志為已刪的郵件進行物理刪除。
二. 代碼實現(以POP3為例)
自定義TPOP類的描述:

SessionState = ( Init,Authorization, Transaction,Update);
TPop=class (TComponent)
public
UserName:string;//Email帳戶名
PassWord:string; //Email口令
ReceText:Pchar; //server端收到的字符串
PopState:SessionState;
//pop狀態:
init or authorization or transaction or update
MsgCount:integer; //郵件總數
SizeCount:integer; //郵件總大小
ReplyString:string;//服務器端發送的應答信息
DeleIndex:byte;//用戶要刪的郵件序號
ListIndex:byte;//list方法 的參數:
用戶要列出的序號為listindex的郵件信息
RetrIndex:byte;//retr方法的參數:
用戶要取序號為retrindex的郵件
TopIndex:byte; //top方法的參數
QuitFlag:boolean;//用戶如果通過quit命斷連則此變量為true;
反之(此時要把f_dele都置回0)
OldMsgCount:integer;//舊郵件數:Last 命令返回
//郵件頭的各個域
HMsgId:string;
HReplyTo:string;
HDate:string;
HFrom:string;
HTo:string;
HSubject:string;
HMIME_Ver:real;
HContent_Type:string;
HContent_Transfer_Encoding:string;
HText:string;
//所有POP3服務器必須支持的命令
procedure user;
function pass:boolean;
procedure stat;
procedure dele;
procedure list;
procedure retr;
procedure noop;
procedure rset;
procedure aquit;
procedure tquit;
//擴展的可選擇實現的POP3 命令
procedure top;
procedure last;
procedure apop;
procedure uidl;
end;
1. 建立連接
我們可以看到利用了Tclientsocket后客戶端請求建立連接只需下面的代碼。
with ClientSocket do
begin
Host := Server;
Active := True;
end;
服務器端利用TserverSocket,一直在偵聽110端口,若客戶端有連接請求,則ServerSocketAccept事件會被激活,建立起連接。

procedure TMyForm.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
Statusbar1.Panels[0].Text :=
'連接到 ' + Socket.RemoteAddress;
//pop對象初始化
pop:=TPop.Create(nil);
pop.PopState:=init;
pop.LoginResult:=false;
pop.QuitFlag:=false;
ServerSocket.Socket.Connections[0]
.sendtext('+OK ibonc pop3 server is ready'+crlf);
end;

2. 通信
服務器端收到客戶端發來的信息,則會激活ServerSocketClientRead事件,通過ServerSocket的Socket.ReceiveText可以得到信息的內容。

procedure TMyForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var temp_command :string;
//存放接收到的命令行,并做去crlf的處理
begin
temp_command:=Socket.ReceiveText;
//to remove the crlf in command line
temp_command:=trim(copy(temp_command,1,
pos(crlf,temp_command)-1));
pop.ReceText:=pchar(temp_command);
if pop.popstate=init then
if strLIComp(pop.ReceText,'user ',5)=0 then
pop.user
else
ServerSocket.Socket.Connections[0]
.sendtext('-ERR user name please')
else if pop.popstate=authorization then
begin
if strLIComp(pop.ReceText,'pass ',5)=0 then
pop.pass
else if strIComp(pop.ReceText,'quit')=0 then
pop.aquit
else
ServerSocket.Socket.Connections[0]
.sendtext('-ERR pass word please');
end
else if pop.popstate=transaction then
begin
if strIComp(pop.ReceText,'stat')=0 then
pop.stat
else if strLIComp(pop.ReceText,'dele ',5)=0 then
pop.dele
else if strLIComp(pop.ReceText,'list',4)=0 then
pop.list
else if strLIComp(pop.ReceText,'retr ',5)=0 then
pop.retr
else if strIComp(pop.ReceText,'noop')=0 then
pop.noop
else if strIComp(pop.ReceText,'rset')=0 then
pop.rset
else if strIComp(pop.ReceText,'quit')=0 then
pop.tquit
else if strIComp(pop.ReceText,'last')=0 then
pop.last
else if strLIComp(pop.ReceText, 'apop ',5)=0 then
pop.apop
else if strLIComp(pop.ReceText, 'uidl ',5)=0 then
pop.uidl
else
ServerSocket.socket.connections[0]
.sendtext('-ERR no such command yet'+crlf);
end
end;

3. 關閉連接
procedure TMyForm.ServerSocket
ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerSocket.Active := False;
//如果client端沒有通過quit 命令斷連,
則在斷連時要把那些f_dele置為0
if pop.QuitFlag=False then
begin
MyForm.query11.Close;
MyForm.query11.Params[0].Asstring:=pop.UserName;
MyForm.query11.prepare;
MyForm.query11.execsql;
end;
end;
三. 結語

  由于Email系統與數據庫表結構的緊密聯系,筆者沒有寫出各POP3命令的具體實現。相信讀者在認真閱讀了RFC1939之后不難寫出實現函數。現在就動手為你的公司寫一個自己的Email服務器吧! 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 天天做天天躁天天躁| 日本a视频在线观看| 韩国中文字幕av| 92看片淫黄大片一级| 国产黄色一级网站| 日本a级片免费观看| 欧美日韩成人免费视频| 国产综合av在线| 欧美一级黄色片视频| 国产精品无码一本二本三本色| 国产性xxxx18免费观看视频| 中文字幕无码不卡免费视频| 国产精品久久久久9999小说| 色www免费视频| 亚洲第一成肉网| 在线观看18视频网站| 精品无码国产一区二区三区av | 黄www在线观看| 午夜激情福利在线| av中文字幕网址| www国产无套内射com| 国产成人一区二区三区别| 少妇av一区二区三区无码| 国产女女做受ⅹxx高潮| 人人干人人干人人| 在线观看18视频网站| 丰满人妻中伦妇伦精品app| 网站一区二区三区| 伊人再见免费在线观看高清版 | 香港日本韩国三级网站| 好色先生视频污| 男人天堂999| 色香蕉在线观看| 国模杨依粉嫩蝴蝶150p| 咪咪色在线视频| 少妇性l交大片| 999一区二区三区| 色悠悠久久综合网| 精品人妻少妇一区二区| 激情久久综合网| 国产精品乱码久久久久| 国产精品va在线观看无码| 三级a在线观看| 久久视频这里有精品| 国产人妻互换一区二区| 日本999视频| 777777av| 国产乱人伦精品一区二区三区| 亚洲男人天堂色| 日韩欧美一区三区| 成人免费在线视频播放| 天堂av在线8| 182午夜在线观看| 国产视频一区二区三区在线播放| 日本香蕉视频在线观看| 亚洲成人动漫在线| 精品国产鲁一鲁一区二区三区| 免费裸体美女网站| 免费无遮挡无码永久视频| 国产一区二区三区播放| 国产对白在线播放| 一级黄色高清视频| 捷克做爰xxxⅹ性视频| 最近中文字幕一区二区| 成人精品视频一区二区| 国产精品免费观看久久| 欧美在线观看成人| 日韩手机在线观看视频| 一本久道综合色婷婷五月| 久久婷婷国产精品| youjizzxxxx18| 亚洲一区日韩精品| 26uuu成人| 日本天堂免费a| 可以看毛片的网址| 欧美视频第一区| 国产精品igao| 婷婷激情小说网| 欧美一区二区视频在线播放| 欧美精品自拍视频| 国产精品97在线| 一级做a免费视频| 男女激烈动态图| www.日本在线播放| 亚洲激情在线观看视频| 婷婷激情5月天| 欧美又粗又长又爽做受| 久草精品在线播放| 午夜一级免费视频| 人妻av无码专区| 男人添女人下面免费视频| 涩涩网站在线看| 日本欧美黄色片| 日日干日日操日日射| 肉大捧一出免费观看网站在线播放| 黄色一级片黄色| 一路向西2在线观看| 欧美日韩dvd| 在线观看岛国av| 国自产拍偷拍精品啪啪一区二区| 超碰在线公开97| 男人天堂av片| 国产农村妇女精品久久| 日批视频在线免费看| 无码人妻精品一区二区三区99v| av动漫在线看| 欧美性受黑人性爽| xxx国产在线观看| 国产一区二区三区精彩视频 | 青青草免费在线视频观看| 男人天堂999| avav在线播放| 久久免费看毛片| 五月婷婷六月丁香激情| 乱妇乱女熟妇熟女网站| 亚洲国产一二三精品无码| 亚洲国产成人va在线观看麻豆| 国产玉足脚交久久欧美| 992tv成人免费观看| 999久久久精品视频| 久草在在线视频| 欧美牲交a欧美牲交aⅴ免费真 | 美女黄色片视频| 乱妇乱女熟妇熟女网站| 国产真实老熟女无套内射| 午夜一区二区视频| 亚洲娇小娇小娇小| 久久国产色av免费观看| 久久美女福利视频| 久久久久久久久久网| 久草免费福利在线| www.男人天堂网| 日本人体一区二区| 一本久道高清无码视频| 男人天堂av片| 黄色免费视频大全| 久久精品.com| 激情综合网俺也去| 天天操狠狠操夜夜操| 九九热精品在线播放| 天天摸天天舔天天操| 999久久久精品视频| 日韩精品第1页| 波多野结衣av一区二区全免费观看| 免费看黄色a级片| 欧美a v在线播放| 国产精品久久久久9999小说| 制服丝袜综合网| 亚洲小说欧美另类激情| 人人妻人人澡人人爽欧美一区| 久久av综合网| 国产一区视频免费观看| 中文字幕第38页| 国产一级黄色录像片| 很污的网站在线观看| 日韩在线第三页| 日本高清xxxx| 女人和拘做爰正片视频| 性欧美极品xxxx欧美一区二区| 色婷婷综合网站| www.亚洲成人网| 中文字幕视频在线免费观看| 最新av在线免费观看| 国产成人精品视频免费看| 国产三级日本三级在线播放| 日本成人xxx| 可以在线看的黄色网址| 国产四区在线观看| 女人天堂av手机在线| 一级黄色高清视频| 热久久精品国产| 一二三四中文字幕| 日本超碰在线观看| 六月丁香婷婷激情| 日韩不卡一二区| 日本999视频| 噜噜噜久久亚洲精品国产品麻豆| 亚洲一二区在线观看| 欧美日韩国产精品激情在线播放| 吴梦梦av在线| 在线观看岛国av| 精品久久久久久无码国产| 欧美日韩不卡在线视频| 99999精品| 亚洲一区日韩精品| 日韩a在线播放| www.浪潮av.com| 成人免费性视频| 大胆欧美熟妇xx| 蜜桃视频成人在线观看| 亚洲欧美日韩综合网| 九九视频精品在线观看| 人妻有码中文字幕| 精品99在线视频| aⅴ在线免费观看| 亚洲中文字幕无码中文字| 国产日韩一区二区在线| 日本一本二本在线观看| 日本福利视频在线| 99色精品视频|