在Ubuntu22.04上搭建自己的电子邮件服务器:Postfix基本设置

邮局服务器基础  ·  2025-02-22

关于Postfix

Postfix是一款先进的邮件传输代理(MTA),也就是SMTP服务器,它有两个主要功能:

  • 负责将电子邮件从邮件客户端/邮件用户代理(MUA)传输到远程SMTP服务器。
  • 也用于接收其他SMTP服务器发送的电子邮件。

Postfix由Unix和安全专家Wietse Venema开发。它易于使用,在设计时充分考虑了安全性和模块化,每个模块都以完成工作所需的最低权限级别运行。Postfix与Unix/Linux紧密集成,不会提供Unix/Linux已经具备的功能。无论是在简单环境还是高负载环境下,它都非常可靠。

Postfix最初是为了替代Unix上的传统SMTP服务器Sendmail而设计的。相比之下,Postfix更安全,也更易于配置。它与Sendmail兼容,所以如果你卸载Sendmail并替换为Postfix,你现有的脚本和程序将继续无缝运行。

选择合适的托管提供商

找到一个适合电子邮件托管的VPS。该VPS需要支持25端口。不支持25端口的VPS无法发送邮件。同时你还需要一个域名,域名你可以在阿里云,腾讯云或者namecheap上注册。

安装Postfix前的准备工作

设置Ubuntu服务器的正确主机名

默认情况下,Postfix在与其他MTA通信时,会使用服务器的主机名来标识自己。主机名有两种形式:单个单词和完全限定域名(FQDN)。

单个单词形式主要用于个人电脑。你的Linux家用电脑可能被命名为“linux”、“centos”、“ubuntu”等。FQDN通常用于面向互联网的服务器,我们的邮件服务器也应该使用FQDN。它由两部分组成:节点名和域名。例如:mail.rocketssend.com就是一个FQDN,“mail”是节点名,“rocketssend.com”是域名。FQDN会出现在smtpd banner中。如果你的Postfix在smtpd banner中没有提供FQDN,一些MTA会拒绝接收邮件。有些MTA甚至会查询DNS,查看smtpd banner中的FQDN是否解析到你的邮件服务器的IP地址。

输入以下命令查看你的主机名的FQDN:

hostname -f

如果你的Ubuntu服务器还没有FQDN,可以使用hostnamectl来设置一个:

sudo hostnamectl set-hostname your-fqdn

邮件服务器常用的FQDN是“mail.yourdomain.com”。设置完成后,你需要注销并重新登录,才能在命令提示符中看到这个变化。

为你的邮件服务器设置DNS记录

你需要前往你的DNS托管服务提供商(如阿里云,NameCheap),设置DNS记录。

MX记录

MX记录用于告知其他MTA,你的邮件服务器“mail.yourdomain.com”负责处理你的域名的电子邮件投递。例如:

MX    @           mail.rocketssend.com

MX主机常见的名称是“mail.yourdomain.com”。你可以指定多个MX记录,并为你的邮件服务器设置优先级。数字越小,优先级越高。这里我们只使用一个MX记录,并将优先级值设为“0”(取值范围是0 - 65535)。

注意,创建MX记录时,你应该在名称字段中输入“@”或你的顶级域名,如下所示。顶级域名是没有任何子域名的域名。
mail.rocketssend.com handles mail for rocketssend.com.
Type    Priority    TTL    MX Name    Mail server
MX      0           Auto   rocketssend.com    mail.rocketssend.com

A记录

A记录用于将FQDN映射到一个IP地址。例如:

mail.rocketssend.com        <IP-address>

AAA记录

如果你的服务器使用IPv6地址,最好也为“mail.yourdomain.com”添加AAA记录。例如:

mail.rocketssend.com        <IPv6-address>
提示:如果你使用Cloudflare DNS服务,在为“mail.your-domain.com”创建A和AAA记录时,不应启用CDN(代理)功能。Cloudflare不支持SMTP或IMAP代理。

PTR记录

指针记录(PTR记录)用于将IP地址映射到FQDN,它是A记录的对应记录,用于反向DNS(rDNS)查找。

通过PTR记录进行IP地址的反向解析有助于阻止垃圾邮件发送者。许多MTA只有在确定服务器确实负责某个域名时,才会接受电子邮件。你一定要为你的电子邮件服务器设置PTR记录,这样你的邮件才更有可能进入收件人的收件箱,而不是被当作垃圾邮件。

要检查某个IP地址的PTR记录,可以使用以下命令:

dig -x <IP> +short

或者

host <IP>

PTR记录不由你的域名注册商管理,而是由给你分配IP地址的机构管理。也就是VPS 服务商,所以你必须在服务商的控制面板中为你的IP地址设置PTR记录。其值应该是你的邮件服务器的主机名:“mail.your-domain.com”。如果你的服务器使用IPv6地址,也需要为IPv6地址添加PTR记录。

注意:Gmail实际上会检查PTR记录中指定主机名的A记录。如果主机名解析到的IP地址与PTR记录中的IP地址相同,Gmail就会接受你的邮件;否则,它将拒绝你的邮件。

完成上述所有设置后,我们就可以开始配置Postfix了。

安装Postfix

在你的Ubuntu服务器上,运行以下两条命令:

sudo apt-get update
sudo apt-get install postfix -y

安装过程中,你会被要求选择邮件配置类型。通常,你应该选择第二种类型:“Internet Site”。

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

接下来,输入你的系统邮件名,也就是@符号后面的域名。例如,我的电子邮件地址是[email protected],所以我输入“rocketssend.com”作为系统邮件名。这个域名会被附加到没有指定域名的地址上。注意,如果你输入一个子域名,如“mail.your-domain.com”,你将能够接收发往“@mail.your-domain.com”地址的邮件,但无法接收发往“@your-domain.com”地址的邮件。

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

postconf mail_version

在Ubuntu 22.04上,Postfix的版本是3.6.4,Ubuntu 20.04预装的版本是3.4.10。

“ss”(Socket Statistics)实用工具可以告诉我们,Postfix主进程正在监听TCP 25端口。

sudo ss -lnpt | grep master

在防火墙中打开TCP 25端口(入站)

需要打开入站TCP 25端口,这样Postfix才能接收其他SMTP服务器发送的电子邮件。Ubuntu默认没有启用防火墙。如果你启用了UFW防火墙,需要使用以下命令打开25端口(入站):

sudo ufw allow 25/tcp

然后,我们可以使用在线端口扫描器扫描邮件服务器的开放端口。输入你的邮件服务器的公共IP地址,并选择扫描所有常用端口。

检查TCP 25端口(出站)是否被封锁

出站TCP 25端口也需要打开,这样Postfix才能向其他SMTP服务器发送电子邮件。出站TCP 25端口由你的VPS的服务商控制,我们可以安装“telnet”实用工具来检查它是否被打开或封锁。

sudo apt install telnet

在你的邮件服务器上运行以下命令:

telnet gmail-smtp-in.l.google.com 25

如果没有被封锁,你会看到类似以下的消息,这表明连接已成功建立(提示:输入“quit”并按回车键可关闭连接):

Trying 142.250.113.27...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP 586e51a60fabf-2b963a7375dsi2697509fac.262 - gsmtp

如果25端口(出站)被封锁,你可能会看到类似这样的信息:

Trying 4568:f8b1:407e:b07::1a...
Trying 142.250.113.27...
telnet: Unable to connect to remote host: Connection timed out

在这种情况下,你的Postfix无法向其他SMTP服务器发送电子邮件。你需要请求你的ISP/托管提供商为你打开出站25端口。

当你考虑更改端口号以试图绕过某些限制或封锁时,实际上这种做法在实际操作中是不可行的,尤其是在邮件传输方面。具体来说,当使用Postfix发送邮件时,它作为SMTP客户端运行,而接收方的邮件服务器则作为SMTP服务器。这些SMTP服务器通常监听25号端口来接收来自外部的邮件。这意味着,为了确保邮件能够成功发送并被接收方正确接收,SMTP客户端(在这种情况下为你的Postfix)需要连接到这个标准的25号端口。

由于你无法控制接收方的邮件服务器配置,因此不能随意更换用于通信的端口号。即使你在自己的服务器上改变了设置,如果目标服务器依然只在25号端口监听,那么你的邮件将无法被送达。简而言之,为了保证邮件能顺利发送出去,并被对方服务器接受,遵循标准协议和端口设置是非常重要的。尝试通过改变端口号来规避限制既不实用也不符合邮件传输的标准做法。

发送测试邮件

实际上,我们现在已经可以从命令行发送和接收电子邮件了。如果你的Ubuntu服务器上有一个名为“demo1”的用户账户,那么这个用户的电子邮件地址就是“[email protected]”。你可以向root用户“[email protected]”发送电子邮件,也可以向Gmail、雅虎邮箱或任何其他电子邮件服务发送邮件。

你可以使用Postfix的sendmail二进制文件向你的Gmail账户发送一封测试邮件,如下所示:

echo "test email" | sendmail [email protected]

在这个简单的命令中,sendmail从标准输入读取一条消息,并将“test email”作为消息正文,然后将该消息发送到你的Gmail账户。你应该能够在Gmail收件箱(或垃圾邮件文件夹)中收到这封测试邮件。你会发现,虽然我们没有指定发件人地址,但Postfix会自动为发件人地址附加一个域名。这是因为我们在安装Postfix时,在系统邮件名中添加了我们的域名。

注意:发件人域名由Postfix中的“myorigin”参数决定,而不是“myhostname”参数。

你可以尝试回复这封测试邮件,看看Postfix是否能够接收邮件。很可能你从自己域名发送的邮件会被标记为垃圾邮件,现在不用担心,我们会在本教程系列的后续部分解决这个问题。

每个用户的收件箱位于“/var/spool/mail/”或“/var/mail/”文件中。如果你不确定收件箱的位置,可以使用以下命令查询:

postconf mail_spool_directory

Postfix的邮件日志存储在“/var/log/mail.log”文件中。

仍然无法发送邮件?

如果25端口(出站)没有被封锁,但你仍然无法从自己的邮件服务器向其他电子邮件地址(如Gmail)发送邮件,那么你应该使用命令行文本编辑器打开邮件日志(“/var/log/mail.log”)查看具体原因。

cat /var/log/mail.log

仅使用 IPV4

默认情况下postfix 同时使用IPv4和IPv6,如下所示:

postconf inet_protocols

Output

inet_protocols = all

如果你的邮件服务器没有公共 IPv6 地址,最好在 Postfix 中禁用 IPv6,以防止不必要的 IPv6 连接。只需运行以下命令即可在 Postfix 中禁用 IPv6

sudo postconf -e "inet_protocols = ipv4"

然后重新启动 Postfix

sudo systemctl restart postfix
 邮局
评论
火箭邮社 - RS. All Rights Reserved. Theme Jasmine by Kent Liao.