一、电子邮件系统简介

1、电子邮件的诞生

麻省理工学院的 Ray Tomlinson 博士在参与阿帕网计划的科研项目过程中,他觉得有必要设计一种类似于“信件”的传输服务,并为信件准备一个“信箱”,这样即便对方临时离线也能完成数据的接收,等上线后再进行处理即可。

于是,Ray Tomlinson 博士用了近一年的时间完成了电子邮件(Email)的设计,并在 1971 年秋天使用 SNDMSG 软件向自己的另一台计算机发送出了人类历史上第一封电子邮件—电子邮件系统在互联网中由此诞生!

既然要在互联网中给他人发送电子邮件,那么对方用户用于接收电子邮件的名称必须是唯一的,否则电子邮件可能会同时发给多个重名的用户,也或者干脆大家都收不到邮件了。

因此,Ray Tomlinson 博士决定选择使用“姓名@计算机主机名称”的格式来规范 电子信 箱的 名称。 选择 使用 @符号作为间隔符的原因其实也很简单,因为 RayTomlinson 博士觉得人类的名字和计算机主机名称中应该不会有这么一个@符号,所以就选择了这个符号。

2、常见的邮件协议

  • 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP

    用于发送和中转发出的电子邮件,占用服务器的 25/TCP 端口。

  • 邮局协议版本3(Post Office Protocol 3,POP3

    用于将电子邮件存储到本地主机,占用服务器的 110/TCP 端口。

  • Internet 消息访问协议版本 4(Internet Message Access Protocol 4,IMAP4

    用于在本地主机上访问邮件,占用服务器的 143/TCP 端口。


3、专业名词解释

  • 在电子邮件系统中,为用户收发邮件的服务器名为邮件用户***(Mail User Agent,MUA)。

  • 既然电子邮件系统能够让用户在离线的情况下依然可以完成数据的接收,肯定得有一个用于保存用户邮件的“信箱”服务器,这个服务器的名字为邮件投递***(Mail Delivery Agent,MDA),其工作职责是把来自于邮件传输***(Mail Transfer Agent,MTA)的邮件保存到本地的收件箱中。

  • 这个 MTA 的工作职责是转发处理不同电子邮件服务供应商之间的邮件,把来自于 MUA 的邮件转发到合适的 MTA 服务器。相当于网络中的路由器的作用。

一般的网络服务程序在传输信息时就像拨打电话,需要双方同时保持在线,而在电子邮件系统中,当用户发送邮件后不必等待投递工作完成即可下线。

如果服务器(MTA)宕机或对方临时离线,则发件服务器(MTA)就会把要发送的内容自动的暂时保存到本地,等检测到对方邮件服务器恢复后会立即再次投递。

如图所示是从 QQ邮箱 向 谷歌邮箱 发送一份邮件的示意图:

4、邮件系统的工作流程

一个最基础的电子邮件系统肯定要能提供发件服务和收件服务,为此需要使用基于 SMTP 协议的 Postfix 服务程序提供发件服务功能,并使用基于 POP3 协议的 Dovecot 服务程序提供收件服务功能。

这样一来,用户就可以使用 Outlook Express 或 Foxmail 等客户端服务程序正常收发邮件了。电子邮件系统的工作流程如图所示:

二、安装电子邮件系统

注意,该邮件服务是不可以安装在诸如阿里云等服务器上的,因为阿里云禁用了SMTP服务

相关条文如下:

3.1.3.5. 不得将阿里云所提供的云服务器用作虚拟服务器、或用作磁盘空间出租,或用作非法***服务器(Proxy)或邮件服务器(根据阿里云《云平台安全规则》,未经报备许可云服务器不得用于连接SMTP服务发送邮件,阿里云默认将禁止云服务器用于SMTP服务)。

本教程基于 Ubuntu19.10 系统,向下兼容,centOS用户也可以参考本教程,只需要将安装命令的apt改为yum

1、Postfix 简介

Postfix 是一款由 IBM 资助研发的免费开源电子邮件服务程序。它是一种最新的邮件传输***(MTA),又名SMTP服务器,它有两个作用。

  • 它负责将电子邮件从邮件客户端/邮件用户***(MUA)传输到远程SMTP服务器。
  • 它还用于接受来自其他SMTP服务器的电子邮件。

2、安装依赖项

这里是为你的邮件系统的安装的步骤。

2.1、设置主机名

默认情况下,Postfix 使用你的hostname作为你与其他MTA通信的唯一标识,hostname 有两种形式: 一个单独的字符 和 FQDN(Fully Qualified Domain Name,全称);

一般的电脑使用单独的字符的形式作为唯一标识,比如你的名称可能是 linux、debian、ubuntu等。

而服务器通常使用 FQDN 作为唯一标识,我们使用 FQDN,因为我们是作为邮件服务器。FQDN包括两部分:node namedomain name

比如:mail.ubuntuwsuo.com;

这里的 mail 就是 node name,ubuntuwsuo 就是domain name。

FQDN 会作为你邮件的banner显示在头部。有的MTA拒收没有FQDN的服务器发送的邮件,甚至有的MTA还会去DNS查询你的邮件服务器的域名是否已经解析。

使用如下命令查看你 FQDN 形式的hostname

hostname -f

我的是ubuntu

如果你的还没有,使用hostnamectl命令创建一个:

sudo hostnamectl set-hostname your-fqdn
//your-fqdn替换为你想要的名称

通常情况下的FQDN为:mail.yourdomain.com,当然你也可以在Postfix的配置文件中修改myhostname来改变你的FQDN。

2.2、设置DNS解析

可以添加一条@记录解析到你现有的域名。

3、安装Postfix

终于到了动手环节,也是最简单的环节,让我们一起安装吧:

sudo apt update
sudo apt install postfix -y


不过俺已经安装过了,为了演示效果,我执行卸载命令,你以后想卸载了也可以执行同样的命令:

sudo apt remove postfix
sudo apt clean


卸载完毕,再次安装。


选择Internet Site

  • No configuration:表示安装过程将不会配置任何参数。
  • Internet Site:表示使用Postfix向其他MTA发送电子邮件并从其他MTA接收电子邮件。
  • Internet with smarthost:表示使用后缀来接收来自其他MTA的电子邮件,但是使用另一个智能主机将电子邮件中继给收件人。
  • Satellite system:表示使用智能主机发送和接收电子邮件。
  • Local only:表示电子邮件仅在本地用户帐户之间传输。

接下来,输入系统邮件名称的域名,即@符号后的域名。例如,我的电子邮件地址是wsuo@ubuntu.net ,因此我输入ubuntu.net作为系统邮件名。

注意这里清冽建议输入ubuntu.net作为域名,因为其他的容易被拦截,而ubuntu.com作为保留域名不可以使用,如果你输入了其他的导致不可以发信,别怪我没提醒你,你只能重新删除安装,再配置了。

一旦安装,Postfix将自动启动并/etc/postfix/main.cf生成一个文件。现在我们可以使用以下命令检查Postfix版本:

postconf mail_version

我的是mail_version = 3.4.5;

使用下面的命令查看监听的端口信息:

sudo netstat -lnpt
//如果你没有安装netstat,使用命令安装:sudo apt install net-tools


安装完成。

三、配置电子邮件系统

1、查看邮件命令

Postfix安装完成之后会在sbin目录下生成很多二进制文件,这些都是可执行命令:

dpkg -L postfix | grep /usr/sbin/

2、配置防火墙

ubuntu默认不开启防火墙,如果你已经开启了ufw防火墙,你需要打开25端口以便于 Postfix 可以接受其他 SMTP 发送的邮件。

//查看防火墙的状态
sudo ufw status

//打开25端口
sudo ufw allow 25/tcp


当然你也可以选择直接关掉防火墙,但是不建议这么做:

sudo ufw disable

3、检查连接

下面检查一下端口的情况:
首先执行安装命令安装nmap,已经有的可以跳过,nmap主要进行端口扫描

sudo apt install nmap

Nmap (“Network Mapper(网络映射器)”) 是一款开放源代码的 网络探测和安全审核的工具。它的设计目标是快速地扫描大型网络,当然用它扫描单个 主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,那些 主机提供什么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息), 它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核, 许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。

然后执行命令换成你的ip地址:

sudo nmap 192.168.0.104


你会看到,25端口已经指定为smtp 服务。
然后尝试着连接下腾讯的邮件服务器:

telnet imap.qq.com 25


这样就能保证我们的 Postfix 是可以发送邮件的了。

4、发送测试邮件

我们现在可以使用命令行来发送邮件了。

加入你的用户名是wsuo,那么就可以使用wsuo@yourdomain.com作为邮箱地址来发送邮件,也可以使用root@yourdomain.com;你可以使用下面的命令发送邮件:

echo "test email" | sendmail wangsuoo@qq.com

在这个简单的命令中,使用“test mail”作为邮件的主体信息向腾讯邮箱发送了邮件,你可以在邮箱中收到邮件或者在垃圾邮件中找到,你可以发现即使你没有输入发件地址也可以发送,这是因为在安装的时候默认配置了发件地址。

打开/var/log/mail.log可以查看发件信息:

Mar  8 08:36:11 ubuntu postfix/qmgr[18174]: E363B66E82: from=<wsuo@ubuntu.net>, size=242, nrcpt=1 (queue active)
Mar  8 08:36:14 ubuntu postfix/smtp[19413]: E363B66E82: to=<wangsuoo@qq.com>, relay=mx3.qq.com[183.232.93.177]:25, delay=2.2, delays=0.01/0.01/0.28/1.9, dsn=2.0.0, status=sent (250 Ok: queued as )
Mar  8 08:36:14 ubuntu postfix/qmgr[18174]: E363B66E82: removed


你一可以尝试着回复邮件,这样Postfix作为收信方会把邮件存储在本地,输入一下命令查看收件存储的位置:

postconf mail_spool_directory


/var/mail/目录下。

你可以打开配置文件修改hostname

打开 /etc/postfix/main.cf,找到myhostname关键字修改名称:

重启一下:

sudo service postfix restart

如果你没收到,请尝试一下下面的解决方案:

打开日志文件目录可以查看发送信息,一般这里会有错误提示:

cat /var/log/mail.log

如果你的服务器只有Ip地址,没有对应的域名,很可能你也像我一样收不到邮件。因为此处发出的邮件默认发件地址为:你登录服务器的用户名@你服务器的名字,像我的地址就为wsuo@ubuntu。而绝大部分收件人的邮件服务器会对发件电子邮件地址有效性做出判断,如果不与常规域名后缀(如xxx.com, xxx.net等等)一致,会判定为垃圾邮件而丢弃。

所以,进入下一步,配置发件地址:

5、改变发件地址

依次执行以下命令:

//首先打开配置文件
sudo vim /etc/postfix/main.cf
//在最后一行加入
smtp_generic_maps = hash:/etc/postfix/generic
//新建文件并打开
sudo vim /etc/postfix/generic
//格式为
你的用户名@你的服务器名字   你希望对方看到的电子邮件地址
//比如我的电脑是前面的,我想改成后面的就输入:
wsuo@ubuntu   wsuo@ubuntu.net


重启一下,再次发送:

sudo service postfix restart
echo "test email" | sendmail wangsuoo@qq.com

如果还收不到可以改一下之前安装的时候配置的地址

打开sudo vim /etc/postfix/main.cf,找到mydestination,这其中就有你安装的时候配置的邮件域名,现在可以更改为合法的地址:

mydestination = $myhostname, ubuntu.net, ubuntu, localhost.localdomain, localhost

参考文献:
1、《Linux就该这么学》
2、Build Your Own Email Server on Ubuntu: Basic Postfix Setup