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

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

Windows 8.1 Update 1最新版的截图再遭曝光 2013年软件领域因缺陷导致的五大事件 专访AMD技术高管 详解Kaveri技术性能及新开发特性 网络的东西南北:从SDN到网络虚拟化 Bug让Chrome浏览器成了窃听器 联想23亿美元收购IBM X86服务器硬件及服务 Mozilla联手富士康推出Firefox OS平板 基于Web提供服务 GitHub中国游记最终回——开源与车库的碰撞 学以致用,光棍极客通过大数据搞定女朋友 1月24日:Mac步入了而立之年,生日快乐! 微软2014财年Q2财报:Surface营收翻倍 趣文:假如编程语言在一起聚餐 AOL收购个性化服务公司Gravit,耗资9070万美元 谷歌三月将办Pwnium 4黑客大赛 奖金高达271.828万美元 研发周报:精简代码,为网站减负的十大建议 教育自由日:让教育资源更开放 Win8.1下解决IE11浏览器不兼容的方法 移动周报:找你妹版权战、访俄民手游、GitHub游记终回 一周消息树:1月23日全国顶级域名根服务器疑遭黑客攻击 影响巨大 下一代互联网搭建技术:高空气球,无人机,又或是卫星? 红帽认证总监:10个架构师里有4个在中国 数据中心优化的5个途径:软件定义、云计算等 收购诺基亚,微软能否再度崛起? 一周热点:阿里专家深度解析分布式系统,美团数据挖掘工程师分析企业大数据 独立游戏节:学生展示优胜者奖项得主揭晓 专访Meetup Andres Glusman:解析UX、精益创业方法论背后的强大力量 开发者不容错过的12款开源JavaScript库 搭载FusionCube,HANA内存计算助力实时运营 叫板Google,VMware15亿美元收购AirWatch强势布局物联网 2014年IT企业招聘调查报告:外资企业招聘规模偏大、技术人员比重高 小机器人Ozobot:Maybe,我也有禅意 已知,十六进制(34.6)16=(28.75)10(十进制) 高手推荐几个Palm开发的网站?最好有源代码! 请教一个问题 触发器(加密)内容可以查看吗 怪,文件路径绝对正确,EXE文件不能下载,其它格式正常。 在编写的用户控件中公开所引用控件的事件怎么实现啊 这是我的usb口的问题吗? 考程序员前想先考全国三级,请问三级种哪个科目考C编程?何时报名? 调用DLL时候出现Bad Dll calling convention错误,为什么?代码如下 如何建立一个小数据库? 我想问下,网络技术到底是指什么??? 为什么会出现这个问题呢??急救??? 在不同操作系统出现不能正常运行的问题,和默认字体语系乱码问题 C# 静态类成员 新手请求各位前辈帮助 如何查询我连接到哪个数据库? 哭着请求帮助。。。。。页面显示问题!!在线等着 网络技术到底是指什么???? 我想在<<三国九>>里输入正确的中文,有法子么? 能帮我改改么? 紧急求助,请高手支招 请问在JTABLE中如何将某几行设置成可以被选择的,其他几行设置成不能被选中的? 请问怎样修改SDI框架的标题及去掉最大化按钮??? 在自定义的用户控件上公开引用windows控件的事件怎么做啊!!谢谢 2003中为什么IDE设备只能用PIO模式? 在FAQ里见到这样一句,不明白什么意思 怎么我用vc 的 odbc 做数据库时,工程名为try ,在工程工作区的“class view”面板里没有tryview类的? 不能使用xmldocfile() 文档对象的问题 关于键盘纪录,高手 如何使用IPAddress控件? 初学者问:怎么用UpdateAllViews()? 无法创建asp.net应用程序 大家帮帮我吧,我都快崩溃了 中文乱码的问题 !!谁在VMWare 3.2里装过RedHat 9.0和RedFlag 3.0,请看看这些问题(100分)!! 如何使在输入框选中的文字在提交后仍然显示在输入框中? 无法创建asp.net应用程序 高手在上,请问怎么样在win2k中实现关闭程序和绘图[内详] 初学者问:如何在listview中查找其中一行? 怎样在调试窗口中看到变量值? 郁闷中,狂散分。。。。。。 DCOM怎么使用? 想做一个地区门户一般要包含那些栏目?? 线程 怎么能让DELPHI编出来的程序最小化以后进入到系统托盘? C++问题,请进来帮忙! help me ~!!! 以下行为究竟是关闭端口还是使用端口 callzjy(【剑客西门吹雪原来是仁者帮帮主...】) 怎么翻了这么多老帖子出来了??? 求原代码下载 食堂有一堆煤烧去一部分后还剩三分之1,还剩9分之2吨.这堆煤原有多少吨? 孩子身高1.65,做个书桌多高合适?一直用的写字台,所以喜欢大桌子,最好报个长宽高. 第三题.求道理.物理高二的. 食堂有一堆煤,烧了几天后,余下的5/8,和其余5 /2吨的.这堆煤多少吨? 为什么现在萤火虫越来越少?小时候夏天夜晚,萤火虫满天飞,现在都看不见了,连农村也很少见 为什么自然光的反射和折射光都是偏振光大神们帮帮忙 一根质量为0.4kg长为0.20m的直导线,水平放在一个倾角为30度的光滑斜面上,一均匀磁场方向垂直于斜面向...一根质量为0.4kg长为0.20m的直导线,水平放在一个倾角为30度的光滑斜面上,一均匀磁场方 现在为什么看不到萤火虫了? 甲乙两列火车长为92米和84米,若相向行驶,经过1.5秒完全错过(即从两车头相遇到两车尾离去)若同向行驶,则相遇后经过6秒超过,求两列火车的速度。 什么是生冷的东西 如图所示,物快A重10n,B重20n,AB间的动摩擦因数为0·1如图所示,设A重10N,B重20N,A、B间的动摩擦因数为0.1,B与地面的动摩擦因数为0.2 问:1.至少对B向左施多大的力,才能使A、B发生相对滑动?2.若A、B 甲、乙两列火车的长为92米和84米,若相向行驶,经过1.5秒完全错过(即从两车头相遇到两车尾离去),若同向行驶,则相遇后经过6秒超过,求两列火车的速度. 12.如图9所示,某工地工人用固定在水平工作台上的卷扬机(其内部有电动机提供动力)提升水中的物体,其提升速度始终为1.5m/s.物体未露出水面前,被匀速提升时,卷扬机对绳子的拉力为F1,卷 圆的周长是怎样得来的 电源短路的路段电压是多少 如图所示,某工地用固定在水平工作台上的卷扬机(其内部由电动机提供动力)提升水中的物体,其输出功率始终为1500w,物体未露出水面前,以1.5m/s的速度被匀速提升,卷扬机对绳子的拉力为F1,卷 A重10N B重20N F=4N 同时作用在AB两个物体上,是它们在平面C上同步做匀速直线运动如图所示:物体A重10N,B重20N.两个相同的力F=4N,同时作用在A、B两个物体上,使它们在平面C上同步做匀速直线运动 一个质点在作匀速率圆周运动时(   ) A.加速度改变,B.加速度不变,C.一个质点在作匀速率圆周运动时(   )A.加速度改变,B.加速度不变,C.加速度改变,D.加速度不变,最好说明一下 如图所示,劲度系数为k=10N/m的弹簧下面挂着质量分别为m1=0.5kg和m2=0.3kg的两个物体……如图所示,劲度系数为k=10N/m的弹簧下面挂着质量分别为m1=0.5kg和m2=0.3kg的两个物体,开始时它们都处 A重10N,B重20N,AB间、B与地面间摩擦因数等于0.5,欲使B匀速拉出,F至少要多大? 如何测出一个电器是用直流电还是交流电? 已知a为实数,f(x)=(x平方-4)*(x-a),若f'(-1)=0,求f(x)在中括号-4到4上的最大值和最小值 萤火虫是什么变的 玻璃是拿什么做的 不用计算圆的周长公式,有什么办法能求圆的周长 桌面上有AB两球,若要将B射向桌面任意一边,使一次反弹后击中A球,则如图所示8个点中,可以瞄准得点有几个 长大后,我就成了你,才知道那块黑板写下的是真理……才知道那支粉笔画出的是彩虹.是哪首歌 圆的周长的公式时我们用什么方法? 在倾角为30度的光滑斜面上放一质量M=2KG的物体A由轻绳与质量为M的物体B相连A和B都处于静止状态求B的质量 通过波形如何判断音叉叉股的长短 圆的周长除了用公式还有什么方法 船在静水中,两大人分别用F1=400N.F2=360N的力拉船,为使小船在河中间沿与河岸平行的方向前进,一个小孩用一最小的拉力帮忙,求小孩施力的大小和方向.(sin37°=0.6) 马拉着重为10000牛的车在水平公路上匀速前进,30min走了5.4km,车在前进的过程中受到的摩擦阻力是1000牛,(1)马拉车前进的速度是多大?(2)马对车的水平拉力是多大?马在这段时间内对车做了 指导圆的周长的公式时我们用什么方法 有人知道具体无线电测试仪产品认证的意思 甲火车长420米,每秒行15米.乙火车长390米,每秒行20米.乙追上甲并超过甲需要用几秒? 有助于回答者给出准确的答案重100N的球用水平绳拉住处于静止状态 光滑斜面倾角为37度,求绳对球的拉力和球对斜面的压力 由两根绳子拉着小船匀速航行,若F1,F2的夹角为120,且F1=F2,则船所受的阻力F,F1,F2有怎样的关系 一辆车装满货物共重4.9乘10000牛,在平直公路上匀速行驶,在十分钟内前进了6千米.接上:在这时的功率为6.615乘10000瓦,求(1)这段时间内汽车的牵引力做了多少功(2)汽车所受重力做了多少功 用滑轮组将200kg的物体匀速提升12m用时1min,如图所示不计绳重及摩擦,绳自由端的拉力为550N.求:(1),绳自由端拉力移动的速度是多大?(2),动滑轮重多大?这是图片 已知F1=10N,F1与F2的合力大小为10更号下3牛,合力与F1的夹角为30度,求F2的大小和方向 A,B两个小物块用轻绳连接,绳跨过倾角为30°的光滑斜面顶端的轻质滑轮,B悬空A放在斜面上A恰好静止第二次将B的质量改变发现A自斜面顶端由静止开始向下运动,经时间t速度大小为v已知物块A的 如图所示的撬棍,当作用力P以哪个方向最省力,并说明下原因,(我不太懂)A 作用力垂直向下 B作用力水平向右C 作用力垂直撬棍 D作用力水平向左http://hi.baidu.com/%B7%C5%CB%C9%B5%C4%CA%C0%BD%E7/album/item 一个圆形钟面的半径是15厘米,它的面积是多少平方米? 李伯伯参加飞镖比赛,投了4镖,成绩是37环.李伯伯至少有一镖为什么不低于10环,为什么?(例算式) 静电放电的电磁兼容试验有没有相关标准? 一个分针长12厘米,走一昼夜的面积和周长?说出算式的意义 敲击音叉的力越大,则发出的声音()A越高B越低C越响D越轻 200米等高线上大的某点,同200米的深线的点的相对高度是...A.200mB.300mC.400mD.600m 一个圆形钟面的半径是15厘米,他的面积是多少平方米?清楚一点,要算式哦 已知圆F1:(X+1)^2+Y^2=1/4 F2:(X-1)^2+Y^2=49/4 动圆M与F1 F2都相切求1;动圆圆心M的轨迹方程 导线的绝缘皮是否有耐腐蚀功能 清朝历代皇帝谥号是什么?例如,咸丰(显)皇帝,谥协天翊运执中垂谟懋德振武圣孝渊恭端仁宽敏显皇帝 一个圆形钟面的直径是16厘米,它的周长是几厘米,它的面积是几平方厘米一个圆的半径扩大3倍,周长就扩大 倍,面积就扩大 倍丨两个圆的半径分别是3cm和5cm,它们的直径的比是 ,周长的比是 面积 第二题怎么做,答案加解释 用细绳悬挂一个质量为m的物体,对于下类情况中绳子受到拉力F1的大小应是( ) A.当细绳拉着物体向上匀速上升时,F1>mg,F1越大.B.当细绳拉着物体像下匀速下降时,F1 我国第一部磁悬浮列车已经在上海投入使用,如图所示是磁悬浮的原理,下面的圆柱是柱形磁铁,上面使用高温超导材料制成的超导圆环,将超导圆环放在柱形磁铁上,它就能在磁力的作用下悬浮 如图,12N重的小球放在倾角为30°的光滑斜面上,且处于平衡状态.此拉绳恰为水平方向.则绳受到的拉力为多少,斜面受到的压力为多少? 我有一个朋友,身高170,体重50kg,不是体育生,他在今年的校运会100米和200米项目上都跑过了所有的体育生,成绩分别为11.62和24.69,我想问一下他这样算好吗?(运动会前他说他在家里用哑铃和做俯 焦点在x轴上的椭圆上有一点P(3,4),F1、F2是椭圆的两个焦点?焦点在x轴上的椭圆上有一点P(3,4),F1、F2是椭圆的两个焦点,若PF1⊥PF2,求椭圆的标准方程? 亚洲食学国际论坛登陆绍兴 中国大厨展杭州女装与国际女装相遇 传统丝绸碰撞淘宝店家支付宝“被贷款” 阿里服务热伊朗处死16名“恐怖分子”墨西哥革命制度党主席:墨中两国双边关阿富汗军事基地发生“内斗”致一死一伤贺一诚:浙商又迎新一轮挑战、改革和创阿里巴巴马云:金融业需要外行人的“搅美国“窃听门”持续发酵 欧洲各国一致2000余浙商回家共襄创业创新 新一中国科学家成功研发H7N9禽流感病毒为西湖“挑刺”成常态 文明出游初显成美国务卿克里居所遭小偷光顾 470万中国周边外交:推进大战略第九届两岸经贸文化论坛在南宁开幕国防部:日方若击落中国无人机 中方将浙江省长李强再盼“浙商回归” 希望浙老汉约网友对方是儿媳:真警察配合拍照俄印蒙三国总理同日访华 中国周边外交美国与沙特进入公开紧张状态 多重分歧儿子被男生表白妈慌了 专家:应尊重孩【独家】中国经济15年!是什么震惊了央视专访田峥:CCTV移动《影响力1不撕逼不掐架,电商品牌联合怎么做?个体户将消失您准备好了吗?证监会两天内三位高管变动,对A股释放蒜蓉茼蒿清理配资不再一刀切 后市大举反弹?2014最具公众影响力公共关系事件评这四件事情今年都能落地,中国经济有大名人问股之老艾:呼吁暂缓清理配资见成这轮牛市到底会有多大?【第2编辑室】花千骨、神探夏洛克、纸财富大洗牌再分配时代来临,谁将暴富,广西灵山砍杀4名学生嫌犯疑已上吊自尽德扬帽子戏法,国安主场3-1胜亚泰Kim yoon-hee的浪漫风格插李银河:人怎样才能从必然王国进入自由老当益壮!德扬帽子戏法跃居射手榜次席下调存款准备金率一个百分点算什么,还“第十三届上海国际广告标识展”今日盛新加坡打造智慧国?\"无处不在+永远
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘