Chapter6 - 配置电子邮件传输
配置仅发送电子邮件服务
配置RHEL 服务器版以通过未验证的 SMTP 网关传输所有电子邮件。
电子邮件架构和空客户端
在当今的企业环境中,电子邮件是常用的通信方法。最终用户可能使用专用的邮件客户端如 Evolution
和 mutt
来读取和发送电子邮件,组织也可能具有一个基于 Web 的界面以用于其邮件服务。
但是,Linux 服务器也会发送电子邮件,通常是出于 自动用途或者是向管理员报告错误。它们通常直接或间接使用名为 /usr/sbin/sendmail
的标准程序(由 RHEL7 中的 postfix 提供)来发送这些邮件。
在实践中,大部分服务器都受到监控,并且在发生事情时发出邮件。这通常需要一个已配置的 /usr/sbin/sendmail
来发送电子邮件,以通过使用公司 SMTP 服务器传输邮件来向负责系统管理员进行通知。
空客户端是一个运行本地邮件服务器的客户端计算机,它将所有电子邮件转发到出站邮件中继以进行必送。空客户端不接受任何邮件的本地发送,它只能将这些邮件发送到出站邮件中继。用户可以在空客户端上运行邮件客户端来读取和发送电子邮件。
本节将介绍如何将 RHEL 7 服务器配置为 postfix
空客户端。此客户端将使用 sendmail
和 SMTP 协议,通过现有的传出邮件服务器将邮件传输到外部。
电子邮件消息的传输
在大部分情况下,要发送电子邮件,邮件客户端与传输邮件邮件服务器进行通信,后者可帮助将该邮件中继到其最终目标。邮件客户端使用简单邮件传输协议(SMTP)将邮件传输到邮件服务器。
传出邮件中继可能不需要来自内部客户端的身份验证(在此情况下,服务器侦听端口 25/tcp
) 。在此情况下,中继将通过基于 IP 地址的限制或防火墙规则来限制哪些主机可以进行中继。
注意
如果能够从 Internet 访问出站 SMTP 中继,出于安全和反垃圾邮件的原因,一般应将其配置为邮件提交代理(MSA)。MSA 侦听端口 587/tcp
并首先需要用户邮件客户端的身份验证,然后才能接受邮件。这可能是通过用户名和密码(一些 web 邮件服务提供)或通过其他手段。
传出邮件中继随后使用DNS 来查找 MX 记录,该记录用于标识哪个邮件服务器接受发送到收件人域的邮件的传递。中继随后使用端口 25/TCP
上的 SMTP 将电子邮件传输到该服务器。
收件人的邮件服务器提供POP3 或 IMAP 服务器(如 dovecot 和Cyrus) 以允许专用邮件客户端下载其邮件。邮件常常提供一个基于 web 的界面。以允许客户端使用 web 浏览器作为邮件客户端。
下图说明了电子邮件客户端如何从 IMAP 服务器检索传入邮件以及如何通过 SMTP 服务器发送传出邮件。serverX.example.com 上的邮件客户端从 IMAP 服务器 imapX.example.com 获取传入邮件。传出邮件发送到 smtpX.example.com 。 MX DNS 记录将 smtpX.example.com 定义为负责 desktopX.example.com 域的邮件服务器。

Postfix
Postfix 是一个强大但易于配置的邮件服务器。这个 RHEL 中默认邮件服务器。Postfix 由postfix RPM 软件包提供。它是一个由多个合作程序组成的模块化程序。其组件由 master 进程进行控制。
postfix 邮件服务器的主配置文件为 /etc/postfix/main.cf
。
注意
/etc/postfix
目录中也存在其他配置文件。其中一个重要文件是 /etc/postfix/master.cf
,其控制启动的子服务。
重要的 Postfix 配置设置
设置 | 用途 |
---|---|
inet_interfaces | 控制 Postfix 侦听传入和传出邮件的网络接口。如果设置为 loopback-only,则 Postfix 仅侦听 127.0.0.1 和 ::1 。如果设置为 all ,则Postfix 侦听所有网络接口。可以列出一个或多个主机名和IP 地址(由空格分隔) |
myorigin | 重写本地发布的电子邮件,使其显示为来自该域。这有助于确保响应返回到邮件服务器所负责的正确域。默认值: myorigin=$myhostname |
relayhost | 将本应该发送到外部邮件地址的所有邮件都转发到邮件服务器。主机名两边应有方括号以禁止 MX 记录查找。默认值:relayhost= |
mydestination | 配置邮件服务器是哪些域的端点。寻址到这些域的电子邮件将发送到本地邮箱。默认值: mydestination=mydomain,localhost |
local_transport | 确定收件地址为$mydestination 的电子邮件的发送方式。默认情况下,设置为 local.$myhostname ,会使用 local 邮件发送代理将传入邮件发送到 /var/spool/mail/ 中的本地邮件存储位置。将此设置为 error:error message (例如 local_transport = error :local delivery disabled ) 可完全禁用本地发送。默认值:local_transport = local:$myhostname |
mynetworks | 允许通过邮件服务器从 IP 地址的逗号分隔列表和以 CIDR 表示 的网络中继到任何位置,而不进一步身份验证。如果未在 /etc/postfix/main.cf 中明确设置mynetworks 设置,该设置将自动使用 mynetworks_style 的设置进行填充。mynetworks_style 的默认值为 subnet 。表示您的服务器在其中有 IP 地址的所有子网都将被添加到 mynetworks 。这通常不是理想的情况,特别是在服务器具有外部 IP 地址的情况下。建议手动添加 mynetworks 设置,或者将 mynetworks_style 设置为 host.默认值:mynetworks= 127.0.0.1/8 [::1]/128 |
配置文件 /etc/postfix/main.cf
可以通过两种方法来编辑:使用文本编辑器(例如vim)手动进行编辑,或使用 postconf 实用程序进行编辑。postconf 命令允许按单独或所有设置来进行查询,修改设置,查询默认值或者显示默认值不同的所有设置:
运行不带任何参数的postconf
命令将从 /etc/postfix/main.cf
配置文件中查询所有设置:

通过在 postconf 命令后面列出一组特定选项(用空格分隔)即可查询这一组特定选项。运行以下代码可列出 inet_interfaces
和 myorygin
选项以及对应值:

注意
如果 /etc/postfix/main.cf
中的值是以美元符号($
) 开头,那么这不是一个字面值,而是指向其他设置的值。在先前示例中,myorigin 设置将具有与 myhostname 设置相同的值。使用此语法可简化维护,因为值只需要在一个位置进行更新。
运行以下命令在 /etc/postfix/main.cf
配置文件中添加新选项或更改现在选项:postconf -e 'setting = value'
如果配置文件中已具有该名称的设置,那么将更新为新值;否则,将添加到配置文件的底部。
运行以下命令来更改 myorigin 设置,以将 FROM: 电子邮件地址域部分重写为 example.com:

重要
在对/etc/postfix/main.cf
进行更改后,postfix 服务器需要运行 reload
或 restart
命令。
注意
在对电子邮件进行故障排除时,所有与邮件相关的操作的日志都将保存在 systemd 日志和 /var/log/maillog
中,其中包括任何与邮件服务器相关操作的信息。
postqueue -p
命令显示已排队的所有传出邮件的列表。若要尝试再次立即发送所有已排队的邮件,请运行postqueue -f
命令;否则,postfix 将大约每小时,尝试重试重新发送一次,直至邮件被接受或过期。
Postfix 客户端配置
切记,要充当客户端,必须配置 Postfix 和 RHEL 系统,以便满足以下条件:
- sendmail 命令以及使用该命令将所有电子邮件转发到现有出站邮件中继进行发送的程序 。
- 本地Postfix 服务不接受任何电子邮件的本地发送
- 用户可以在空客户端上运行邮件客户端来读取和发送电子邮件。
下图说明了空客户端设置的工作方式。要发送邮件,serverX上的空客户端将所有邮件发送到公司 SMTP 邮件服务器 smtpX.example.com 。

注意
在postfix(5) man page
中,对您可在 /etc/postfix/main.cf
中调整所有设置及其解释提供了完整概述。若要访问此 man page
,请使用 man 5 postconf
命令。省略 5 将显示 postconf
命令的 man pange
而不是配置指南的 man page
将 Postfix 配置为空客户端
在此示例中,当您的讲师演示如何将serverX.example.com
上的Postfix 配置为使用 smtpX.example.com 邮件服务器作为中继主机的空客户端时,请按照这些步骤进行操作。本地空客户端传递的所有邮件都会将发件人地址域重写为 desktopX.example.com 。
在您的 serverX 系统上调整Postfix 邮件服务器的配置以充当一个空客户端,用于将所有邮件转发到 smtpX.example.com 上的公司邮件服务器(负责 desktopX.example.com 域)
1、调整 relayhost 指令以指向公司邮件服务器。公司邮件服务器的主机名需要括在方括号中,以防止使用 DNS 服务器来查找 MX 记录。
[root@server ~]# postconf -e "relayhost = [smtpX.example.com]"
2、将Postfix 邮件服务器配置为仅回复来自本地系统的电子邮件。
1、让Postfix 邮件服务器仅侦听用于发送邮件的回环接口。
[root@server ~]# postconf -e "inet_interfaces=loopback-only"
2、更改空客户端的配置,以便源自 127.0.0.1/8 IPv4 网络和 `[::1]/128` IPv6 网络的邮件能够由本地空客户端转发到中继主机。
[root@server ~]# postconf -e "mynetworks = 127.0.0.1 [::1]/128"
3、配置Postfix ,以便所有传出邮件都将其发件人域重写为公司域 desktopX.example.com 。
[root@server ~]# postconf -e "myorigin = desktopX.example.com"
4、禁止Postfix 邮件服务器将任何邮件发送到本地账户。
1、将空客户端配置为不充当任何邮件域的端点。本地发送不会接受收件人为本地电子邮件账号的邮件。需要将mydesktination 选项设置为空值才能实现此目的。
[root@server ~]# postconf -e "mydestination = "
2、将本地空客户端配置为不将任何邮件整理到本地系统上的邮箱。本地电子邮件发送关闭。
[root@server ~]# postconf -e "local_transport = error: local delivery disabled"
5、重新启动本地 Postfix 空客户端。
[root@server ~]# systemctl restart postfix
下表显示 /etc/postfix/main.cf 配置文件设置的摘要,这些设置用于将 serverX.example.com 上的Postfix 配置为使用 smtpX.example.com 邮件服务器作为中继主机的空客户端。本地空客户端传递的所有邮件都会将发件人地址域重写为 desktopX.example.com 。
空客户端Postfix 设置
指令 | 空客户端(serverX.example.com) |
---|---|
inet_interfaces | inet_interfaces = loopback-only |
myorigin | myorigin = desktopX.example.com |
relayhost | relayhsot = [smtpX.example.com] |
mydestination | mydestination = |
local_transport | local_transport = error: local delivery disabled |
mynetworks | mynetworks = 127.0.0.1/8 [::1]/128 |
示例:
[root@server0 ~]# postconf -e "mynetworks = 127.0.0.1/8 [::1]/128"
[root@server0 ~]# postconf -e "mydestination = "
[root@server0 ~]# postconf -e "myorigin = desktop0.example.com"
[root@server0 ~]# postconf -e "inet_interfaces = loopback-only"
[root@server0 ~]# postconf -e "local_transport = error: local delivery disabled"
[root@server0 ~]# postconf -e "relayhost = smtp0.example.com"
[root@server0 ~]# postconf -e "myorigin = desktop0.example.com"
[root@server0 ~]# systemctl restart postfix
[student@server0 Desktop]$ mail -s "server0 null client" student@desktop0.example.com
null client test
.
EOT
[root@server0 ~]# mutt -f imaps://imap0.example.com