专栏首页北京马哥教育邮件原理你真的造吗

邮件原理你真的造吗

一、前言

虽然现在QQ、微信等即时聊天工具原来越盛行,但是在企业与企业之间大部分还是会使用邮件系统进行信息交换。所以作为运维人员,更需要了解这个技术的原理。下面会慢慢介绍邮件的组件功能,将其组成部分。以及邮件的工作原理。

小贴士:邮件系统是一个比较复杂的系统,过程比较繁琐,但了解之后对邮件系统搭建将会起到很大的作用。所以请耐心查阅,让螃蟹慢慢跟您介绍。


二、邮件服务器与DNS之间的关系

最开始互联网传递邮件十分简单。因为最开始的计算机都是大型机主机,并保持24小时不停机,用户也是实时在线,而且每台主机都有固定的IP地址。

如果www.pangxie.com主机中的eric用户想法邮件给www.windchaser.com主机里的wqp用户,他只需要以 发件人为 eric@www.pangxie.com 收件人为 wqp@www.windchaser.com 发送邮件即可。

但是随着小型电脑PC盛行,电脑PC无需24小时开机,导致用户不可能一直在线。如果在eric想发邮件给wqp的时候,这时wqp用户所在的电脑早已关机,那么eric将无法传递邮件给到wqp用户。

基于这种情况下,我们就迫切需要一台邮件服务器为所在域内的所有电脑或服务器统一接收发和管理邮件。

演变到后来,我们现在发送邮件将不需要再直接写一台主机了,而是@域名的格式即可。但是这样有存在一个问题,域本身是无法接收邮件的。所以我们必须找到域中用来处理邮件的服务器是谁,这时就需要和DNS联系了。

DNS根据MX记录来查询邮件交换器的。 MX:Mail eXchange

当DNS上存在多个MX记录的主机的时候怎么办,如何判断哪台才是主服务器,哪台是辅助的服务器呢?这时就是根据DNS的邮件级判断了。 DNS上定义的值越小,其优先级越高。但是如果过域里有多台邮件交换器,他们之间工作是负载均衡,还是热备机备份呢?请看下图介绍

①当发件方需要发送邮件给对方邮件服务器,需要向DNS请求查询对方邮件服务器的MX记录。②DNS通过查询MX表信息。③将查询到的MX信息返回给发送方。④发送方根据优先级,将邮件投递给对方优先级高的邮件服务器(mail1)。⑤如果主邮件服务器过于繁忙,或者不在线的时候,会将邮件投递给辅的邮件交换器(mail2)上。⑥待主邮件服交换器空闲下来后,mail2会将代替接收下来的邮件再转给主邮件交换器(mail1)。

小贴士:辅助交换器接受到邮件并不能保存邮件。而是这个辅助交换器会等到主邮件交换器空闲的时候把代替它接受下来的邮件在转给主邮件交换器。所以任何邮件处理都是主邮件交换器处理的。所以我们实际情况下,如果有2台服务器做邮件交换器,性能比较高的应该为主的。


三、邮件传输所需的程序

MUA(Mail User Agent):功能是向外发送邮件的程序,以及提供用户浏览与编写邮件的功能。

MTA(Mail Transfer Agent):(可以理解为smtpd服务器)帮忙将用户的邮件传递出去或接收进来。

MDA(Mail Delivery Agent):将接收下来的邮件存放到对应用户邮筒当中的程序。

通过分析MTA所收到邮件的表头或内容,来判断此邮件是属于哪个用户,然后决定将此邮件投递给哪个用户的邮筒里

MRA(Mail Retrieval Agent):通过MRA服务器提供的邮政服务协议(POP)来接收自己的邮件


四、邮件发送过程

①用户eric想发送邮件给wqp,通过终端登录到mail.pangxie.com服务器上,编写一篇邮件,以发件人为eric@pangxie.com,收信人为wqp@windchaser.com发送邮件 ②mail.windchaser.com主机调用smtp程序准备向外发送邮件 ③smtp看到是通过域名发送邮件,smtp会调用DNS客户端 ④DNS客户端会向DNS服务器查询smtp所需求的域名信息 ⑤DNS服务器通过查询MX记录查找到域名所指向的邮件服务器信息。 ⑥DNS服务器将所查询到的信息返回给DNS客户端 ⑦smtp收到DNS对方MX信息之后,开始和对方邮件服务器通过TCP/IP三次握手,最终和邮件服务器里的smtpd服务建立联系后,将邮件传递给了mail.windchaser.com服务器主机。 #小贴士:smtpd是邮件服务器的守护进程,监听在TCP的25号端口 ⑧当smtpd收到mail.pangxie.com主机发来的邮件,如果是本地用户的邮件,它将会继续⑨,否则它会将它再继续传递出去(这个就是开放式中继) ⑨当smtpd接收下来邮件之后,发现此邮件目标正是本地用户,它会调用MUA,将此邮件存放到邮筒(MailBox)里去。此邮筒的路径一般为/var/spool/mail下以此用户的名字命名的文件 ⑩wqp用户使用终端登录到mail.windchaser.com服务器上,通过mail命令查收邮件 ⑪查收的邮件会自动移至用户家目录一个叫mbox的文件夹。


五、开放式中继代理(open relay)

如果eric发的邮件不是发给wqp@windchaser.com,而是发给peng@a.com,但是这封邮件被本地的smtp程序发 给了mail.windchaser.com服务器了。mail.windchaser.com服务器接收了此邮件后发现不是自身域里的用户,就会通过查 询DNS后找到a.com对应的MX记录所指向的邮件服务器,然后再次转发出去。这个就是中继代理的功能。

但是我们会发现一个问题,为什么eric的smtp程序没有直接将邮件投递给a.com域里的邮件服务器呢?原因是因为以前的互联网的网络 是很不可靠的,为了保证邮件能顺利的传递给对方,每个邮件服务器都是开放中继代理功能。如果mail.pangxie.com邮件服务器认为自己的通路不 太可靠,而发现mail.windchaser.com的通路比较可靠,那么它就会将邮件投递给mail.windchaser.com服务 器,mail.windchaser.com服务器收取邮件后发现不是本地域里的用户,就会友好的将此邮件再次投递出去,最终投递给a.com域。而 windchaser.com就是开放式中继的服务器。开放式中继固然方便了正常邮件的发送,但是也造成了另一个负面的地方,那就是垃圾邮件。


六、电脑客户端(MUA)发送邮件

在之前我们介绍了MUA,发现用户想发送邮件都是通过终端连接到服务器上,然后在使用编辑器发送邮件。但是在我们日常工作中却不会是这样。例如我们在使用QQ邮箱、126邮箱时候,就不可能直接连接上它们服务器上发送邮件,而是通过电脑上的客户端发送邮件。

具体流程如下:

①用户在电脑中打开MUA程序。代表程序有Outlook、Foxmail。 ②当用户编写好邮件之后,在发送邮件之前注明了为我们提供向外发送邮件功能的邮件服务器地址,开始调用本地的smtp程序。 ③本地smtp根据用户所提供的邮件服务器地址通过smtp协议开始和邮件服务器(mail.windchaser.com)建立连接,将邮件发送给本地域邮件服务器。 ④邮件服务器收到此邮件后,开始检查邮件的目标地址是否是本地域用户。如果是则执行第④步,如果不是执行第⑤步。 ⑤通过MDA分析邮件的表头等信息,最终将邮件投递到公共的邮筒里(MailBox)。 ⑥通过查询DNS,解析目标邮件服务器对应的MX记录,最后将邮件投递出去。之后的步骤和上面一致,这里不再多做介绍。

小贴士:这里可以发现,其实mail.magedu.com也是有开放了中继功能,所以邮件服务器还是需要开放本地网络的中继功能。仅仅为本地网络中的客户端中继邮件,而mail.a.org发现收件人是本地域里的用户,会无条件接收下来。


七、通过MUA接收邮件(POP3,IMAP4)

由本地的smtpd服务接收下来邮件,由MDA投递放到用户对应的邮筒里去。这时会建立另一个服务,这个服务器能够实现让用户通过账号密码 连接此服务,此服务能够根据用户的账号密码验证用户的身份,并在在验证之后以用户的身份到到邮筒里去取出用户的邮件,并且把它返回给用户,这个就叫做 MRA(邮件检索或邮件取回代理) 而整个服务就是pop3或imap4服务。

详细流程如下:

①本地电脑调用MUA程序。 ②wqp用户将自己的账号和密码,通过pop3协议去连接POP3服务。 ③POP3服务通过验证用户身份,验证通过之后,调用MRA程序,使用用户的账号信息提交给MailBox。 ④MailBox根据MRA程序请求,取出用户的邮件,最终将邮件返回给用户。

小贴士:这个流程就说明为什么我们在配置MUA的时候不止需要配置发送的邮件服务器,也要配置接收邮件的服务器。


八、webmail,通过网页形式收发邮件

在使用网页形式收发邮件前,邮件服务器必须首先建立web服务器,通常是通过CGI脚本为用户提供脚本。

用户就能不在通过MUA客户端程序才能发送和接收邮件,而只需要在本地打开浏览器,输入对应服务器地址,并提供用户的账号密码,当邮件服务 器认证通过之后,CGI脚本就会把用户账号信息传送给MRA,由MRA到MailBox收取对应用户的邮件,然后再网页界面展示给用户。

如果用户需要发邮件的话,在浏览器中点击写邮件,就会打开一个编辑器,写完之后点击发送,我们CGI就会调用本地的smtp,将邮件发给MTA,由MTAX向外进行发送。这个程序就叫做WebMail


九、关于发送邮件的身份验证

虽然看上去邮件发送流程已经完备了,但是还是存在另一问题,那就是我们在邮件发送流程中,域里的邮件服务器并没有对发送邮件的用户身份进行验证,而仅仅是 对内网的IP地址进行中继代理放行。那么假设公司有人在外地工作,那么该用户的所用网络肯定不是内网的IP地址,邮件服务器检测到不是允许中继的IP地 址,将拒绝将邮件进行转发的。可是他确实是我们公司的用户,这样肯定不和常理。并且还要注意一点,由于IP地址是可以伪装的,有可能会因为内部人员对公司 邮件服务器进行破坏。所以认证用户身份是必不可少的。但是由于smtp过于简单,所以他没有对发送用户进行认证功能,这时就需要借助额外的机制,这个机制 就是SASL。

SASL:Simple Authentication Security Layer简单认证安全层,是一种协议,是一个库文件 ,用户为其他没有认证功能的服务提供认证功能

提供SASL这个功能的软件叫cyrus-sasl,是一个通用组件

小贴士:SASL默认功能是不开启的

详细认证过程请看下图:

①用户向服务器请求发送邮件,并将用户账号密码提供给邮件服务器 ②邮件服务器调用SASL程序 ③SASL只是一个认证框架,本身并没有认证功能。所以需要寻找额外的认证机制。从认证机制中比对用户的账号密码,认证通过则执行第⑤步,否则执行第④步 ④认证不通过,邮件服务器拒绝转发此邮件 ⑤认证通过,邮件服务器根据DNS解析MX记录后,将邮件投递到目标邮件服务器。

小贴士:常用的认证机制还有plain,login,mysql,ldap,这些认证机制都需要一个模块来实现,哪种机制就表明要去哪个库去找账号密码的。


十、关于发送和接收邮件的加密

如果你发送的邮件具有商业秘密或者军事秘密的邮件,不希望别人能查看的到,这时需要对邮件进行加密处理。但是smtp过于简单,根本没有对邮件进行加密的 功能。所以在邮件传递过程中,smtp、pop3、imap4都是明文的。由于此三个协议都属于不同的程序,如果仅对其中一个程序加密是无法保证邮件是安 全的。所以需要分开对加密。

对于pop3和imap4,由于处理方式都是在自己域里,所以相互之间通过协商后可以使用pop3s,imaps加密方式对收件方式进行加 密。但是对于smtp相对很难,因为在邮件传递过程中,smtp不单单会在自身域里传递,而且也会与其他邮件服务器之间传递,所以直接使用加密某个 smtps协议很难实现。

所以smtp需要使用基于S/MIME,GPG的程序对邮件发送过程进行加密。

加密方法如下:

小贴士:加密过程是属于另一个较大的知识范畴,这里不做详细介绍。日后将会更新此相关博客,请耐心等待哈(*^__^*)


十一、关于垃圾邮件和病毒邮件的过滤

由于smtp自身比较简单,而现在对邮件用户危害较大的注意有2种,垃圾邮件和病毒邮件。

常用的反垃圾邮件有spam assassin

常用的反病毒邮件有clamav病毒邮件防护网关

但smtp并不能调用这两种组件来为防范病毒和垃圾邮件,他还需要借用caller机制实现。而caller能够实现让邮件发过来后先要反病毒邮件过滤器过滤一次,要防垃圾邮件过滤一次,如果没有问题了就再向外发。

小贴士:著名的caller有mailscanner、mmedefang、amavised-new。

详细邮件过滤过程如下图:

①eric用户向邮件服务器(mail.pangxie.com)请求发送邮件 ②邮件服务器通过查询DNS的MX记录最终将邮件发往mail.windchaser.com邮件服务器 ③mail.windchaser.com邮件服务器收到邮件之后先调用caller程序 ④caller调用反病毒邮件检测程序,对邮件进行病毒检测 ⑤caller调用反垃圾邮件检测程序,对垃圾邮件进行检测 ⑥如果反病毒邮件程序和反垃圾邮件程序检测结果无误,则mail.windchaser.com服务器将此邮件接收下来放到用户的邮筒里。


十二、总结

1、邮件传输所需的程序:MUA、MTA、MRA、MDA

2、由于smtp过于简单,所以为完善整个邮件过程中需要额外的程序和应用。例如:DNS、web、pop3、imap4、pop3s、imaps、SASL、caller等

3、eric@pangxie.com发送给wqp@windchaser.com的完成过程

备注:此博客为本人学习总结的,写的并不太详细,写的不好或者不对的地方还希望能多多见谅。希望能和各位多多交流。

Via: http://www.178linux.com/archives/7049

文章分享自微信公众号:
马哥Linux运维

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • [干货]邮件原理你真的造吗|螃蟹同学

    一、前言 虽然现在QQ、微信等即时聊天工具原来越盛行,但是在企业与企业之间大部分还是会使用邮件系统进行信息交换。所以作为运维人员,更需要了解这个技术的原理。下...

    小小科
  • HashMap都在用,原理你真的了解吗?

    以jdk1.8为例,hashMap是继承了AbstractMap抽象类,而AbstractMap抽象类是实现了Map接口的。Map是jdk中util工具集合系列...

    刘文正
  • Web Cache原理,你真的造吗?

    一、Web Cache 在介绍Web cache时,我们需要简单介绍缓存的理解 1.1 缓存解释 缓存通常是基于键值对来缓存的,键通过hash计算后,存放于内存...

    小小科
  • 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了。

    程序员追风
  • 嵌入式Linux要学哪些东西?你真的造吗?

    嵌入式Linux要学哪些?一些人总在寻思,怕走了弯路,又怕学的东西离企业需求远。那么今天就请华清远见高级讲师曹大神告诉你,9点浅析嵌入式学习步骤。下面是他本人亲...

    RainMark
  • 原 荐 你真的了解For循环吗?一道For循

    石奈子
  • 你还敢乱点赞吗?

    有的人点赞,是为了让好友知道自己关注他。你看了他原创或者转发的文章,了解了他的动态。你同意他的看法,理解他的抱怨,同情他的遭遇,为他的成就表示高兴……

    王树义
  • 捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?

    2019 年 11 月 26 日,本来应该是无比平静的一天,开开会,改改bug,摸摸鱼之后等着下班。刷着新闻的间隙,手机的消息提示音响了起来,收到了一条邮件,平...

    程序员十三
  • 前端软技能文章收藏

    前端GoGoGo
  • 程序员每天该做的事

      最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多   

    ccf19881030
  • 算法岗位做数据挖掘大多都是抽特征跑跑现成模型”

    这句话,说起来很简单,看起来也很容易,但真的是这样吗? 我列举几点,扩展一下上面这句话: 1、label符合业务场景吗?label准确吗?能够校准吗?放在哪张...

    学到老
  • 算法岗位做数据挖掘大多都是抽特征跑跑现成模型”

    这句话,说起来很简单,看起来也很容易,但真的是这样吗? 我列举几点,扩展一下上面这句话: 1、label符合业务场景吗?label准确吗?能够校准吗?放在哪张表...

    学到老
  • 好物推荐 | 谷歌浏览器插件(Infinity 新标签页)

    最近,在浏览网页的时候总是在想,如果能定义自己浏览器的主页就好了,你是不是和我有同样的想法

    生信技能树
  • 百度2018年春招实习面经,回馈牛客【实习offer已到手】

    写在之前 从2017年10月左右就一直在牛客上刷题,然后计划着找实习。持续关注着牛客网的讨论区,看招聘信息,看面经,看技术交流,就想着要不断充实自己。 几乎每天...

    牛客网
  • 好物分享31-用教育或开发者账户白嫖onedrive并做你的同步盘

    忽然想起来自己的坚果云又要到付费的日子了。摸摸干瘪的口袋,不由得想起来那句老话,家里的余粮不多了。[[08-用坚果云同步你的一切!]]

    北野茶缸子
  • 传感器时代 移动ERP到底怎么设计?

    SAP和用友的续集可能要暂缓一下,我写好的文章需要继续沉睡一段时间,具体什么情况大家都懂,这一篇是我在原来文章的基础上几经修改,去掉了过分刺激厂商词语,其实写此...

    人称T客
  • 【大牛经验】最能激怒程序员的十句话

    最能激怒程序员的十句话 第十名:“加油!我先下班了啦~” ? 作为一个需求方,我提醒你不该说这样的话…… 第九名:“你造嘛,我新电脑的内存有 1 TB!” ?...

    Java帮帮
  • 一行代码,发送邮件

    由于几乎在每个项目开发中都离不开发送邮件功能,所以,我们反感反复造轮子,就随手基于Net.Mail封装的发送邮件代码。这段代码写了很久了,今天拿出来完善了一下、...

    用户8671053

扫码关注腾讯云开发者

领取腾讯云代金券