首页 > 代码库 > 邮件服务(一):基本框架

邮件服务(一):基本框架

背景

电子邮件出现在 1960s 晚期,比打开浏览器就要使用的 HTTP 协议早了 20 年左右,是二十世纪人类最伟大的发明之一。这个古老、经典的框架在网络中运行了五十多年,现今仍然是网络中主要的流量类型之一。

不得不提的是,wiki 上关于中国的第一封电子邮件的记载:1987 年 9 月 14 日 [1]中国第一封电子邮件是由“德国互联网之父”维纳·措恩与王运丰在北京的计算机应用技术研究所发往德国卡尔斯鲁厄大学的,其内容为英文,大意如下:

Across the Great Wall we can reach every corner in the world.

真的是很有远见呢-,-

前几天梳理了电子邮箱相关的协议和框架组件,准备整理成文。一共三篇,本文是基本知识总结,第二篇介绍安全认证和防垃圾邮件的规范,第三篇记录了邮件服务器的搭建实践。

邮件传输所需要的组件

在解释邮件的传送过程前,先简单介绍一些术语(可以结合):

术语

Mail Agent

一般我们将邮件传输中的组件称作 Mail Agent,根据功能的不同,它们包括了:

  • MUA(Mail User Agent):作为客户端程序,负责从服务器接收邮件,向服务器发送邮件。
  • MTA(Mail Transfer Agent):将邮件发送给目的地址的邮件服务器(目的服务器上也有一个 MTA 来做接收)。一般提到的 Mail Server 就是 MTA。
  • MDA(Mail Delivery Agent):根据 MTA 收取的邮件,决定邮件的去向(如果本机就是邮件的目的地址,则放入本地用户邮箱,如果不是,则继续转发)。还可以配置过滤垃圾邮件和自动回复等。
  • Mailbox:存储邮件数据。MDA 会将邮件放到不同用户的邮箱中。一般的,有 mbox、Maildir 和 dbmail 等存储格式。mbox 将所有邮件存放到一个文件中,弊端较多。Maildir 则将邮件存为单独的文件。
  • MRA(Mail Retrieval Agent):负责与 MUA 沟通。

协议

不同 Agent 之间的数据交通都依赖于协议,这些协议包括:

  • SMTP(Simple Mail Transfer Protocol):端口 25,面向连接的传输协议。用于 MUA 向 MTA 发送邮件,以及 MTA 之间互相发送和接收邮件。严格来说,MTA 其实仅是指 SMTP。
  • POP3(Post Office Protocol3):离线协议,MUA 从 MRA 获取邮件使用这一协议。首先验证身份,将邮件传输到 MUA 后,用户 Mailbox 中的邮件会被删除。
  • IMAP(Internet Message Access Protocol):与 POP3 类似,用于从 MRA 收取邮件。不过 MUA 与 MRA 之间双向通信,客户端的改动会反映到服务器上。IMAP 整体上为用户带来更为便捷和可靠的体验,POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与 webmail 之间的双向同步功能很好地避免了这些问题。

其他

  • MX 记录:邮箱服务器 DNS 的 MX 记录指向邮箱服务器。MX 记录可以设定优先级,数字越小的优先级越高。比如如下两条 MX 记录:gmail.com. 1656 IN MX 5 gmail-smtp-in.l.google.com.gmail.com. 1656 IN MX 10 alt1.gmail-smtp-in.l.google.com.
    MTA 会优先选取优先级为 5 的地址发送,如果不成功,再转向优先级低的服务器发送。而较低优先级的服务器只是用作暂存,将邮件保存在待发送的队列中,等主服务器恢复后中继转发到主服务器,以此容错。

  • 中继转发(Relay):邮件从一台 MTA 转发到下一台 MTA,这个操作就成为邮件中继转发。如果所有人都能使用某台 MTA 做中继转发,则这台 MTA 成为 Open Relay。这是很危险的,容易被互联网的邮件流量拖垮,且可能被记录到邮箱服务器黑名单上,坏处多多。需要仔细配置 Relay 规则。

邮件传输实例

从一个简单的应用场景谈起:Biaobiaoqi(简称 B)使用自己的邮箱 hello@biaobiaoqi.me 登陆了自己的 foxmail 邮件客户端,撰写邮件,发送给 shenyapeng(简称 S),S 的邮箱地址是 shenyapeng@gmail.com。S 打开自己的邮件客户端,查收了邮件。

从用户的角度来看,只是简单的将邮件从 B 发到了 S,而实际上邮件在网络中经过了多个协议的传输。其大致流程如下:

  • 1.首先邮件需要从 B 的邮件客户端传送到对应的 biaobiaoqi.me 邮箱服务器
  • 2.biaobiaoqi.me 的邮箱服务器将邮件发送给 gmail.com 邮箱服务器。
  • 3.S 的邮件客户端从 gmail 邮件服务器获取到信收到的邮件。

而更技术的解释如下:

  • 1.B 登陆 PC 上得 MUA(比如 Foxmail、Thunderbird、Outlook 等),撰写邮件。MUA 使用 SMTP 将邮件发送给 B 的邮箱服务器 mail.biaobiaoqi.me。
  • 2.mail.biaobiaoqi.me 的 MDA 检测邮件头信息,发现需要将邮件发送给 gmail.com 邮箱服务器,于是交予 MTA 来做传输。
  • 3.MTA 通过 gmail.com 的 DNS 中 MX 记录,查找到邮箱服务器的 IP 地址(dig mx gmail.com),再向目的地中继转发这封邮件。
  • 4.到达目的 MTA 后,邮件被 MDA 送到 Mailbox 中。MRA 开始工作,供 MUA 收取邮件。
  • 5.S 登陆 MUA,使用 POP3 或 IMAP 协议从 gmail.com 的邮箱服务器 MRA 收取邮件。

无论是邮件客户端跟邮箱服务器之间认证身份,还是邮件数据的传输,都会进行加密。直接暴露在互联网络中是很危险的。安全认证方面的问题会在下一篇讨论,这里先介绍基本的功能协议。要知道最早发明邮件协议时,也并没有将安全问题考虑在内。

主要参考资料

  • 鸟哥的 Linux 私房菜——服务器架设篇
  • MailServerOverview