说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Email 服务器的简单实现-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
Email 服务器的简单实现-Delphi资料

我们知道从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服务器吧!

Paul Graham:创业者如何说服投资人? 【CTO俱乐部深圳站】企业大数据建设案例分享 Gmail新设计影响邮件营销 Fcaebook间接获利 百度高德小米网易杭研讲师登场 SDCC 2013第二批议题发布(图) [开源推荐]JS-Git:一款纯JavaScript实现的Git项目 良心企业Lavabit、Slient Mail相继关闭,美国云安全已死? 一周观察:LXC真的是PaaS的未来吗? [企业开源系列]Google背后的开源力量 合作: “云”潮中淘金的金钥匙 Windows 8.1尚未发布 Build 9471版遭泄露网爆高清大图 Imangi创始人:我眼中的App Store 职业设计生涯:打造世界上最小巧最强大手电 【SDCC 2013】Coding For Fun活动火热招募中! YARN之上的大数据框架REEF:微软出品,是否值得期待? 创建大数据公司之前你需知晓5件事 前途渺茫,考虑出售的黑莓还能找到买家吗? 帮助开发者轻松管理项目的8款在线工具 现代Web应用开发者必备的六大技能 JavaScript异步编程好助手:Promise模式 功能解析:Red语言推出0.3.3新版本 可穿戴?可吞咽!UI和UX的悄然转变 华为刘成:讲述开发者联盟的故事 出尔反尔,Amazon咬文嚼字玩转私有云 创业公司SOASTA:曾帮助伦敦奥运会官网进行云负载测试 金山云进一步聚焦云存储 Facebook公布用户数据:美国移动用户占比78% Zynga开源服务器监控工具zPerfmon 上海海事大学王洁:打造物流教学科研应用云平台生态系统 15个步骤创立技术公司,并收获千万用户(二) HTML5发展慢热 开发者热情不减 NimbleBit孪生兄弟创始人:最后悔没有专注和扩大品牌 网络协议方面的编程,我该学Visual C++还是Visual C#.net? 如何用LotusScript创建一个表单?(进者有分!!!) exchange的测试问题 请大家帮个忙,到哪里可以找到关于http,FTP协议的资料 请问为什么在Debug编译好的Dll,Release版就会报错? 怎么这个问题没人回答,在线等待,一定给分 懂DLL的同志请看过来! 如何得到Windows中用户设定midi输出设备的序号 请问怎样控制数据窗口某列某中数值的字体颜色,给高分,呵呵,请指教 请问qq是vc还是delphi些的呢? 有没有开发IE插件的SDK? 各位大虾请帮忙,简单的vb循环转C++ 急救:::一个关于网站建设的问题 如何在代理中使用LotusScrip创建表单? to:anybody1 thanks Delphi6.0中怎样使用OpenDialog?(一定给分) 本周五3。15是giko(孤独的老鱼)的生日! 用bcb编写cgi程序 关于权限的问题用SQL语句实现?急急!!! access violation 问题 小弟的登陆程序还有点问题,请各位帮忙解决。 听说能自己给自己加分? ◆◆◆奇怪,关于ZIP 压缩文件??? 怎么在运行时为picutrbox控件内部增加其他控件?还有问题解决了,分怎么给? 如何恢复ASP的组件服务? 又一个C/S方式下的编程问题,不明白呀?为什么呢?怎么做呢? 关于弹出菜单的问题,请赐教! 请您指教100分。 程序是中文的,可以在日文的 WINDOWS 98 上正常显示 , 及运行吗 ? 让对象在窗体内来回移动,当移动到窗体边界又能反弹回去,这段代码怎么写? 怎样把其他应用程序的主菜单变灰? 大学本科,,函授,自考,夜大,远程教育,自学!哪个硬! 关于TNMUDP不能接收>2048数据包的问题? 关于sizeof()函数的疑问? 请问关于O的设计问题? 在sql server 2000中如何创建一个database 程序是中文的,可以在日文的 WINDOWS 98 上正常显示 , 及运行吗 ? 有没有用过zope的大侠,谈谈感受吧:D LNK4089是什么原因引起的? ADO中,如何获得连接字符串? 请问关于OO的设计问题之二? 语句的错误? 换个id灌水的感觉真爽 一个最简单的存储过程 关于空间的问题 资源文件是什麽,怎麽使用? 请问怎样将下拉数据窗口中的某一行设置为当前所显示的行? InstallShield 如何做个 unistall 的 shortcut 到菜单里 scandir怎么用? 怎样从CMainFrame中调用DOCUMENT类中的PUBLIC成员!谢谢! 在线成中如何更新一个对话框 亚硝酸钠,红曲红,山梨酸钾作为添加剂对人体有何危害? 请问:易挥发成无味气体的试剂有哪些?( 关于电位滴定法是适用范围请问电位滴定法适用于微量还是常量测定? 食品添加剂VC与亚硝酸纳混合用可以加色吗 铁离子与碘离子为什么不生成碘化铁 与普通滴定分析比较,电位滴定法更适用于哪些溶液 谁知道醋泡鸡蛋的做法,具体点 求学探诊化学必修二答案! 电位滴定法和分析化学中的滴定法有什么相同和区别? 请问有机碘的性质及其稳定性?能否耐高温? 铁和碘反应生成什么是三价铁离子还是二价?为什么? 电位滴定法与酸碱滴定法的区别?希望具体点的答案 要考试了 希望从几个角度分析 我国有650个杜鹃花品种,占全世界杜鹃花品种总数的16分之3.全世界杜鹃花共有几个品种?(得数精确到个位) 化学必修二,求13题答案~ 什么化学品有剧毒死人 我国野生的杜鹃花很少有病虫害,而城市公园人工栽培的杜鹃花常有严重的虫害.请你分析一下根本原因很可能是 氯气与碘化亚铁反应生成氯化铁和碘化铁,此反应存在吗?其中的氯化铁为什么不可能存在? 什么化学品能容在水里且少量剧毒 我国的花卉品种丰富、百合花约有40个品种、杜鹃花的品种是百合花的17倍,杜鹃花有多少个品种? 碘化铁可否由化合反应制得 无水乙醇可以直接烧吗?我买啦一瓶无水乙醇,想灌到酒精灯里烧,可以直接用吗,如果加水的话,要加多少才合适? 浙教版八下的科学题【有关化合价的哦】某种锂电池中金属锂与二氧化锰(MnO2)反应后生成LiMnO2,同时释放出电能.在上述反应中锂元素的化合价从+1价转变为多少价?锰元素的化合价从+4价转 1molX能与足量碳酸氢钠溶液反应放出44.8LCO2(标准状况),则X的分子式是A.C5H10O4B.C4H8O4C.C3H6O4D.C2H2O4 电位法测水溶液的PH的原理是什么? 1,2-二氯乙烷常温下易挥发么?危害性大么?正常的化学合成实验,需要用大约十几毫升,危害大么?操作需要注意什么?我每次只需要用8毫升,操作时候应该注意些什么? 柑橘产自中国哪里 A,山东省 B,浙江省 C,海南省 D,西藏自治区 E,新疆 电位测定法的依据是什么 哪里有映山红看 欧洲西部地中海沿岸盛产什么? 电路理论,用节点电位法以及叠加定理求解β=2 到哪儿看映山红 三碘化铁很难合成的原因是:A.铁离子有较强氧化性,碘离子有较强还原性B.三碘化铁受热易分解C.碘和铁不能直接化合D.三碘化铁溶解度大,难以提纯请说明理由. 求 酵母粉和碱粉加醋后的区别 求 《杜鹃花》 离开黄龙沟已经两年多了,我却经常想起那万绿丛中的杜鹃花.  那时,每当花开时节,我都要上山去采杜鹃花.有一次,我看见一位老爷爷正把一束杜鹃花放到“革命烈士之墓” 什么是焦亚硫酸钠? 有什么化学品无色无味 打火机燃料油用酒精行不我在打火机里放酒精杂不着啊 映山红阅读解析1.我爱家乡的映山红.它是一种很美的花.这花( )外表给人一种淳受,( )还可以吃,酸酸甜甜的,诱人得很.2.星期天,我和几个小伙伴一同到山上去采映山红.来到了山上【 】一 欧洲西部平原主要分布在地中海沿岸对吗 金属与酸反应,如何判断金属中的杂质 映山红阅读文答案 有关碘化铁(三价的)的问题碘化铁(三价的)为什么在水溶液中不存在?虽然说三价铁的氧化性大于碘离子,会将碘离子氧化成碘单质.但是银离子的氧化性比三价铁的氧化性更强,为什么碘化 碘的基本性质有具体化学方程式,越具体越好 能告诉我是为什么吗QAQ 醋会冻结吗? 碘的性质碘难溶入水,易溶于CCl4,因此可以用CCl4将碘从碘水中萃取出来但是点难溶于水怎么会出现碘水?还有就算是能萃取,那也是得到了碘与CCl4的溶液怎么能得碘? 挥发最快的化学试剂能溶于水且溶水后还能挥发 醋加什么会结冰?化学的 碘的理化性质 映山红杜鹃如何养护 醋在周围环境气温多少度时会结冰 碘气的性质萃取会萃取碘气吗?碘水挥发吗? 必修二生物.为什么答案是D不是A 粮食酿造的醋会结冰吗也就是说米醋会结冰吗 在同样的温度下为什么有的醋结冰 有的醋不结冰 红曲红 和亚硝是什么?对人体有害吗?我看我买的包装袋的熟食里有红曲红 和亚硝请问是什么?对人体有害吗? 请问哪些化学试剂易挥发出有机氟气体? 什么和醋反应会结冰 食品添加剂着色用的红曲粉与保健品的红曲胶囊是一样的吗? 请问:易挥发成无味气体的试剂有哪些?( 西班牙是属于西欧还是南欧?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘