电子邮件系统是70后、80后老一代的网民最早接触互联网的入口,当时给别人留一个“伊妹儿”可是最新、最潮的联系方式。时至今日电子邮件非但没有过时,反而在安全认证、个人社交、日常工作中发挥着极其关键的作用,可谓是互联网的基石。了解电子邮件架构,有助于了解整个互联网体系的顶层规划与运行逻辑。可能是技术太老,网上系统介绍电子邮件技术的文章比较少,本系列文章将会详解电子邮件系统的整体架构、工作原理及安全策略,并带大家手把手建设一个符合安全要求的电子邮件系统。
提示:电子邮件系统由于历史悠久,架构整体比较复杂,里面包含很多现代已经使用不多的古早技术,搭建过程的复杂度远远超出本人预期。各组件的学习曲线比较陡峭,其中涉及大量晦涩概念及名词,且对linux操作系统、网络通讯、PKI/TLS 这些知识均需要有一定的了解,需要具备一定的技术能力,遇到问题善用搜索引擎和分析相关日志,否则建议还是使用iredmail这种一站式的软件搭建,或者直接使用各类服务商提供的邮件服务,省心省力。
电子邮件系统历史
说起来有些不可思议,但其实电子邮件诞生的历史是早于互联网的。早期大型机价格昂贵,资源紧缺,当时的科研工作者通过哑终端(Dumb Terminal,只有显示屏和键盘),使用串口接入主机(host)进行工作。关于终端的介绍,可以参考这篇:你真的了解终端吗?。为了方便接入同一主机的工作人员沟通协作,麻省理工学院于1965年开发了世界第一个消息发送程序MailBox。当时的操作系统unix是多任务操作系统,不同用户通过不同的终端登入,可以检查收取邮件或者发送邮件,这就是电子邮件系统的雏形。这个设计对于后世产生了深远的影响,直到今天类unix/linux系统中仍然保留了MaiBox这一设计,请记住这个mailbox的概念,很重要,后面会反复提到。
尽管MaiBox解决了消息发送收取的问题,但仅仅局限在同一计算机下。那么如何才能让不同计算机间能发送消息呢?这里就要请出大名鼎鼎的英特网的前身阿帕网了。20世纪60年代,美苏两国正处于冷战时期。美国军方认为中心化部署的指挥中心风险太高,一旦遭受毁灭性打击则全国的军事系统将会陷于瘫痪,故而迫切需要一种去中心化的网络架构,各个节点通过网络设备互相连接,这样某个节点受到打击,其余节点仍可以正常工作,从而在战争中立于不败之地。这项计划叫做ARPANET,它是世界上第一个投入运营的封包交换网络。1969年底阿帕网正式投入使用,最初的阿帕网由美国西海岸的4个节点构成,分别是加州大学洛杉矶分校(UCLA),斯坦福研究院(SRI),加州大学圣巴巴拉分校(UCSB)和犹他大学(UTAH)。后续又陆续增加了多个节点,这就是互联网的雏形。
麻省理工学院的Ray Tomlinson博士也参与到了阿帕网计划的科研项目中,他觉得有必要设计一种类似于“信件”的传输服务协议,使得各个主机的MaiBox可以利用阿帕网进行跨主机的邮件传输。于是,Ray Tomlinson博士用了近一年的时间完成了电子邮件(Email)的设计,并在1971年秋天使用SNDMSG软件向自己的另一台计算机发送出了人类历史上第一封电子邮件—电子邮件系统在互联网中由此诞生!
既然要在互联网中给他人发送电子邮件,那么对方用户用于接收电子邮件的名称必须是唯一的,否则电子邮件可能会同时发给多个重名的用户,也或者干脆大家都收不到邮件了。因此,Ray Tomlinson博士决定选择使用“姓名@计算机主机名称”的格式来规范电子信箱的名称。选择使用@符号作为间隔符的原因其实也很简单,因为Ray Tomlinson博士觉得人类的名字和计算机主机名称中应该不会有这么一个@符号,所以就选择了这个符号。
电子邮件系统整体架构
这张图非常重要,展示了电子邮件系统运作的核心架构,后面的文章中会反复用到,理解了这张图就理解了电子邮件系统运行的底层原理。图中内容分别介绍如下:
MailBox
类Unix/Linux 系统中的mailbox格式主要有两种:mbox格式和Maildir格式,通常存储在 /var/mail 或者 /var/spool/mail 目录下。
- mbox格式:
mbox是一种简单的文件格式,它将所有的邮件存储在单个文件中。mbox文件的每行都以“From ”开头,后跟发件人的信息和日期。这就是为什么mbox文件有时也称为“From ”文件。在mbox文件中,每个邮件都由两个“From ”行分隔开。在Unix中,这些行通常由一个冒号和一个换行符组成,例如“From: sender@example.com\n”。为了避免意外中断,邮件正文中的所有“From ”行都必须被转义。
- Maildir格式:
Maildir格式是一种使用多个目录来组织邮件的格式。Maildir格式将每个邮件存储在单独的文件中,这使得它更易于管理和备份。Maildir格式包括三个目录:cur,new和tmp。
- cur目录包含已读邮件的副本。
- new目录包含未读邮件的副本。
- tmp目录用于临时存储邮件,直到邮件完全传输到目标位置为止。
Maildir格式还包含一些附加信息,例如邮件的状态(例如已读或未读)和邮件的标记(例如已回复或已删除)。
无论是mbox还是Maildir格式,都可以使用各种邮件客户端程序进行读取和管理。邮件客户端程序通常支持这两种格式中的一种或多种。
邮件角色
- MUA(Mail User Agent)接收邮件所使用的邮件客户端,使用IMAP或POP3协议与服务器通信;例如Foxmail或Outlook。
- MTA(Mail Transfer Agent) 通过SMTP协议发送、转发邮件;例如Linux中的sendmail和postfix。
- MDA(Mail Deliver Agent)将MTA接收到的邮件保存到磁盘或指定地方,通常会进行垃圾邮件及病毒扫描;
- MRA(Mail Receive Agent)负责实现IMAP与POP3协议,与MUA进行交互;
邮件协议
- SMTP(Simple Mail Transfer Protocol) 发送邮件所使用的标准协议, 普通协议使用25端口,SSL/TLS 协议(SMTPS)使用465端口,STARTTLS 协议(smtp-submission)使用587端口;
- IMAP(Internet Message Access Protocol) 接收邮件使用的标准协议之一, 普通协议使用143端口,SSL/TLS 协议(IMAPS)使用993端口;
- POP3(Post Office Protocol 3) 接收邮件使用的标准协议之一,普通协议使用110端口,SSL协议(POP3S)使用995端口;
其中pop3属于比较早期的协议,需要把邮件全部下载到本地,且本地的操作比如删除、打标等不能回传到服务端,现在已经比较少使用,imap的操作是双向的,即客户端本地操作可以同步到服务端,目前主流的邮件服务器都是使用的smtp及imap协议,有些出于历史兼容性考虑也会支持pop3。
有些文章中说smtp协议用于发送邮件,pop3/imap协议用于接收邮件,严格意义上来说是不准确的。上述的说法,视角是站在客户端的,即邮件客户端(MUA)使用smtp协议发送邮件,使用pop3/imap协议接收邮件。smtp协议定义的是邮件传输标准,即smtp协议即可以发邮件,也可以收邮件。事实上,各个MTA之间都是使用smtp协议来传输邮件,比如新浪邮箱传输邮件到谷歌邮箱:
上述流程中,谷歌的MTA作为接收方使用smtp协议接收新浪传过来的邮件。
邮件传输完整流程
搞清前面说的那些概念,对照电子邮件系统架构图,邮件发送和接收的整体流程如下:
- step 1:发送方邮件客户端(MUA)通过smtp协议发送邮件至发送方MTA
- step 2:发送方MTA查询接收方邮件域名的dns mx记录,获取接收方MTA的ip地址
- step 3:发送方MTA通过smtp协议发送邮件给接收方MTA
- step 4:接收方MTA将邮件发给MDA(投递代理)
- step 5:MDA将邮件存入主机的 MailBox 文件中
- step 6:接收方邮件客户端(MUA)通过imap/pop3请求MRA接收邮件
- step 7:MRA 从主机的 MailBox 中读取最新邮件
常用邮件软件对应关系
MUA:outlook、thunderbird、Mac Mail、Foxmail、mail/mailx(命令行)、mutt(命令行)
MTA:sendmail、postfix
MDA:procmail、dropmail
MRA:dovecot
一般自建的话,只需要 postfix + dovecot,我们基于这些软件搭建的电子邮件系统架构如下图所示:
对照电子邮件系统架构图,postfix扮演MTA、MDA角色,dovecot扮演MRA角色
自建准备工作
为什么要自建邮件服务器?我这里罗列了一下好处(不是我说的,是ChatGPT说的啊):
- 控制权:自建邮件服务器使您完全掌控邮件的管理和存储。您可以自由配置服务器以满足特定需求,包括邮件大小、邮箱数量、存储限制等。此外,您也可以对安全性进行控制,例如加密邮件、过滤垃圾邮件等。
- 可定制性:与使用第三方邮件服务不同,自建邮件服务器提供了更多的自定义选项,可以根据个人或企业的需求进行调整。例如,您可以在自建邮件服务器上设置自定义的域名、标识、邮件模板等。
- 数据隐私:自建邮件服务器可以更好地保护您的数据隐私,因为您可以自己控制存储在服务器上的所有数据,而不必将其托管给第三方服务提供商。此外,自建邮件服务器还可以使用加密协议,如SSL或TLS,以保护数据传输的隐私。
- 成本节约:使用自建邮件服务器可以节省成本,尤其是在长期使用中。虽然设置自建邮件服务器需要一些初始投入,但长期来看,与使用第三方邮件服务相比,自建邮件服务器可能会更具经济性。
自建服务器需要准备如下资源,相关资源申请方法不在本文档讨论范围内,请自行研究:
- 一个具备公网独立ip的vps,配置不用太高,各大公有云均可
- 一个域名,邮件系统搭建需要配置各类dns记录,后面会说
- 证书,可使用acme.sh 等自动化工具签发 Let’s Encrypt 免费证书
如果你看到这里还没有头晕,仍然想继续,那请继续看下一篇:详解电子邮件系统系列之二:SMTP、POP3及IMAP协议介绍
参考资料
1、第15章 使用Postfix与Dovecot部署邮件系统。
https://www.linuxprobe.com/chapter-15.html
2、基础邮件原理(MUA,MTA,MDA)
https://www.cnblogs.com/yechanglv/p/6947117.html