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

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

独立开发者的自白:Objective-C最糟糕的13件事 回顾Google这一年——Android篇 百度手机卫士正式发布 “防吸费”功能全球首创 2013年平板电脑市场竞争回顾 Apple太阳能数据中心进展顺利,但却在税负减免上备受争议 一名开发者的年度回顾 智能手表Pebble明年初推应用商店 开发者今日起可提交应用 够快科技推出企业级云存储服务“够快云库” 项目开发中,质量和速度哪个更重要? 亚马逊AWS落地中国,云计算产业圈集体发力 Node.js 2013年大事记 【开源推荐】ThinkPHP:大道至简,让Web开发更简单 IE11中的WebGL探秘:渲染速度超Chrome 数据驱动智能:百度在计算广告学领域的技术突破 UX设计师和软件开发者,谁将是2014年的老大? 爸爸去哪儿:开发知名题材手游压力山大 多平台同步 谈IE11全新功能 高通副总裁沈劲:移动是产生变革的强大原动力 高性能、高流量Java Web站点打造的22条建议 云巅:第三代虚拟技术+搜索引擎+乐高理念打造分布式桌面云 Intel:从“芯”构建下一代数据中心 WhatsApp:50名员工,月4亿活跃用户,日160亿条消息和5亿张图片 三星Galaxy Gear智能手表失利 需改进的8个方面 IE11全新的F12开发人员工具详解 研发周报:为什么开发者担心将代码公布 Hadoop YARN的发展史与详细解析 一周消息树:Firefox OS会不会成为下一个Android PhoneGap 3.3.0发布,支持Android 4.4 KitKat 移动周报:两岸三地在线编程学习网站大搜罗 有道周枫和他的“放养”团队 看IE11如何助力AAF推动公益事业 如何给回答我问题的人加分? 如何在mshflexgrid中输入字符 如何改变当前打印机的纸型? 请问在WINXP下的怎设置IIS? 我在用 DataReport 控件对数据库进行输出时 为什么运行时总是弹出选择数据库的对话框? 这个数据库连接不是已经设置好了吗? 怎样取消textbox的凹凸感? 为什么在IE6 中使用Ctrl+Shift组合健得到的连接是http://www.china.co.cn 为什么总是出现Invalid BLOB handle in record buffer错误 大家晚上好,怎么让我的程序里有一小块是网页的内容呢?(全部家档!!) 关于Database和Session的问题!火急!(快乐的程序员) jsp+mysql如何在linux上配置 有知道黑龙江高程查分方法的吗????? *******我要一个这样的类:显示淡入淡出的菜单(最好还能有半透明的功能) *************** 特急,各位帮忙。怎么样在字符串中包含'(单引号)? 高分求助用paradox数据库保存JPEG图片的代码,我试过网上好多都没成功。markoni@21cn.com 吴文智、袁飞、Jinesc、Jneu、Amoon、ttyp、icevi、progame 快请进 请教一个表与表之间比较数据的问题,由于数据量大,造成事务不够,请教解决方案 execcommand的使用方法求救。高手请进,一定给分。 我的时钟怎么回事? Matlab论坛 打印机的取消按钮 dbgrid中当某个单元格失去焦点时触发什么事件? 关于Database和Session的问题!火急! yanxu1 学习unix下的c编程,该如何学?请介绍方法,资料什么的--我对unix和c都还熟悉。 打印机死机作何解?????? 我是新来的,请各位大哥、大姐们多多关照!!!(有内容) 再次发问关于sql server7的问题?? SQL SERVER中的一个触发器的问题!!! xml里有什么method可以取得子节点在父节点中的位置(序号)? please help me 怎么样才可以把系统存储过程的结果写到结果集里? 如何声明和使用自定义对象(如:Tdataset)的事件(beforecancel)?? 一个奇怪的问题? 各位兄弟,谁知道哪里有pb7的下载? 天呐 我提的问题从来没人回答 SQL Server小小问题 请问那里有DELPHI第二张光盘下载! 如何是使用describe来获取datawindow中的带区参数? 谁有早期的TeeChart5.ocx,文件大小为2,576,384,发行日期在2001-06-17号以前的,我这里有个crack软件,但是新下载的不行,所以重金寻求!!! 请问C语言中有字符串查找函数吗? 请问如何动态的改变应用程序的图标,一定给分 Query主从表编辑问题,从不丢失! 急急急!!!! 高分求禁止IE的自动谈出的广告,有个软见也行,或者告诉实现方法。请告诉下载的网址。 打印一些清单在delphi中用哪些控件比较好? 如何打印到文件 如何得到WINDOWS的拼音字库 如何在BCB中进行SDK编程? 一个简单关于对话框的问题------->> 用asp将图片插入数据库,到底错在哪?苦恼啊!以前这个也通过了(win2000server+Sql7.0)但...(高分!!!!) 为什么我在Access2000的mdb中只能最多得到一条记录? 一堆煤,第一次运走了总量的4分之1还少3吨,第二次运了余下的3分之1还多2吨,第三次运走了在余下的2分之1,还剩10吨,这堆煤原有几吨? 某大楼地上共有12层,地下共有4层,某人乘电梯从地下3层地上7层,电梯一共升了多少层?要列式 一个长方体,它的高和宽相等,若把长去掉2.5厘米,就成为表面积是150平方厘米的正方体.长是宽的几倍? 连接A,B两城的高速公路,全长120km,在AB上建有两个收费站C和D,已知AC:DB=11:1`,一辆小汽车从站行驶3/4h, 一个长方体,它的高和宽相等,如果把长去掉2.5dm,就是成为一个表面积150平方分米的正方体.原长方体的体积是多少立方分米? 一个长方体的高和宽相等,若把长去掉2.5厘米,就成为表面积是150平方厘米的正方体.原来长方体的体积多少 地下停车库入口坡道多少米? 方舟子靠什么赚钱 一个长方体,它的高和宽相等,如果把长去掉2.5dm,就成为一个表面积是150平方分米的正方体.这个长方体的长是宽的几倍?要算式 为缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了该地下停车库的设计示意图为标明限高,请你根据该图计算CE.(精确到0.1m)图 一个棱长1cm的正方体拼成长方体的表面积事多少平方厘米? 一个长方体去掉俩分米后,这个长方体就变成了正方体,表面积就减少了48平方米,原来长方体表面积是多少? 转基因大米对人有危害吗 把3个棱长是1cm的正方体拼成一个长方体,这个长方体的表面积比三个正方体的表面积和减少了( )平方厘米快 来此购~急 5.长方体体积的计算方法一个长方体,它的高和宽相等,如果把长去掉1.6分米,就成为一个表面积216平方分米的正方体.原长方体的体积是多少立方分米?6.正方体体积的计算方法把一块棱长6cm的正 数学题:为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意%C地下停车库坡道口上方要张贴限高标志,来告知停车人车辆能否安全驶入,为标明限高, 某大楼地上共有12层,地下共有4层,8米,请用正负数表示.这栋楼每层的楼 转基因食品的好处有那些举例说明!最好短一点!举例说明!举例说明! 转基因大米有什么不好 某大楼共有12层,其中地下有4层,请用正负数表示这栋大楼每层的楼层数( )某人从地下2层乘电梯到地上8层,电梯一共开了几层? 转基因食品有什么优点? 数学题为缓解“停车难”的问题,某单位拟建造地下停车库,设计师提供了车库入口设计示意图(下图),按规定为缓解“停车难”的问题,某单位拟建造地下停车库,设计师提供了车库入口设计示意 我国的转基因农作物的了解 转基因食品有哪些好处? 为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意为了缓解“停车难”的问题,某单位拟建造地下停车库,建筑设计师提供了地下停车库的设计示意 高速公路建设正在招标,现有甲乙工程队竞标.若甲乙两队合作24天可以完成,需费用120万元;若甲乙两队合作20天后,剩下由乙对做,还需40天才能完成,共需费用110万元.问:(1)甲、乙两队单独 转基因食品有什么好处?各位谁能告诉我啊``` 3路:每隔6分钟发一次车 5路:每隔8分钟发一次车 3路和5路的起点站都在这儿. 它们刚才同时发的车.这两路公共汽车同时发车以后,至少过多少分钟两路车才第二次同时发车?要过程! 正在修建中的某段公路在招标,现有甲乙两个工程队,若甲乙两队合作,24天可以完成,需要费用120万元;若甲队独做20天,剩下的工程由乙队做,还需40天完成,这样需要费用110万元,问:1.甲、乙两个 转基因食品的优势 把7分之4千克的黄豆平均分成6份,每份是1千克的几分之几,每份是4千克的几分之几.马上要交了. 正在修建的某条公路招标,现有甲乙两个工程队,若甲乙合作24天可以完成,需要费用120万,若甲单独作20...正在修建的某条公路招标,现有甲乙两个工程队,若甲乙合作24天可以完成,需要费用120万, 某仓库有16.8吨大米第一次运出大米7分之一,第二次运出余下的4分之3.一共运出多少吨? 一条72米长的路,原来从一端起,每隔9米有一盏灯(起点和终点都装有路灯).现在一条72米长的路,原来从一端起,每隔9米有一盏灯(起点和终点都装有路灯)。现在重新安装,要从一端起每 正在修建的某条公路招标,现有甲乙两个工程队,若甲乙合作24天可以完成,需要费用120万元;若甲单独做20天后剩下的工程由乙做,还需40天完成,这样需费用110万元,问:(1)甲、乙两队单独完成 一辆汽车正常行驶100km,消耗汽油5kg,一只该车的油箱为40L,给油箱装满汽油时,该汽车可正常行驶多远?如果正常行驶的速度是70km/h,一箱汽油可供该汽车正常行驶多少小时 一栋大楼地下共4层地上共18层史师傅从地下4层到地上3层用了7/60分钟王老师乘电梯从地下3层到地上7层需多少分钟?(算术) 26、正在修建的某条公路招标,现有甲乙两个工程队,若甲乙合作24天可以完成,需要费用120万元;若甲单独做 一个长方体它的宽和高都相等,如果把长去掉2.5cm,就成一个表面积150平方厘米的正方体,那么原来长方体体积?那么原来长方体的体积是多少立方厘米 一栋大楼地下4层,地上有18层,史师傅乘电梯从地下4层到地上4层,要六十分之七分钟,王师傅乘电梯从地下4层到地上7层,用多少分钟 一个长方体它的宽和高相等如果把长去掉2.5cm就成为一个表面积150cm的平方的正方体,长是宽的几倍 方舟子的博客里为什么自称总是用方舟子?比如方舟子说如何如何,方舟子被打如何如何,为什么不用“我”“本人”之类?让人看了觉得很不舒服.难道方舟子的博客是专门有枪手捉刀的么?如果 把三个棱长1cm的正方体拼成一个长方体,长方体的表面积是18cm2吗? 一个长方体它的宽和高相等,如果把长去掉2.5cm,就成为一个表面积150cm的平方的正方体,那么原来长方体积是多少立方厘米? 甲乙店矿泉水促销,甲店买2大瓶送1小瓶,乙店一律打八折,买大瓶8元,小瓶2.5元,买4大瓶、2小瓶,哪个商店更经济?为什么? 用5个棱长为1cm的小正方体拼成一个长方体,这个长方体的表面积是多少平方厘米? 一个长方体它的宽和高相等,如果把长去掉2.5cm,就成为一个表面积150cm的平方的正方体,那么原来长方体体积是多少立方厘米 小桃去商店为美术小组买宣纸和毛笔,宣纸每张2元,毛笔每支15元,商店正在搞优惠促销:买一支毛笔送一张宣纸.小桃买了10支毛笔和x张宣纸,那么小桃用的总钱数y(元)与宣纸张数x(张)之间的函数 某人乘电梯从地下2层上升18层后,发现自已走错了楼层,又下降了3层,此人现在在处级 有一个长方体的表面积是150cm²,沿截面刚好锯成7个完全相同的正方体,求每个正方体的表面积.希望加上解题思路. “绿满梅州”活动中,某镇要从外地运一批树苗,第一次运了520棵,第二次运了总数的5/12,两次共运了总数的85%.两次共运树苗多少棵? 有一段长340米的马路,要在这条马路的两侧植树.从一端为起点,每隔8.5米中一棵树,一共要种多少棵树 仓库里有60吨钢材,第一次用去总数的五分之一,第二次比第一次多用四分之一.第二次用了多少吨 一批货物共100吨,第一次运了总数的1/4,第二次运了总数的1/5,第一次比第二次多运多少吨?两次共运多少吨? 在一条长600米的公路两边植树,要求每边都每隔3米栽一棵树,如果从公路的起点栽起,一直栽到终点,一共需要多少棵树苗? 高速公路限速120KM 我跑了123KM要罚款吗?也就是在同一个地方我被拍了3次,都是超过3-5KM,我打电话问过12122,他们的解释是120KM以上的话超过1KM都要罚款,我问不是超过%20才罚款吗,交警的回答是限 一个长方形,它的长和高相等,如果把长去掉2.5厘米,就成为表面积是150平方厘米的正方体,原长方体的体积是多少? 把四个棱长是1cm的正方体,拼成一个长方体,拼成的长方体的表面积.最小是()cm2 线段AB是连接A,B两城市的高速公路,全长300km,在AB上建有一个休息处C,已知AC:CB=7:3,一辆客车的速度是70km/h,请你求出这辆客车从A到C所用的时间. 把一个长方体的长去掉4cm,成了一个正方体,表面积减少了64平方厘米,这个长方体原来的体积是多少?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn