原理:

A主机某用户给B主机某用户发送邮件,主机A会通过SMTP联系B主机的SMTPD(通常也称作MTA,但由于它有客户端,所以分开写),先问它是否在线,对方给予回复,然后再告诉他邮件来自哪里,对方给予响应,再告诉它邮件发给谁的,对方给予响应,然后再发内容,最后以.结束。这是邮件开始发送,最后到达了SMTPD,SMTPD通过查询会知道这个邮件是发送给本机用户还是发送其它主机的邮件,如果是发送给本机的邮件它会调用本机的MDA把邮件投递到用户的mailbox中,如果不是本机的用户,就帮忙中继到其它主机,其它主机收到了就跟这个过程一样。

随着计算机的发展pc机出现了,通信方式不可能像以前那样了,因为PC都安装SMTP与SMTPD这个本身就挺复杂,再次pc机不会24小时开着的,于是便有了以下模型:

用户在某网站上申请一个账户,当用户需要发信时用户会通过本机的MUA发送给网站的SMTPD,SMTPD发现这个邮件是发送给本地主机,就通过MDA,把邮件投递到用户的邮箱中,如果发现是发给别的主机或域的就中继出去。当用户需要收取邮件的时候,MRA会要求用户验证,如果通过了验证,MRA会替用户去用户的邮箱把邮件取回来然后传递给用户的MUA。整个过程是这样的。

由于SMTPD是位热心的同志,凡是到它那的邮件如果是它主机用户的它就收下然后投递到用户邮箱,凡是不是它用户的它就热心的帮忙转发,早期垃圾邮件横行也有一部分是这个原因,所以现在基本上所有的邮件服务器都关闭了开放式中继(openrelay),只给本机或本域的用户转发邮件,但是问题有出现了,以前可以凭来源IP可以判断是不是本机或本域的用户,现在都是基于虚拟用户的(每个用户注册的都是系统用户啊多不安全啊),无法基于IP判断了,于是引入了另一个认证机制SASL(Simple Authentication Secure Layer ),当用户需要发送邮件的时候,SMTPD会调用SASL来验证,如果验证通过了就给你中继,如果通不过那么对不起,去找别人吧。

说了半天MUA,MTA等等之类的大家估计看晕了,下面来解释一下他们是什么:

名称

全名基于协议作用常见软件
MUAMail User Agent 用户邮件代理 替用户收发邮件的

Outlook Foxmail Thunderbird mutt

MTAMail Transfer Agent 邮件传输代理SMTP服务器中接受邮件

Sendmail qmail   postfix(IBM)  exchange

MDAMail Deliver Agent 邮件投递代理 把SMTP收到的邮件投递的用户邮箱

Procmail  maildrop

MRAMail Retrival Agent邮件检索代理POP3/IMAP帮用户去邮箱取邮件

dovecot courier-imap cyrus-imap

下面继续来说,用户登陆验证,收发邮件的时候都是明文的,所以这个极不安全,于是便有了基于SSL的POP3S,IMAPS,有童鞋问了为什么没有STMPS呢?其实这个真有只不过没人用,为什么呢,如果用SMTPS的话所有的MTA都得使用,否则是毫无意义的。当用户申请账号时,服务器就会把他们申请的账号与密码等信息保存到一个文件当中,当需要验证时MTA调用SASL去文件中验证,MRA会自己去文件中验证,当用户很多时将账号密码放到文件中显然是不合适的,第一速度慢,第二不易于管理,于是便用到数据库,将所有的用户资料保存到数据库中,需要的时候去数据库中验证。由于SASL直接调用数据库验证实现比较困难,于是便借助一个库来完成,为了让用户不用安装像outlook那样的客户端,于是有了webmail,只需要有浏览器便可管理邮件。下面我们挑选的软件组合套装为:

MTApostfix
MUAOutlook与mutt
MDApostfix自带的
MRAdovecot
SASLCyrus-SASL
数据库MySQL
调用的验证库Courier-authlib
webmailextmail,extman

于是便有了以下经典的完整流程:

用户用OutlookExpress通过postfix发送邮件时,postfix时会调用Cyrus-SASL的函数库,Cyrus-SASL会调用Courier-authlib这个库去MySQL中验证,如果验证通过就通知postfix验证通过,postfix收到后就允许用户发送邮件了,用户发送邮件,postfix收到后,分拣邮件,把发往它负责的域中的邮件通过调用自带的MDA投递用户邮箱Mailbox中。当用户需要收取邮件的时候,OutlookExpress会联系dovecot,dovecot会要求用户验证,当用户发送账号密码后,它自己会直接调用MySQL来验证,如果通过验证,dovecot会去用户的mailbox中把用户的邮件取过来发送给Outlook,用户就收到邮件了。当用户用浏览器来收发邮件时,Extmail会要求用户验证,当用户输入账号密码后它自己会去mysql中验证是否通过,如果通过用户登录成功,以后收发邮件就不用再验证了,当用户发送邮件时Extmail用自己调用Postfix与Dovecot给用户发送与接收邮件,整个过程结束了。

一步步来构建这个系统,见下一节http://laoguang.blog.51cto.com/6013350/1050936