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

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

移动周报:两岸三地在线编程学习网站大搜罗 有道周枫和他的“放养”团队 看IE11如何助力AAF推动公益事业 SUSE总裁Nils:将SUSE Cloud 2.0打造成“零影响的云安装程序” Windows 8之父Steven Sinofsky:2014年科技界的十大趋势 电视盒子还没智能化?看Fan TV们怎么玩 畅游启动“必赢计划” 十亿巨资代理优质产品 数据控使用Hadoop的三种最常用方式 值得创始人学习的五大企业文化管理方式 圣诞节快乐:来自程序员们的问候 宏碁任命新CEO Jason Chen:曾任职英特尔14年、台积电8年 史上第一次越狱发布会与Evad3rs太极助手罗生门 新东方在线CTO曾明:已用Cocos2d-html5开发出150余款产品 Facebook 2013年的9个开源项目 开源力量公开课2013年度庆典:我们的开源项目 看雪学院“走进企业看安全”活动走进安全管家 视频+PPT:苹果iOS7 Tech Talks大会演讲内容 iPhone 6和Galaxy S5暂不会采用弯曲屏技术 当程序不工作时,开发者常用的借口 携程技术副总裁叶亚明:三次重大技术改进的故事及背后原因 Google抛弃C语言,采用Go语言重写Go编译器 jQuery Mobile 1.4.0正式版发布,着重性能改进 IBM收购Aspera加速大数据传输 各式各样的极品程序员,你属于哪一种 Google员工离职前必做的14件事情 GitHub上最火的开源项目及编程语言是什么? 2014的12个大数据趋势:Hadoop继续升温,R将进入主流 研究称三星手机可能存在安全漏洞 初创IT公司里开发者最容易犯的九种错误 还有多少开发者在为IE6做兼容性测试? 解读华三“新IT易之道”理念下的云计算和数据中心 一个关于多进程udp连接的重发的问题 怎样把金钱变量转换成字符串变量? 有人知道如何在application中取出拨号地址的吗? 这不公平!!!!!!! Delphi 指针问题,请大家帮忙! web assistant怎么根据数据库中的数据生成一个页面?那个页面要我自己的样式? 大家帮我看看错在那里!谢谢! 请问有没有用自己的机子作服务器的? 帮我看看代码 日志钩子的安装问题? 如何使用。MDB文件 由于上一题回帖子的人数众多,导致分数不够,所以再开一帖!继续!关于用vb进行文件的读写问题! 怎样在数据库中输入了许多条记录后, 一次性存盘成功? 改变光驱盘符?很急很急 在Oracle中怎样加已经存在的数据文件? 我想请高手帮忙 !! 请问目前那一本参考书对DELPHI初学者有很大提高? 一个关于udp重发的问题 如何在delphi程序里调用vc写的exe执行文件。 如何将query中的内容输出到文本文件,然后还能将该文本文件再导入进来?急急急!!!!!!!!!!! 急急急!!我的计算机找不到硬盘了45分 如何求任意多边形的重心 紧急求助:请问java有没有比较丰富的多媒体控件?比如录音的控件??? 急急急!!!我的计算机找不到硬盘了,45分 如何把一个字段的内容求和,然后把结果存入另一表! 请教,怎样把一个记录数组用VB读入ACCESS 2000数据库中? 关于货币类型的问题? the script too large ????????我快疯了。 什么地方有Sybase与Oracle的比较资料? 急急急!!!我的计算机找不到硬盘了,40分 问一下大家 复活节彩蛋 win2000 professional下如何配置weblogic6.0 jsp和javasript如何通讯? 急!!!如何把'¥100'字串转化为浮点型100.00 用OleContainer1将一个WORD文档存进数据库后如何将它从数据库中取出??? 关于SNMP的问题(请高手回答,送40分) 谁想过要戒水?戒成了吗?又渴了吗? 我用在各种机器上使用Win2000,从来没有down过, 真是太奇怪了??? 请问如何确定操作系统系统是中文的还是英文的? 向外国用户发注册码时候应该说些什么,才能让别人觉得你比较专业? 如何捕获ADO的异常信息 struct结构的数据存储是用的什么顺序方式呀? 能介绍几本关于BCB的适合初学者阅读的书吗? 高手进来,struct结构的数据存储是用的什么方式呀 高分!高手请进!!! Newton 有关StoredProc的 各位大虾进来看看,Debug时的错误~~~~~~~ First-chance exception 和 User breakpoint ,帮帮我啊!!! 虽然我也回复没有分,但有意思的帖子,但我对分数高的帖子更有热情,我是不是很势利?? 我的服务器是unix 英语有哪些标点符号 英语翻译我想写一封信给Daniel,不过我的英语不行,请帮我翻译一些句子,请不要发在线翻译的结果给我,1 哈利波特系列是我最喜欢的书之一.读书的时候我的思绪在奇妙的魔法世界游走,但在看 联想笔记本键盘字母变数字? 英文里为什么很少用标点符号?印象中括号,引号,破折号都很少见,书名号更是根本没有,常用的只有逗号句号和问号,偶尔能看到个引号.这是为啥捏?3Q 英语翻译新年期间收到叔叔的一封邮件,内容是:叔叔们准备寄700美元回家乡给我们过新年,但是到目前为止,我们并没有收到关于这700美元的任何信息!在发这封邮件之前,我已经发过两封邮件 下面的字母各代表什么数字?(不同字母代表不同数字.)a 0 b c 3 - x 7 2 y =7 7 7a=?b=?c=?x=?y=? 英语翻译英文句子里电影名字是用《》书名号括上,还是用“”引号括上? 英语翻译Hello,My name is Loyce Agurma,I came acrose your profile hi.baidu.com I felt it and decide to send you a massage,to ask you for friendship .you know having a prophesy of love over someone there most be odds around the,but no matter the od 下面算是中相同的字母代表相同的数字,不同的字母代表不同的数字.每个字母各表示什么数字? 你每周给你的朋友发多少封电子邮件?英语怎么写? 填写标点符号, 如何写英文祝贺信 英语单词email的用法英语单词“email”的具体用法 标点符号填写1雨的力量在于它可使一望无际的黄土高原转眼变得沟沟壑壑()混乱不堪()而知识的力量则在于它可改变命运()扭转乾坤(),缔造美好的未来.2不要在光线暗的地方看书( 这封信怎么写?英语Contact person是 Julie Murphy,公寓名字是Medical Center Apartments.它有三种,1 bedroom,2 bedroom和3 bedroom,我想选这个3 bedroom,住6个人最划算的这个. 发电子邮件的英语单词 填写标点符号 字母找规律1、BEH,ELM,LN( )2、CFL,FKP,KR( )3、KFP( ).DML( ) 4、ELN( ).ADG( ) 英语翻译Hätte Interesse an diesem Tablet.Meine Frage wäre:Kann man eine 32 GB Karte dazu bekommen.Dann gibt es dazu noch eine passende Tasche.Haben Sie diese vielleicht auch zum Verkauf.Wenn ja,wie teuer?Wenn man 2 Tablet-PCs kauft,best 问一个标点符号书写问题如果用格子信纸书写到每一行还有一个空格时,这时正好这句话还差一个字,如果加上句末的标点符号就需要两个空格了.通常遇见这种情况下是不是这最后一个空格就 英语字母找规律A,S,D,F,G,H,J_,_.请问该填什麽?规律是什麽? favourite 在美式英语中怎么拼写 名信片的英语怎么写 看字母 找规律ABAABAAABAAAABAAAAABAAAAAAB.按以上的规律,那么前2005有几个B “电邮”用英文怎么写 英语比赛,要写一篇英语作文,布置怎么写英语信. 我想给字母找规律根据提示写字母A D G D I N I P ( ) 这封英文信如何写?由于某个客户的订单量太少,老板决心停止与其的发展.现在要写这样一封信,委婉的表达该意思,我该如何写是好?50分悬赏,好的话再酌情追加. "英文怎么写?你...以上英文怎么写? 找规律填字母.(1)K F P () (2)E I N () A D G ()D M I ()(1)K F P ( ) (2)E I N ( ) D M I ( ) A D G ( ) 谢谢你的回信.以及你对我的家人和公司的关心.我们都很好,希望你也很好.这么长时间没有联系,我感到抱歉,因为近来工作实在是太忙了.很期盼你来到北京观看08年奥运会,相信那一定是一次让 英语信怎么写 During the summer holiday there will be a new schedule.C 1 for meal and l 2 service hours and for bus schedules will appear on the wall outside the dining room.We are making weekly film and concert schedules.They will a 3 each Wednesday outside the l 原文:照片收到.不知你现在可好,奥运会期间有没有来北京?这些照片是我在杭州西湖拍的,西湖,那里很美,是人间天堂.你还会来中国吗?祝愿你一切顺利!吻你漂亮的女儿. 《信我 》的英文怎么写 潮州话数字1-10和26个英文字母怎么读?和普通话发音不同的请注明读音,0,2,5,10怎么读?用汉字表示出来好吗? 求助写封英文信假设你是李华,你的朋友来中国玩,请写信邀请他来你家乡玩,用英文写,活动内容有游泳,跑步,爬山,吃海鲜,交通坐飞机,机场有45路车,到最后一站下,会去接他 我喜欢你 你信么英语 (英语题)根据首字母填空(10题)1.Monica h_____ three books and apencil case.2.Do you h_____ a baseball bat?3.Let's p_____ soccer.4.That's _____ interesting.5.I don't w_____ TV in the evening.6.How do you s_____ pencils?7.There are so 中文意思如下:收到你的信很高兴,我看了你的相册,真羡慕你走了那么多的地方,每个地方都留下了很多故事和回忆吧,真好!真的很希望我也能早点去你走过的地方看看.你在家平时都做些什么 我说我喜欢你,你信不?英文怎么翻译 英语首字母填空 急! 所有空都得填出来(数清了,是10个空)"Be careful" is used very often in China to show care f______ others. But in Britain it sounds like giving an order or w_______. You could say that to younger people but n_____ 谁能帮我写英文信信的大致内容是:我叫XXX 我是那个中国孩子 很高兴能与您相识 并且成为一个临时家庭 我的英文不是太好 我想您已经了解 很抱歉我迟来的问候 请带我向您的家人问好还有 见信速回用英语怎么写 衣服码号有数字的,有英文字母的,到底多大的号对多大的码? 一份写给父母的英文信内容是我在大学中生活个方面的增加了,而且物价也在涨,等原因.希望你的父母能给你增加生活费. 他在信中写了什么吗 用英语怎么说 用户名由6-20位长度的数字,英文字母和标点符号组成,至... 中文标点和英文标点转换有没有快捷键转换中文标点和英文标点?而不用再去输入法图标上点击. 昨晚我写了一封信(求英语翻译) ORACLE SQL 获取26个大写英文字母A-Z形如:字母ABCD……Z不用union的方式 输入的中文标点符号与英文标点符号有什么区别?中文标点符号与英文标点符号主要是什么功用. 英语信怎么写啊 caxa如何将标注中的数字尺寸换成英文字母?我选编辑-文字内容,经常改不了,还是数字而不是字母,为什么? 怎样切换中文标点和英文标点? ( )the( )( )English?翻译:这封信是用英语写的吗? 笔记本键盘上的英文字母为什么会变成数字?有时候玩着玩着这些英文字母J I O L M U 都会变成数字 一些数字34560 就会按出来是#¥%……这样子为什么会这样?打问号还会变成+ 为什么 笔记本上 关于英文里的标点符号今天上课就是讲这个..听不太懂....不是句号实不实心的问题...是想问在句子中分段的用法.. 英语翻译MIKE JASON先生您好:在北京的机械展览会上,有幸认识您十分的高兴.我公司是经营脚轮,履带板翻新等项目.希望能与贵公司合作.下面是我公司的联系方式天津XX脚轮厂地址:天津市河东区 华硕笔记本键盘的字母变数字了,怎么回事我按键盘的u i o j k l m 是数字 4 5 6 1 2 3 0 请问下是怎么回事啊?怎么才恢复得过来呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn