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

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服务器吧!

在发布站点前,Web开发者需要关注哪些技术细节? TOCC、中航信、高德、北斗平台重磅专家登场 邀您共享ITS技术盛宴 腾讯大数据之TDW计算引擎解析——Shuffle AMD APU14 BEIJING技术创新大会精彩看点 这是云整合时代开始的节奏吗?Rackspace考虑退出 一周热点:如何使用15美元每月的机器实现百万文档检索 黑客获取数据信息的目的和进攻手段及应对之策 Surface Pro 3遭大曝光:799$起、四色可选、12寸屏幕 当软件遇上设计,浅谈敏捷UX VS.精益UX DIY“物联网”——自己动手处理传感器数据 AMD成首家X86+ARM双架构计算 欲寻新蓝海 锤子手机发布:Smartisan T1与其背后的开发团队 第六届中国云计算大会在北京隆重举行 替代笔记本的Surface Pro 3:800g、9.1mm,极致轻薄 PWorld2014:畅谈企业软件向“大平台”+“微应用”变革 微软公司全球资深副总裁张亚勤:云计算引领互联网物理化 亚马逊网络服务全球市场副总裁Ariel Kelman:亚马逊AWS云服务推动创新 终超苹果,谷歌成全球最有价值品牌 高通业务拓展总监沈周全:以软件为基础建立差异化优势 设计你所需要的,而不是你想要的 疯狂谷歌建广告天网:电冰箱、汽车仪表盘、恒温器、眼镜和手表 开发者眼中的编程语言…… 寻下一突破口?黑莓推Project Ion项目,正式进军物联网 无人驾驶汽车真的要来了:飞思卡尔研制视觉芯片 支持物联网开发! Qt发布5.3版与嵌入式企业版 5月23日:Java已经19岁啦! Google发布Dart1.4版本,新增Observatory工具 《近匠》Mixtile:跑在盒子中的嵌入式平台 从研发、平台化到营销:移动时代,汽车厂商如何升级? CTO俱乐部“云计算创新与实践”沙龙:云计算的发展趋势与那些“坑” 一周消息树:大型网站系统与Java中间件 IIS如何控制目录访问权限? asp.net 我不懂的问题,不是很难啊。 有关mysql出错的问题?? 牛人们,帮我看看~~~~~~ 调试INTERDEV中的PROJECT? 请问 GetCellDigital返回值有误 目录树记忆属性实现的讨论 关于用户自定义类的问题 自制控件问题 静态链接库中的资源 Xml的查询定位问题? 小高求助! 关于JAVA文件执行时出现的错误 如何在Datagrid中取得当前记录的某字段值? 如何取得下拉菜单项? 目录树记忆属性实现的讨论 我想去中国网通申请域名,他们是不是很吊,有没人用过啊 Help 删除一条记录?? 在研究软件加密 “咱们把最好的粮食给城里人吃,又进城帮助他们盖起了高楼大厦,他们为什么还瞧不起我们呢?” 老板今天叫我签合同 有关于TImage的图像显示速度 怎样让 Title 的显示时间延长????????? !!!!!!!!!格式化数据列 怎么这么慢啊 请问:如何在打印之前设定该次打印纸张的大小(很急,老板催货了,帮忙顶一下,谢谢)? 有什么办法可以把class文件反编译回java文件? 如何写到文件? 自己写一个函数,把2,3,4加到1,2,3中去,不重复 Netscape打印中文网页为什么不成功? 英文XP中装了东亚语言包,能显示中文了,如何输入汉字呢。。。。 接到一个电话 哪位大哥大姐教教我啊? Dll如何同控制台程序通信 RedHat Linux7.2下如何挂上RealTek8139网卡驱动????高分相送哦!在线等待!!! TreeView问题 求register_globals = On和register_globals = Off的不同用法(原代码) 斑竹,我是因为升级才散分的,有个穿红裤衩的支持俺了…… 一个新手的加急求救!谁先回答,就先给谁份,希望大家说的详细点! 写xml文件的不完整的问题 关于esqlc的unload 的问题。 关于方法覆盖,在线等候 一个实际开发中经常令人头痛的问题 在线,急,谁有3D MAX的下载地址?高分! 推荐IT公司调查 监测表记录字段变化情况 如何能够得知table中的字段是什么类形?(如字符,数字,浮点等) SUN认证是不是“纯”English的? 在windows 2000下,如何在perl脚本中,执行另外一个perl脚本文件?? 现在我们有3、4二氯硝基苯这种材料,请问能生产出几种产品,需要和哪些材料反应呢? 防夫是什么意思 求用马哲分析时事的论文 在一个密闭容器内,植物进行光合作用之后生成了氧气消耗了二氧化碳能否再利用生成的氧气进行有氧呼吸如果是不就意味着循环利用了吗,那样的话植物能存活多久,回答好的重重有赏,哈哈 宜夫是什么意思 第二题,我查了百度的一些答案,看不懂. 以“夫”和“泣”为例,分别探索它们的意义 依据浙江省暑假作业语文P3参考回答 夫起大呼中夫是什么意思 关于理论和时间辩证关系运用理论和实践的辩证关系原理说明科学发展观与我国全面建设小康社会的关系论述题:要求标准答案或者完整的参考答案! 汉字与理性“夫”的意义 较夫是什么意思 这是一道马哲题目,关于时间的性质?利用一台粒子加速器,让两束原子在一个圆环轨道上做高速运动,发现这些原子自身的时间确实比外界时间慢了.该实验证明了作为物质运动存在形式的时间 磁铁为什么会将电池的电力吸走?是因为什么原因会造成这种现象? 与夫为纲是什么意思? 要考马哲啦,请知道的同志回答一下:如何理解时间是人的发展的空间?大约200字. 动物避暑 以下关于会议记录与会议纪要说法正确的是A.会议记录是会议全过程的实录,发言的内容依照自然顺序展开,一般不作省略者概括处理B.会议纪要必须体现出指要性,对会议的内容有说该概括C.在 电表怎么看 红色 网络类型里的“外A”“内C”什么意思? .在下列关于会议纪要特点的说法中,正确的有( A )A.纪要的性质取决于会议的内容性质与印发会议纪要的目的要求B.会议纪要有交流会议信息、介绍经验的作用,但没有约束执行的效用C.撰 倒着读和顺着读意思一样的词语,写3个 C/C++ class MyString{private:char *str_;char *MemAlloc(char *str);public:MyString(char *str="");};char* MyString::MemAlloc(char* str){char* tmp = new char[strlen(str)+1];memset(tmp,0,strlen(str)+1);strcpy(tmp,str);return tmp;}MyString::Mystring(char 多项选择:关于会议记录与会议纪要说法正确?以下关于会议记录与会议纪要说法正确的是?( )A.会议记录是会议全过程的实录,发言的内容按照自然顺序展开,一般不作省略或者概括处理B.会 一个词语正着读,倒着读,意思一样,有哪些? 产品安全类别是c类什么意思 通过肺部的气交换由暗红的什么血变成鲜红的什么? 正着读和倒着读意思一样的词语比如合适-适合 妊娠C类什么意思 监控电源正极负极怎么接 带8个监控头子 硫酸铜精粉的成分是什么?其中硫酸铜的质量分数.想做实验. 贵夫什么意思 监控摄像机为什么只接一根正极电源就能工作?12V直流电只接上正极就能工作,负极不接都没事,倒过来接就短路,工作不正常了 想入手一只水族箱,是森森水族箱好还是佳宝?近日箱入手一只水族箱,但是不知道是森森水族箱好还是佳宝好,或者别的什么牌子!请各位大侠赐教! 家夫什么意思? 监控电源上那个正极负极可以随便接吗?正负极都有三个接口,带8个头子应该接哪个,12v15a的电源 森森302过滤桶 声音大么 这个桶怎么样 夫教什么意思 保温杯里面那层银色是什么材料 《生命生命》课堂观察记录“教什么” 今夫不受之天的夫的意思 转椅 转第几声 勉强 强第几声 两块同型号手机电池,铜片负极对负极分出一根线 正极对正极分出一根 然后焊接USB口 插上数据线可以充电吗已经搞好了现在正在充电,正负极 分出来一根线是USB口,一个是万能改装充电, 热的快有220V 110V的区别吗 通常用的220V的热得快可以直接用在110V电压上吗?安全吗 110V可以直接用在210V 以下正确描述面向对象特点的选项有()a封庄 b继承c多态 USB里的红 绿 黑 白线接成1个正极和1个负极的该怎么接? 初中数学统计请帮我解释一下第3问怎么回事.谢谢 (多选题)在C#程序中,有如下代码,则下面选项中说法正确是()public class A{}public class B:A{}A a=new A();B b=new B();A.表达式b as A的值为nullB.表达式a as B的值为nullC.表达式b is A的值为trueD.表达式a is B的 这个usb线哪个是电量正极 哪个是负极 子夫是什么意思 "强人所难"中,"强"读几声呢? 3D眼镜中,红蓝和红绿有什么区别?买3D眼镜的时候会发现有红蓝 红绿两种,有什么区别吗? 看夫相子的“相”字是什么意思 如何理解时间和空间的有限性和无限性 和红蓝、红绿眼镜有区别吗? 现在家用电器越来越多,冬天里开的电器更多了,我怕家电短路引起火灾,那家财险能负责赔吗? 命限要早夫晚子? 强人所难中的强读第几声?强占的强,和记载的载呢? 3,4-二氯硝基苯除了可以生成苯胺,还可以生成什么? 祭夫益子什么意思 怎样理解时间和空间的有限性和无线性的辩证关系 这是关于马哲的问题 日本海上自卫队一军官因非法使用兴奋剂委内瑞拉总统称查韦斯音容出现在委地铁美国最新隐身驱逐舰下水 明年秋季开始消息人士称叙化武生产设备销毁工作如期纽约提高香烟禁售最低年龄 未满21不研究证明蝙蝠系非典传播源 病毒可由动小狗被饿三周吃伞充饥 其主人不愿救治男子扮高富帅专门诈骗按摩女 谎称投资巴西里约热内卢社会游民多 5000余媒体曝美全球监听地图 澳大利亚是美监近3成日本大学毕业生3年内离职 疑被美国艺术家创造“糖果肖像”庆祝万圣节法国一名抢劫犯曾为iPod及8欧元抢韩媒:中国学生“弃日择韩” 赴韩留学俄罗斯一科技园项目涉嫌违法 或致数百新10英镑钞票印简 奥斯丁头像 被批伊朗或取消向巴基斯坦供应天然气巨额合乌克兰加入欧盟协定签署期或推迟到20女子坚持每天喝3升水 4周后外貌似年西班牙首相关注美监听行动 称将听取情法国将实施冬季禁逐令 拖欠房租者也可元首被美监视拉美大国震怒全新爱丽舍成都车展重磅登场新X1探索版正式发布轨交11号线交大站 可漫游“钱学森六一健康全新国产RAV4上市战力大涨留学生受骗挨宰的背后群众才会真给你提意见编者按沪滇志愿服务接力“女村官”的最美乡村梦一幅徐徐展开的现代宜居画申城将推进“重特大病保障机制”养 女六一博士信箱留学申请季,为您量身定制留美方案两成韩国青年可能终身不婚自由贸易区设立,写字楼迎来价值井喷欣赏“歇后语”新帕杰罗·劲畅20.88万元起售“僵尸帮帮车”挪窝
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘