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

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

专访IBM中国研究院院长沈晓卫博士:全新的物联网来了 《近匠》GYENNO CEO任康:用“勺子”敲开一片新市场 Horde3D——基于C++编写的3D渲染引擎 Maker Faire 2015在深圳正式开幕,关注创客生态系统 Arduino与Seeed Studio达成战略合作——专访Arduino联合创始人Massimo Banzi 免费开源的Bootstrap富文本编辑器bootstrap-wysiwyg使用方法 CCAI2015:首届中国人工智能大会将于7月26-27日在京举行 拥抱互联网+ 用友NC6助力集团企业蜕变数据驱动型公司 《近匠》融云,自主研发真正“不丢消息”的IM云服务 【CTO讲堂】听云CTO Wood:APM实现原理及对IT和产品运营的价值 从7个维度浅析虚拟现实Alpha年 Maker Faire上的微软:将技术与工具带给Maker才是关键 友盟2015年Q1移动互联网报告:车联网App崛起 多面编程语言Scala NEC高可用集群软件EXPRESSCLUSTER X3.3面向中国市场正式发布 【探秘ES6】系列专栏:模版字符串 专访图书作者祁宇:C++11让程序更简洁、更现代、更强大 滴滴打车CTO张博:生死战役,技术和时间赛跑 Qualcomm拥抱创客文化:如何基于DragonBoard 410c创造和创业? 【探秘ES6】系列专栏:剩余参数和默认参数 专访资深程序员庄晓立:我为什么要选择Rust? 主会讲师确认,2015中国人工智能大会火热报名中 容联·云通讯线下沙龙:IM 5.0助力App社交化 【CTO讲堂】全数据驱动产品优化,美国互联网公司A/B测试经验分享 《近匠》易快报:以报销做企业消费场景下的Slack 纷享销客D轮融资1亿美金,启动开放平台战略! 专访4秒源码商城CTO陈杰:扎根互联网的“不安的心” iOS UIView动画实践(一):揭开Animation的神秘面纱 【前端人生】Teambition前端工程师陈涌:非计算机专业,依托社区不断成长壮大 iOS UIView动画实践(二):Spring Animation与人机交互 基因组与数据整合:DNA应用开发正在临近 高分求教 哪儿可以下载InstallShield 6.22(在线等待,急!!!!) 我要installshield 怎样backupwin98的注册表? ****************如何生成安装文件************* 求教这样一个角度算法 征求好网址!大家把收藏夹里的好网址贡献出来吧! 中国队惨了!!!!!!!贝克汉姆已加入土耳其队! 《Applied Cryptography》,这是本什么书? 一个12位的整型,用unsigned long可以容纳吗? Perl以后会变成什么样呢? 谁能帮我!错手把逻辑盘的东西删了,能不能恢复。 下面添加用户的代码能运行吗,我怎么运行不起来,50feng VC文本编辑器没有参数提示 在Delphi中如何使图像淡入淡出? 猜猜中国今天输几个,本人大胆预测10-0 为什么我这里总是405错误呀?Method Not Allowed……The requested method POST is not allowed ADO技术问题! HOOK还是不行! 在ocx中如何使用一个ActiveX,不算使用IMPORT,还有没有别的方法呢?(大送100分) API中的SETTEXTCOLOR函数! 部署实体bean的问题(jbuilder6+weblogic6)??? 怎么样自动增加一列在select UserID,AreaCode from table 。在先等候,先答来的100 谁能帮我!错手把逻辑盘的东西删了,能不能恢复。 调查:各位都用哪里的主页空间? 猜猜中国今天输几个,本人大胆预测10-0 我不喜欢南美球队,球风太差,犯规隐蔽,演戏一流!!! 请问这段代码哪里有误?我用的asp+access。急急急急急急急急急急急急急急! 我想做一个类,提供ONMOUSERMOVE事件给用户接口,怎么做,在线等候? 请问关于软件架构,框架和构架的问题 看看别人吧!!!再看看我们!!! 怎么样自动增加一列在select UserID,AreaCode from table 。在先等候,先答来的100 全民健身 有谁使用过水晶报表? 求线段作另一线段的垂足 请问哪里有Delphi 6的控件下载? 怎么调用api画多边形? 求线段作另一线段的垂足 谁能帮我!错手把逻辑盘的东西删了,能不能恢复。 如何把一个文本文件的内容赋值给一个char* 大连高程何时报名? 需要这样功能的远程控制工具.... 谁知道广州搞php OR asp一月多少钱? 如何给JButton响应Enter键. W2K2000中的 SP 是干什么? 问题整理:求教关于Bezier的方程!!! 关于DJGPP和NASM 请问用什么样的方法可以令win98每隔两个小时死一次机或重启?谢谢 交论文的日子快到了--- 请问关于网站建设方面的,有哪些可写的? 50分,请问ms sql2000可以设置只显示用户表,隐藏系统表, JRE?JAVA 运行环境,指的是什么?要如何配呀? 如何写实验报告以及科学小论文?具体点的 蒸馏水怎么做 原核生物的细胞壁有什么成分? 科技小论文格式 H-为什么有较强还原性 金属镍的杨氏弹性模量,和泊松比,跪求大神帮忙指点~急~~~ 动物没有细胞壁,为什么植物要有 什么生物有细胞壁 求50Crnimo的弹性模量和泊松比! 小学科学四年级《空气里有什么》实验报告单 科学小论文格式科学小论文,超过450字,格式怎么写?可不可以顺便发一篇范文供我参考一下,最重要的是格式! “按照还原性从强到弱.应该是:还原剂>氧化产物>还原产物>氧化剂”怎么推导 主要是氧化产物>还原产物、 小学科学分组实验报告中实验者填什么啊,是填一个人,还是几个人,还是就写哪个班?急! 有细胞壁的动物哪些?没有细胞壁的植物哪些? 如何制取无氨蒸馏水 小学科学实验报告:颜色与吸热 动物细胞有没有细胞壁 什么叫蒸馏水?他的作用是什么 小学科学实验报告怎么写?要小学的…… 如果把艾滋病病毒注入到植物中,植物的细胞壁是否会被破坏,成为所谓的"动物" 如何检验蒸馏水不含NH3,N02-,NO3- 聚丙烯酰铵和葡聚糖凝胶分离蛋白质 分子量越大跑的快还是慢这两种是不是都有分子筛效应 跑的快慢和分子量什么关系 另外还和什么有关 原理是什么 动物细胞和植物细胞是不是都含有细胞壁?细胞壁的主要成分和功能又是什么? 环境检测中氨测定实验用买的蒸馏水,空白实验值是不是会偏高? 所有高等植物细胞都具有细胞壁么?所有的植物(包括低等植物)呢? Na2CO3和CaCO3的热稳定性比较? 电解池中,为什么阴极一定是溶液中的阳离子放电在电解池中,阴极无论是惰性电极还是活泼电极,电极反应为什么都是溶液中的阳离子放电 低等植物有无细胞壁? 碳酸钙和硅酸钙谁热稳定性好?说明根据, 电解池阳离子放电顺序中,为什么Pb2+,Sn2+,Fe2+,Zn2+的浓度很大时放电顺序排在H+之前?为什么? 低等植物有细胞壁吗? CaCO3与Na2CO3的热稳定性比较: 什么叫做电解池放电?阳离子得电子也叫放电吗? 用惰性电极电解混合溶液时,在阴极先放电的阳离子的______性较强,在阳极先放电的阴离子的________性较强.我有答案,但不知道怎么思考这道题目,谁能帮我填上这个空,并说出解题的思路理由啊? 电镀阳离子放电的顺序是什么? KHSO4溶于水会被破坏共价键吗? 请问氧化铜、铜绿、氢氧化铜三者的热稳定性的大小?为什么?问题补充:答案是铜绿大于氢氧化铜,请问为什么? 热稳定性:NA2CO3>CACO3>NAHCO3>H2CO3,在先等 酒精溶于水,共价键是否会被破坏 氢氧化铜和氢氧化铁谁的热稳定性强要十分确定哦~ 为什么电解的阳离子放电顺序与电镀的不完全一样? 初中科学实验拜托给我一篇这样的作文 下列氢氧化物:1.氢氧化铜2.氢氧化钙.3.氢氧化银.4.氢氧化铁 的热稳定性由大到小的顺序正确的是() 阳离子放电顺序是如何确定的?是否是根据在同浓度情况下不同阳离子的氧化性强弱排出来的?我想问的是,该放电顺序是否是在各离子浓度相同的情况下得出的? 初中科学,关于实验我想写一篇关于课堂演示实验的改进的案例,各位大侠帮忙取个名字?谢谢! 铜和氢氧化铜混合物在空气中加强热,铜完全氧化,氢氧化铜完全分解,反应前后质量相等,求氢氧化铜的质量分数.麻烦做一下啦~谢谢谢谢 原电池和电解两极的放电顺序如何判断 制备氢氧化铁胶体时能否用氯化铁溶液与氢氧化钠反应? 碱式碳酸铜怎样直接反应得到氢氧化铜?Rt 蒸馏水机哪有卖的石家庄同惠公司的不错! 郭萌 15511631996 植物细胞细胞壁与原核生物的细胞壁有何不同之处? 下图是实验室制蒸馏水的装置,冷凝管上a、b两口分别为进水口和出水口,其中________是进水口,_________是出水口,这样做的优点是什么?在实验过程中,往往在蒸馏瓶中加入几粒沸石(或碎瓷片),其目 比如说问植物细胞大小,是算细胞壁以内的还是细胞膜以内(此时细胞已失水皱缩). 原核生物都有细胞壁吗 实验室蒸馏水哪里有卖 原题是:吡罗红,甲基绿染色剂的成分是什么:1.吡罗红,甲基绿.2.吡罗红,甲基蓝.3.清水.4.蒸馏水.5.0.9%NaCl溶液.6.乙酸钾.7.乙酸.8.乙酸钠.9.盐酸.A.1367 B.2489 C.2378 D.1478 原核生物有细胞壁吗?化学成分与植物细胞壁相同吗? 实验室用蒸馏水,那个牌子的好一点 什么是蒸馏水 纤维素为什么是植物特有 那原核生物的细胞壁是什么组成的呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘