如何开发电子邮件服务器(1000分) (200分)

  • 主题发起人 主题发起人 栋栋
  • 开始时间 开始时间

栋栋

Unregistered / Unconfirmed
GUEST, unregistred user!
如何开发电子邮件服务器(1000分)
 
栋栋,
你又在干什么?我都把源代码给你了。也不给我加分,哼
 
zhaohai9,
我答应给你500分的,会给你的

我想自己写一个邮件服务器,我只要能接收发过来的邮件,然后自己处理一下就行了!
 
你的《社区》是不是挂了,我怎么上不去呢?
 
没挂啊?
可以上去啊!
 
http://delphi.mychangshu.com
该页无法显示
您正在查看的页目前不可用。Web 站点可能遇到技术困难,或者您需要调整您的浏览器设置。

--------------------------------------------------------------------------------

请尝试以下操作:

单击刷新按钮,或以后再试。

如果在地址栏中键入地址,请确保其拼写正确。

要查看连接设置,请单击工具菜单,然后单击 Internet 选项。在连接选项卡上,单击局域网设置。 这些设置应该与您局域网(LAN)管理员或 Internet 服务提供商(ISP)所提供的相匹配。
如果您的网络管理员允许,Microsoft Windows 可以检查您的网络并自动查找网络连接设置。
如果您希望 Windows 进行尝试并查找,请单击检测网络设置。
某些站点要求 128-位的连接安全性。单击帮助菜单,然后单击关于 Internet Explorer 可以查看您所安装的安全性强度。
如果您要到达某安全站点,请确保您的安全设置能够支持。请单击工具菜单,然后单击 Internet 选项。在高级选项卡上,滚动到安全部分,复选 SSL 2.0、SSL 3.0、TLS 1.0、PCT 1.0 设置。
单击后退按钮,尝试其他链接。



找不到服务器或发生 DNS 错误
Internet Explorer
 
帮帮忙吧?

我想做个邮件服务器
 
只有查看协议的
 
[blue]这个太难了,我不会呀!呵呵!这次没分拿了![/blue][:(]
 
http://www2.ccw.com.cn/tips/9909/091401_05.asp
http://www.5xsoft.com/data/200105/1512051201.htm
 
其实我要的是

收信服务器

我只要能够收到别人发过来的电子邮件就可以了。
 
首先要确定的是你要开发的邮件软件的应用对象和范围。分为三类吧,第一类,你的目标是通用的E-mail软件,就像foxmail, outlook一样。第二类,是E-mail的一些分支,如邮件监测器(POP3 Monitor,自动检测服务器上是否有邮件到来),批量邮件发送器(bulk emailer)等。第三类,是将E-mail应用到某些软件项目中,比如,你可能须要在一个MIS项目中用E-mail来传输数据,或在Web上提供发送邮件的功能(如贺卡)。
  关于三种类型,他们的实现方法和难度是不一样的。为了讲解方便,我们将上面三种类型称为A类,B类和C类。其中A类因为用户的覆盖面最广,须要考虑的因素最多,对程序的稳定性和适应性要求也最大,B类次之。
  下面的内容主要集中在邮件相关知识上。我要强调的是,一个邮件软件,更多的是非网络的处理。因为邮件软件不同于其它的网络应用,邮件软件要更贴近用户,实际上是一个日常办公应用。事实上,在Foxmail中,网络部分的处理可能只用了10%的精力。

一、了解TCP/IP网络编程方法
  对于A类和部分B类应用,要求你自己编程实现基于TCP的邮件通讯。因此对TCP/IP编程的理解是必要的。而且一旦你掌握了TCP/IP的编程方法,你可以完成更多的网络程序,比如FTP, HTTP等。这里没法深入去讨论,因为这是一本书或几本书的内容。因此只能向你推荐我自己觉得必看的书目:
1.Internet的经典教材:
书名:Internetworking With TCP/IP。作者:Douglas E. Comer。出版:Prentice Hall。
中译本:《用TCP/IP进行网际互连》。出版:电子工业出版社。
这套书共有三卷。清华大学出版社在国内发行英文版,因为价格比国外买便宜,前不久我还在广州买了一套寄给在美国念书的朋友(邮费比书还贵)。
2.一本很好的关于Winsock编程的书
书名:《Internet编程》,电子工业出版社,1996。
这是一本翻译过来的书,详细讲解了TCP/IP编程的概念和方法。其中对Unix socket和Windows socket编程的区别,以及Windows下socket的同步和异步,消息和多线程等概念讲解透砌。1996年我就是因为看了这本书,萌发了写foxmail的想法。

二、了解电子邮件相关的标准
  对A类和B类应用,有必要非常熟悉网络协议,特别是与E-mail相关的RFC协议。RFC是Request for Comments的简称,Internet的绝大部分协议都是通过RFC的方式提供与更新的,比如我们常用的HTTP协议,就是由RFC2068 定义的。与E-mail相关(通讯,邮件格式,附件编码等)的协议有很多,以下是必须要看的RFC:
RFC 821 (SMTP,简单邮件传输协议,定义了发送邮件的机制)
RFC 822 (邮件格式定义)
RFC 1725 (POP3,邮局协议版本3,定义了从POP3服务器收取邮件的机制)
RFC 1521 (MIME标准)
RFC 1522 (MIME 标准2)
  在这里,因为篇幅关系,没有办法深入讲解,因此只能由读者自己查阅这些文档。这些文档可以在Internet上很多站点找到,比如http://www.cis.ohio-state.edu/htbin/rfc/INDEX.rfc.html就列出了全部的RFC文档。
对于C类应用(和部分B类应用),可以不去关心这些协议,因为你可以采用一些现成的控件来完成邮件的功能,封装得好的控件可以完全屏蔽掉这些实现细节。

三、非网络的因素
  如前面所说的,你须要投入更大的精力到其它非网络的部分的开发中,因为作为一个应用软件,你要细致地处理每个细节。但这里说的并不是各个特性细节的堆砌。比如对于A类应用,你须要做好合理的系统设计,然后对设计中的每个大模块找到好的实现方法。比如电子邮件的存储,我称它为邮箱文件系统,事实上是个基于索引的变长记录系统。如收件箱,由两个文件组成,In.ind是索引文件,记录了每个邮件的摘要信息(发件人,主题,日期等),更重要的是,每个邮件在数据文件中的位置;数据文件是in.box,简单地记录了每个邮件的原始内容。邮箱文件系统的原理并不难理解,难的是要保证其非常高的稳定性,因为邮箱文件的设计错误将直接导致邮件的丢失。
  就像浏览器的开发一样,浏览器的HTTP网络协议处理并不复杂,但HTML的显示要复杂得多。电子邮件也一样。但是在B类和C类应用中,问题比较简单,因为是特定的功能实现就可以了。

四、Winsock的消息和多线程
  对Winsock的异步机制的理解非常重要,对多线程的理解也很重要。很多人以为多线程可以解决任何问题,我想并不全是这样。Windows下的socket编程与Unix下的一个很大差别是,你可以将socket的事件与Windows的消息机制紧密联系起来,写出高效率的Winsock程序,这有赖与对Windows和Winsock的理解。如果须要用到多线程,须要周密考虑好线程同步问题,这不仅仅是对线程的理解,可能在规划的时候,就要考虑线程同步问题来。比如你有一个线程在从发件箱中发邮件,一个线程在接收邮件,还有一个线程(主线程)在显示或删除邮件,这些线程可能同时对同一个邮箱文件进行操作,如果不同步的话,后果将是邮箱文件被破坏。
  采用Winsock的基于消息的异步机制是个很好的选择,这样只有当有网络消息到来时,Winsock才发消息通知程序处理,程序不会停顿在等待或循环中。利用异步机制,须要构造好一个“状态机”,即你要让程序清楚知道目前处理到什么阶段了,当网络(服务器)需要数据时,程序才能知道下一步要发送什么数据出去。

五、开发工具的选择
  对于A类和部分B类应用,我想Visual C++和Delphi是比较好的选择。我个人在开发Foxmail的时候决定用Delphi,是因为它可以帮我省去许多设计界面的时间。而且Delphi具备C++的绝大部分优点,如真正的面向对象,运行的效率等,同时具有比C++更容易理解的语法。而且Internet上有许多Component可以参考,我常去的一个Delphi站点是http://sunsite.icm.edu.pl/delphi。
对于部分B类和C类应用,开发工具的选择面大很多,VC++, Delphi, VB, PowerBuilder,甚至Java等都是考虑的对象,就看你的应用方向了。如果基于现成的控件来做,一般是OCX的形式,OCX可以在绝大多数开发平台上使用。
  对于开发工具,我还想说的是,开发工具并不是最重要的,因为任何一种工具,必须用好它,才能发挥它的功能,而用好一个工具的基本点,是对编程的理解和掌握,与开发工具无关。

六、要不要熟悉TCP/IP和邮件协议?
  看了上面的介绍,可能很多读者会问,如果从头去学习TCP/IP编程,并掌握关于email的协议,会用去大量的时间,有没有更快速的方法呢?我想,同样得看你的应用目标是什么。比如,你只是想在一个MIS项目中包含电子邮件功能,当然没必要从底层开发所有的东西,你可以借助一个商业(甚至免费)的OCX来完成邮件功能。比如Delphi中,就包含了POP3和SMTP的OCX,可以直接应用。有了这些OCX,为什么还要自己从头开发呢?因为商业的OCX并不能保证它是功能齐全和稳定的,特别对于email来说,有许多非标准(或准标准)的因素存在,比如汉字的编码方法,这些国外出的OCX一般都没有考虑到。而且从稳定性上来说,email软件须要适应不同的网络和服务器,只有自己开发的,才能不断地改进。Internet上甚至还提供一些免费的源代码。这些代码只能作为参考,不要指望它们能解决所有问题。

___________________________________________________
上面是张小龙先生的原话.
 
我再说明一下
我要做的不是Foxmail,也不是Outlook,更加不是bulk emailer
我要做的不是我本地接收服务器上的邮件的软件
我要的是放在服务器上运行,接收其他服务器发送过来的邮件

大家明白我的意思了吗?
 
收信服务器要能够收到别人发过来的电子邮件
按你的要求,是要写一个SMTP服务器,接受其他服务发来的邮件
以下是所有STMP命令:
HELO <SP> <domain> <CRLF>
MAIL <SP> FROM:<reverse-path> <CRLF>
RCPT <SP> TO:<forward-path> <CRLF>
DATA <CRLF>
RSET <CRLF>
SEND <SP> FROM:<reverse-path> <CRLF>
SOML <SP> FROM:<reverse-path> <CRLF>
SAML <SP> FROM:<reverse-path> <CRLF>
VRFY <SP> <string> <CRLF>
EXPN <SP> <string> <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
QUIT <CRLF>
TURN <CRLF>
其中 HELO
MAIL
RCPT
DATA
RSET
NOOP
QUIT
为最常用SMTP命令,使用这些命令你可以写出你想要的收信服务器
这些你都可以通过TELNET到任意一台收信服务器,如smtp.163.net上观察

以下是服务器对连接命令的返回代码
211 System status, or system help reply
214 Help message
[Information on how to use the receiver or the meaning of a
particular non-standard command; this reply is useful only
to the human user]
220 <domain> Service ready
221 <domain> Service closing transmission channel
250 Requested mail action okay, completed
251 User not local; will forward to <forward-path>

354 Start mail input; end with <CRLF>.<CRLF>

421 <domain> Service not available,
closing transmission channel
[This may be a reply to any command if the service knows it
must shut down]
450 Requested mail action not taken: mailbox unavailable
[E.g., mailbox busy]
451 Requested action aborted: local error in processing
452 Requested action not taken: insufficient system storage

500 Syntax error, command unrecognized
[This may include errors such as command line too long]
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
550 Requested action not taken: mailbox unavailable
[E.g., mailbox not found, no access]
551 User not local; please try <forward-path>
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
[E.g., mailbox syntax incorrect]
554 Transaction failed

详细内容你可以参考RFC 821协议
 
pcsunflower>>
用這些就可以嗎?不用Delphi了?
我該怎麽辦呢?幫幫忙吧!
 
各位大哥大爷老爹
帮帮我吧!
 
使用ServerSocket对每一个命令进行处理
 
如何用ServerSocket处理命令呢?
 
后退
顶部