第15章 使用 Postfix 与 Dovecot 部署邮件系统
章节简述
电子邮件(E-mail)系统是我们在日常工作和生活中最常用的一个网络服务。本章首先介绍电子邮件系统的起源,接着详细讲解 SMTP、POP3、IMAP4 等常见的电子邮件协议,以及 MUA、MTA、MDA 这 3 种服务角色的作用。
本章将全面演示如何在Linux 系统中使用Postfix 和Dovecot 服务程序配置电子邮件系统, 重点讲解常用的配置参数。此外,还将结合 bind 服务程序提供的 DNS 域名解析服务,验证客户端与服务器之间的邮件收发功能。本章最后还介绍了如何在电子邮件系统中设置用户别名,以帮助大家在生产环境中更好地控制和管理电子邮件账户及信箱地址。
15.1 电子邮件系统
20 世纪 60 年代,美苏两国正处于冷战时期。美国军方认为应该在科学技术上保持其领先的地位,这样有助于在未来的战争中取得优势。于是,美国国防部发起了一项名为 ARPANET 的科研项目,即大家现在所熟知的阿帕网计划。阿帕网是当今互联网的雏形,也是世界上第一个运营的数据包交换网络。然而,阿帕网遇到了一个严峻的问题—参与项目的科学家分布在美国各地,甚至还会因为时差的影响无法及时分享各自的研究成果。因此,科学家们迫切需要一种能够借助网络在计算机之间传输数据的方法。
尽管本书第 10 章和第 11 章介绍的 Web 服务和 FTP 文件传输服务也能实现数据交换,但这些服务的数据传输方式就像打电话,需要双方同时在线才能完成传输工作。如果对方的主机宕机或者科研人员因故离开,就有可能耽误某项科研成果了。恰好当时麻省理工学院的 Ray Tomlinson 博士也参与了与阿帕网相关的研究工作,他认为有必要设计一种类似于“信件”的传输服务,并为信件准备一个“信箱”,这样即使对方临时离线也能完成数据的接收,等上线后再进行处理即可。于是,Ray Tomlinson 博士用了近一年时间完成了电子邮件(E-mail)的设计,并在 1971 年秋天使用 SNDMSG 软件向自己的另一台计算机发送出了人类历史上第一封电子邮件—电子邮件系统在互联网中由此诞生!
既然要在互联网中给他人发送电子邮件,那么对方用户用于接收电子邮件的名称必须是唯一的,否则电子邮件可能会同时发给多个重名的用户,又或者干脆大家都收不到邮件。因此,Ray Tomlinson 博士决定采用“姓名@计算机主机名称”的格式来规范电子信箱的名称。选择使用@符号作为间隔符的原因其实也很简单,因为 Ray Tomlinson 博士觉得人类的名字和计算机主机名称中应该不会有这么一个@符号,所以就选择了它。
电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有下面这些。
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转电子邮件,占用服务器的 TCP/25 端口。
邮局协议版本 3(Post Office Protocol 3):用于将电子邮件存储到本地主机,占用服务器的 TCP/110 端口。
Internet 消息访问协议版本 4(Internet Message Access Protocol 4):用于在本地主机上访问邮件,占用服务器的 TCP/143 端口。****
在电子邮件系统中,为用户收发邮件的服务器名为邮件用户代理(Mail User Agent, MUA)。此外,既然电子邮件系统能够让用户在离线的情况下依然可以完成数据的接收,肯定得有一个用于保存用户邮件的“信箱”服务器,这个服务器的名字为邮件投递代理(Mail Delivery Agent,MDA),其工作职责是把来自邮件传输代理(Mail Transfer Agent,MTA)的邮件保存到本地的收件箱中。其中,这个 MTA 的工作职责是转发处理不同电子邮件服务供应商之间的邮件,把来自MUA 的邮件转发到合适的 MTA 服务器。例如,我们从新浪信箱向谷歌信箱发送一封电子邮件,这封电子邮件的传输过程如图 15-1 所示。
图15-1 电子邮件的传输过程
总体来说,一般的网络服务程序在传输信息时就像拨打电话,需要双方同时保持在线, 而在电子邮件系统中,用户发送邮件后不必等待投递工作完成即可下线。如果对方邮件服务器宕机或临时离线,则发件服务器(即 MTA)就会把要发送的内容自动地暂时保存到本地, 等检测到对方邮件服务器恢复后会立即再次投递,其间无须运维人员干预,收件人(即 MUA) 随后可以在自己的信箱中找到这封邮件。
大家在生产环境中部署企业级的电子邮件系统时,务必重点关注以下 10 个常见事项。
添加反垃圾与反病毒模块:集成反垃圾邮件与反病毒防护模块,有效阻止垃圾邮件与携毒邮件对企业邮箱的侵扰。
对邮件加密:采用如 SSL/TLS 等加密协议,对邮件传输过程与存储状态下的内容进行加密,确保邮件数据不被黑客窃取和篡改。
添加邮件监控审核模块:部署邮件监控与审核模块,对邮件内容进行实时监测,精准识别邮件中的敏感词汇、企业资料泄露等违规行为。
保障稳定性:保障电子邮件系统的稳定运行至关重要,运维人员应制定完善的应急预案,及时防范分布式拒绝服务(DDoS)攻击。
备份和恢复机制:建立健全邮件服务器数据备份机制,按照固定周期进行全量或增量备份,防止数据丢失,并制定详细、可操作性强的灾难恢复计划。
用户身份验证和访问控制:实施严格的用户身份验证策略,要求用户设置高强度密码, 并定期更换。同时,通过多因素身份验证等方式强化访问控制,防止未授权访问。
日志和监控:开启详细的系统运行日志记录功能,全面记录邮件发送、接收及错误信息等关键数据,为后续审计工作和问题排查提供翔实依据。
定期更新和安全补丁:定期对邮件服务器软件进行更新,及时安装官方发布的安全补丁,确保软件始终处于最新版本,有效修复已知安全漏洞。
防止邮件滥用:为防止邮件滥用和垃圾邮件泛滥,需合理设置邮件发送和接收限额, 加强对邮件行为的监管,避免系统资源被过度占用。
扩展性和负载均衡:在设计邮件系统架构时,充分考虑系统的扩展性,通过负载均衡技术实现资源的合理分配,确保系统在用户数量增加时能够实现平滑扩展。
15.2 部署基础的电子邮件系统
一个最基础的电子邮件系统肯定要能提供发件服务和收件服务。为此,需要使用基于SMTP 的 Postfix 服务程序提供发件服务功能,并使用基于 POP3 的 Dovecot 服务程序提供收件服务功能。这样一来,用户就可以使用Outlook Express 或Foxmail 等客户端服务程序正常收发邮件了。电子邮件系统的工作流程如图 15-2 所示。
图15-2 电子邮件系统的工作流程
在诸多早期的 Linux 系统中,默认使用的发件服务是由 Sendmail 服务程序提供的,而在RHEL 10 系统中,已经替换为 Postfix 服务程序。与 Sendmail 相比,Postfix 减少了很多不必要的配置步骤,并且在稳定性和并发性方面也有显著改进。
一般而言,我们的信箱地址类似于 root@linuxprobe.com,也就是按照“用户名@主机地址(域名)”的格式来规范的。如果你给我一串 root@192.168.10.10 的信息,我可能猜不到这是一个邮箱地址,甚至可能误认为是SSH 协议的连接信息。因此,要想更好地检验电子邮件系统的配置效果,需要先部署 bind 服务程序,为电子邮件服务器和客户端提供DNS 域名解析服务。
第 1 步:配置服务器主机名称,需要保证服务器主机名称与发信域名保持一致。
root@linuxprobe:~# vim /etc/hostname
mail.linuxprobe.com
root@linuxprobe:~# hostname
mail.linuxprobe.com
Tips :
修改主机名称文件后如果没有立即生效,可以重启服务器;或者再执行一条hostnamectl set-hostname mail.linuxprobe.com 命令,立即设置主机名称。
第 2 步:把 DNS 协议加入到 firewalld 防火墙的允许列表中,放行客户端解析域名的数据流量。
root@linuxprobe:~# firewall-cmd --permanent --add-service=dns
success
root@linuxprobe:~# firewall-cmd --reload
success
第 3 步:为电子邮件系统提供域名解析。由于第 13 章已经讲解了 bind-chroot 服务程序的配置方法,因此这里只提供主配置文件、区域配置文件和域名数据文件的配置内容, 其余配置步骤请大家自行完成。
root@linuxprobe:~# dnf install bind-chroot
root@linuxprobe:~# cat /etc/named.conf
1 //
2 // named.conf
3 //
4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
5 // server as a caching only nameserver (as a localhost DNS resolver only).
6 //
7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
8 //
9
10 options {
11 listen-on port 53 { any; };
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named";
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 secroots-file "/var/named/data/named.secroots";
18 recursing-file "/var/named/data/named.recursing";
19 allow-query { any; };
20
………………省略部分输出信息………………
root@linuxprobe:~# cat /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};
建议在复制正向解析模板文件时,在 cp 命令后面追加-a 参数,以便让新文件继承原文件的属性和权限信息。
root@linuxprobe:~# cp -a /var/named/named.localhost /var/named/linuxprobe.com.zone
root@linuxprobe:~# cat /var/named/linuxprobe.com.zone
$TTL 1D | ||||
---|---|---|---|---|
@ | IN SOA | linuxprobe.com. | root.linuxprobe.com. | ( |
0;serial | ||||
1D;refresh | ||||
1H;retry | ||||
1W;expire | ||||
3H);minimum | ||||
NS | ns.linuxprobe.com. | |||
ns | IN A | 192.168.10.10 | ||
@ | IN MX 10 | mail.linuxprobe.com. | ||
IN A | 192.168.10.10 |
root@linuxprobe:~# systemctl restart named
root@linuxprobe:~# systemctl enable named
Created symlink '/etc/systemd/system/multi-user.target.wants/named.service' → '/usr/lib/systemd/system/named.service'.
修改好配置文件后记得重启 bind 服务程序,这样电子邮件系统所对应的服务器主机名即为 mail.linuxprobe.com,而邮件域为@linuxprobe.com。把服务器的 DNS 地址修改成本地 IP 地址,如图 15-3 所示。
图15-3 配置服务器的DNS地址
让新配置的网卡参数立即生效:
root@linuxprobe:~# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
最后,对主机名执行 ping 命令,若能ping 通,则证明上述操作全部正确。注意,在执行 ping 操作时,也会获得主机名对应的IP 地址,证明上述操作全部正确。
root@linuxprobe:~# ping -c 4 mail.linuxprobe.com
PING mail.linuxprobe.com (192.168.10.10) 56(84) bytes of data.
64 bytes from mail.linuxprobe.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from mail.linuxprobe.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from mail.linuxprobe.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.037 ms
64 bytes from mail.linuxprobe.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.052 ms
--- mail.linuxprobe.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 45ms
rtt min/avg/max/mdev = 0.037/0.046/0.057/0.010 ms
15.2.1 配置Postfix服务程序
图 15-4 Postfix 的 Logo
Postfix 是一款由 IBM 资助研发的免费开源电子邮件服务程序(其 Logo 见图 15-4),能够很好地兼容 Sendmail 服务程序,可以方便 Sendmail 用户迁移到 Postfix 服务上。Postfix 服务程序的邮件收发能力强于Sendmail 服务,而且能自动增加、减少进程的数量来保证电子邮件系统的高性能与稳定性。另外,Postfix 服务程序由许多小模块组成,每个小模块都能够完成特定的功能,因此可在生产工作环境中根据需求灵活搭配。
第1 步:安装Postfix 服务程序。
root@linuxprobe:~# dnf install postfix
Updating Subscription Management repositories.
Last metadata expiration check: 0:08:54 ago on Mon 31 Mar 2025 09:36:17 AM CST.
Dependencies resolved.
====================================================================================
Package Architecture Version Repository Size
====================================================================================
Installing:
postfix x86_64 2:3.8.5-7.el10 AppStream 1.5 M
Installing dependencies:
postfix-lmdb x86_64 2:3.8.5-7.el10 AppStream 28 k
………………省略部分输出信息………………
Installed:
postfix-2:3.8.5-7.el10.x86_64 postfix-lmdb-2:3.8.5-7.el10.x86_64
Complete!
第 2 步:配置 Postfix 服务程序。如果大家是首次看到 Postfix 服务程序的主配置文件(/etc/postfix/main.cf),估计会被 749 行的内容给吓到。其实不用担心,这里面绝大多数的内容依然是注释信息。刘遄老师在本书中一直强调正确学习 Linux 系统的方法,并坚信“负责任的老师不应该是书本的搬运工,而应该是一名优质内容的提炼者”,因此在翻遍了配置参数的介绍,以及结合多年的运维经验后,最终总结出了 7 个最应该掌握的参数,如表 15-1 所示。
表 15-1 Postfix 服务程序主配置文件中的重要参数
参数 | 作用 |
---|---|
myhostname | 邮局系统的主机名 |
mydomain | 邮局系统的域名 |
myorigin | 从本机发出邮件的域名名称 |
inet_interfaces | 监听的网卡接口 |
mydestination | 可接收邮件的主机名或域名 |
mynetworks | 设置可转发哪些主机的邮件 |
relay_domains | 设置可转发哪些网域的邮件 |
在 Postfix 服务程序的主配置文件中,总计需要修改 5 处。首先是在第 99 行定义一个名为 myhostname 的变量,用来保存服务器的主机名称。请大家记住这个变量的名称,下面的参数需要调用它。
root@linuxprobe:~# vim /etc/postfix/main.cf
91 # INTERNET HOST AND DOMAIN NAMES
92 #
93 # The myhostname parameter specifies the internet hostname of this
94 # mail system. The default is to use the fully-qualified domain name
95 # from gethostname(). $myhostname is used as a default value for many
96 # other configuration parameters.
97 #
98 #myhostname = host.domain.tld
99 myhostname = mail.linuxprobe.com
然后在第 106 行定义一个名为 mydomain 的变量,用来保存邮件域的名称。大家也要记住这个变量名称,下面将调用它。
101 # The mydomain parameter specifies the local internet domain name.
102 # The default is to use $myhostname minus the first component.
103 # $mydomain is used as a default value for many other configuration
104 # parameters.
105 #
106 mydomain = linuxprobe.com
在第 122 行调用前面的 mydomain 变量,用来定义发出邮件的域。调用变量的好处是避免重复写入信息,以及便于日后统一修改。
108 # SENDING MAIL
109 #
110 # The myorigin parameter specifies the domain that locally-posted
111 # mail appears to come from. The default is to append $myhostname,
112 # which is fine for small sites. If you run a domain with multiple
113 # machines, you should (1) change this to $mydomain and (2) set up
114 # a domain-wide alias database that aliases each user to
115 # user@that.users.mailhost.
116 #
117 # For the sake of consistency between sender and recipient addresses,
118 # myorigin also specifies the default domain name that is appended
119 # to recipient addresses that have no @domain part.
120 #
121 #myorigin = $myhostname
122 myorigin = $mydomain
第 4 处修改是在第 139 行定义网卡监听地址。可以指定要使用服务器的哪些 IP 地址对外提供电子邮件服务;也可以干脆写成 all,表示所有 IP 地址都能提供电子邮件服务。
124 # RECEIVING MAIL
125
126 # The inet_interfaces parameter specifies the network interface
127 # addresses that this mail system receives mail on. By default,
128 # the software claims all active interfaces on the machine. The
129 # parameter also controls delivery of mail to user@[ip.address].
130 #
131 # See also the proxy_interfaces parameter, for network addresses that
132 # are forwarded to us via a proxy or network address translator.
133 #
134 # Note: you need to stop/start Postfix when this parameter changes.
135 #
136 #inet_interfaces = all
137 #inet_interfaces = $myhostname
138 #inet_interfaces = $myhostname, localhost
139 inet_interfaces = all
最后一处修改是在第 187 行定义可接收邮件的主机名或域名列表。这里直接调用前面定义好的 myhostname 和 mydomain 变量(如果不想调用变量,也可以直接调用变量中的值)。
156 # The mydestination parameter specifies the list of domains that this
157 # machine considers itself the final destination for.
158 #
159 # These domains are routed to the delivery agent specified with the
160 # local_transport parameter setting. By default, that is the UNIX
161 # compatible delivery agent that lookups all recipients in /etc/passwd
162 # and /etc/aliases or their equivalent.
163 #
164 # The default is $myhostname + localhost.$mydomain + localhost. On
165 # a mail domain gateway, you should also include $mydomain.
166 #
167 # Do not specify the names of virtual domains - those domains are
168 # specified elsewhere (see VIRTUAL_README).
169 #
170 # Do not specify the names of domains that this machine is backup MX
171 # host for. Specify those names via the relay_domains settings for
172 # the SMTP server, or use permit_mx_backup if you are lazy (see
173 # STANDARD_CONFIGURATION_README).
174 #
175 # The local machine is always the final destination for mail addressed
176 # to user@[the.net.work.address] of an interface that the mail system
177 # receives mail on (see the inet_interfaces parameter).
178 #
179 # Specify a list of host or domain names, /file/name or type:table
180 # patterns, separated by commas and/or whitespace. A /file/name
181 # pattern is replaced by its contents; a type:table is matched when
182 # a name matches a lookup key (the right-hand side is ignored).
183 # Continue long lines by starting the next line with whitespace.
184 #
185 # See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
186 #
187 mydestination = $myhostname, $mydomain
第3 步:创建电子邮件系统的登录账户。Postfix 与 vsftpd 服务程序一样,都可以调用本地系统的账户和密码,因此在本地系统创建常规账户即可。最后重启配置妥当的 Postfix 服务程序,并将其添加到开机启动项中。大功告成!
root@linuxprobe:~# useradd liuchuan
root@linuxprobe:~# echo "linuxprobe" | passwd --stdin liuchuan
root@linuxprobe:~# systemctl restart postfix
root@linuxprobe:~# systemctl enable postfix
Created symlink '/etc/systemd/system/multi-user.target.wants/postfix.service' → '/usr/lib/systemd/system/postfix.service'.
15.2.2 配置Dovecot服务程序
图 15-5 Dovecot 的 Logo
Dovecot 是一款能够为Linux 系统提供 IMAP 和 POP3 电子邮件服务的开源服务程序(其Logo 见图 15-5),安全性极高,配置简单,执行速度快,而且占用的服务器硬件资源也较少,因此是一款值得推荐的收件服务程序。
第 1 步:安装Dovecot 服务程序软件包。
root@linuxprobe:~# dnf install -y dovecot
Updating Subscription Management repositories.
Last metadata expiration check: 0:09:34 ago on Mon 31 Mar 2025 10:32:48 AM CST.
Dependencies resolved.
====================================================================================
Package Architecture Version Repository Size
====================================================================================
Installing:
dovecot x86_64 1:2.3.21-14.el10 AppStream 4.9 M
………………省略部分输出信息………………
Installed:
dovecot-1:2.3.21-14.el10.x86_64
Complete!
第 2 步:配置部署 Dovecot 服务程序。在 Dovecot 服务程序的主配置文件中进行如下修改。首先是第 24 行,把 Dovecot 服务程序支持的电子邮件协议修改为 imap、pop3、lmtp 和 submission。其中 submission 协议用于提交邮件到服务器的 587 端口,一般与 SMTP 认证配合使用,此处可不加。
然后在第 24 行下面添加一行参数,允许用户使用明文进行密码验证。之所以这样操作, 是因为 Dovecot 服务程序为了保证电子邮件系统的安全而默认强制用户使用加密过的密码进行登录,而由于当前还没有加密系统,因此需要添加该参数来允许用户使用明文登录。
root@linuxprobe:~# vim /etc/dovecot/dovecot.conf
23 # Protocols we want to be serving.
24 protocols = imap pop3 lmtp submission
25 disable_plaintext_auth = no
在主配置文件的第 48 行,设置允许登录的网段地址,也就是说我们可以在这里限制只有来自某个网段的用户才能使用电子邮件系统。如果想允许所有人都能使用,则不用修改本参数。
43
44 # Space separated list of trusted network ranges. Connections from these
45 # IPs are allowed to override their IP addresses and ports (for logging and
46 # for authentication checks). disable_plaintext_auth is also ignored for
47 # these networks. Typically you'd specify your IMAP proxy servers here.
48 login_trusted_networks = 192.168.10.0/24
49
第 3 步:配置邮件格式与存储路径。在 Dovecot 服务程序单独的子配置文件中,定义一个路径,用于指定要将收到的邮件存放到服务器本地的哪个位置。这个路径默认已经定义好了,只需要将该配置文件中第 25 行前面的井号(#)删除即可。
root@linuxprobe:~# vim /etc/dovecot/conf.d/10-mail.conf
1 ##
2 ## Mailbox locations and namespaces
3 ##
4
5 # Location for users' mailboxes. The default is empty, which means that Dovecot
6 # tries to find the mailboxes automatically. This won't work if the user
7 # doesn't yet have any mail, so you should explicitly tell Dovecot the full
8 # location.
9 #
10 # If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u)
11 # isn't enough. You'll also need to tell Dovecot where the other mailboxes are
12 # kept. This is called the "root mail directory", and it must be the first
13 # path given in the mail_location setting.
14 #
15 # There are a few special variables you can use, eg.:
16 #
17 # %u - username
18 # %n - user part in user@domain, same as %u if there's no domain
19 # %d - domain part in user@domain, empty if there's no domain
20 # %h - home directory
21 #
22 # See doc/wiki/Variables.txt for full list. Some examples:
23 #
24 # mail_location = maildir:~/Maildir
25 mail_location = mbox:~/mail:INBOX=/var/mail/%u
26 # mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
27 #
………………省略部分输出信息………………
然后切换到配置 Postfix 服务程序时创建的 liuchuan 账户,并在家目录中建立用于保存邮件的目录。记得要重启Dovecot 服务并将其添加到开机启动项中。至此,Dovecot 服务程序的配置部署步骤全部结束。
root@linuxprobe:~# su - liuchuan
liuchuan@mail:~$ mkdir -p mail/.imap/INBOX
liuchuan@mail:~$ exit
logout
root@linuxprobe:~# systemctl restart dovecot
root@linuxprobe:~# systemctl enable dovecot
Created symlink '/etc/systemd/system/multi-user.target.wants/dovecot.service' → '/usr/lib/systemd/system/dovecot.service'.
大家肯定觉得少了点什么吧。是的,还要记得在防火墙策略中放行上面提到的邮件协议, 这样客户端就能正常访问了。
root@linuxprobe:~# firewall-cmd --permanent --add-service=imap
success
root@linuxprobe:~# firewall-cmd --permanent --add-service=pop3
success
root@linuxprobe:~# firewall-cmd --permanent --add-service=smtp
success
root@linuxprobe:~# firewall-cmd --reload
success
15.2.3 客户使用电子邮件系统
如何得知电子邮件系统已经能够正常收发邮件了呢?我们使用Windows 操作系统中自带的 Outlook 软件进行测试(也可以使用其他电子邮件客户端进行测试,比如 Foxmail)。请按照表 15-2 设置电子邮件系统及 DNS 服务器和客户端的 IP 地址,以便能正常解析邮件域名。设置后的结果如图 15-6 所示。
表 15-2 服务器与客户端的操作系统与 IP 地址
主机名称 | 操作系统 | IP 地址 |
---|---|---|
电子邮件系统及 DNS 服务器 | RHEL 10 | 192.168.10.10 |
客户端 | Windows 11 | 192.168.10.30 |
图 15-6 配置 Windows 11 系统的网络参数
第 1 步:在 Windows 11 系统中运行 Outlook 软件。由于各位读者使用的 Windows 11 系统版本不一定相同,因此本书决定采用 Outlook 2013 为对象进行实验。如果你想要与这里的实验环境尽量保持一致,可在本书配套站点下载并安装 Outlook 2013 软件。在初次运行该软件时会出现一个“欢迎使用 Microsoft Outlook 2013”界面,引导大家完成该软件的配置过程,如图 15-7 所示。
图 15-7 Outlook 2013 启动向导
第 2 步:配置电子邮件账户。在图 15-8 所示的账户配置界面中单击“是”单选按钮,然后单击“下一步”按钮。
图 15-8 配置电子邮件账户
第 3 步:填写电子邮件账户信息,在图 15-9 所示的界面中,在“您的姓名”文本框中输入名字(可以是自定义的任意名字),在“电子邮件地址”文本框中输入服务器系统内的账户名和发件域,在“密码”文本框中输入该账户在服务器内的登录密码。填写完毕之后,单击“下一步”按钮。
图 15-9 填写电子邮件账户信息
第 4 步:进行电子邮件服务登录验证。由于当前没有可用的 SSL 加密服务,因此在Dovecot 服务程序的主配置文件中写入了一条参数,允许用户使用未加密的明文密码登录到电子邮件服务。Outlook 软件默认会通过 SSL 加密协议尝试登录电子邮件服务,所以在进行图 15-10 所示的“正在搜索 liuchuan@linuxprobe.com 设置”大约 30~60 秒后,系统会出现登录失败的报错信息。此时只需再次单击“下一步”按钮,即可让 Outlook 软件以非加密的方式验证登录,如图 15-11 所示。最后配置成功的界面如图 15-12 所示,单击“完成”按钮, 一切搞定!
图 15-10 进行电子邮件服务登录验证
图 15-11 使用非加密的方式进行电子邮件服务登录验证
图 15-12 使用非加密方式配置账户成功
第5 步:向其他信箱发送邮件。在成功登录 Outlook 软件后即可尝试编写并发送新邮件了。只需在软件界面的空白处单击鼠标右键,在弹出的菜单中单击“新建电子邮件”选项(见图 15-13),然后在邮件界面中填写收件人的信箱地址以及完整的邮件内容后单击“发送”按钮,如图 15-14 所示。
图 15-13 向其他信箱发送邮件
图 15-14 填写收件人信箱地址并编写完整的邮件内容
当使用 Outlook 软件成功发送邮件后,便可以在电子邮件服务器上查看到新邮件提醒了。在 RHEL 10 系统中查看邮件的命令是 s-nail,该命令工具需要自行安装(输出信息省略)。要想查看邮件的完整内容,只需输入收件人姓名前面的编号即可。
root@linuxprobe:~# dnf install s-nail
root@linuxprobe:~# s-nail
s-nail version v14.9.24. Type `?' for help
/var/spool/mail/root: 1 message 1 new
▸N 1 liuchuan 2025-03-31 11:11 98/3307 "Hello ~ 这是一封测试邮件 "
& 1
[-- Message 1 -- 98 lines, 3307 bytes --]:
From: "liuchuan" <liuchuan@linuxprobe.com>
To: <root@linuxprobe.com>
Subject: Hello ~ 这是一封测试邮件
Date: Mon, 31 Mar 2025 11:11:43 +0800
Message-ID: <000001dba1ea$a11f8be0$e35ea3a0$@linuxprobe.com>
[-- #1.1 6/152 text/plain, base64, gb2312 --]
当您收到这封邮件时,证明我的邮局系统实验已经成功。
[-- #1.2 66/2194 text/html, quoted-printable, gb2312 --]
& quit
Held 1 message in /var/spool/mail/root
You have mail in /var/spool/mail/root
root@linuxprobe:~#
15.3 设置用户别名邮箱
用户别名功能是一项简单实用的邮件账户伪装技术,能够用来设置多个虚拟信箱的账户以接收发送的邮件,从而保证自身的邮件地址不被泄露;还可以用来接收自己多个信箱中的邮件。刚才我们已经顺利地向 root 账户发送了邮件,下面再向 bin 账户发送一封邮件,如图 15-15 所示。
图 15-15 向服务器上的 bin 账户发送邮件
在邮件发送后登录到服务器,然后尝试以bin 账户的身份登录。由于 bin 账户在 Linux 系统中是系统账户,默认的 Shell 终端是/sbin/nologin,因此在以 bin 账户登录时,系统会提示当前账户不可用。但是,在电子邮件服务器上使用 s-nail 命令后,却看到这封原本要发送给 bin 账户的邮件已经被存放到 root 账户的信箱中。
root@linuxprobe:~# su - bin
This account is currently not available.
root@linuxprobe:~# s-nail
s-nail version v14.9.24. Type `?' for help
/var/spool/mail/root: 2 messages 1 new
1 liuchuan 2025-03-31 11:11 99/3318 "Hello ~ 这是一封测试邮件 "
▸N 2 liuchuan 2025-03-31 11:15 98/3262 "你好,用户bin。 "
& 2
[-- Message 2 -- 98 lines, 3262 bytes --]:
From: "liuchuan" <liuchuan@linuxprobe.com>
To: <bin@linuxprobe.com>
Subject: 你好,用户bin。
Date: Mon, 31 Mar 2025 11:15:50 +0800
Message-ID: <000501dba1eb$342925e0$9c7b71a0$@linuxprobe.com>
[-- #1.1 6/124 text/plain, base64, gb2312 --]
这是一封发给用户bin的邮件。
[-- #1.2 66/2193 text/html, quoted-printable, gb2312 --]
& quit
Held 2 messages in /var/spool/mail/root
You have mail in /var/spool/mail/root
root@linuxprobe:~#
太奇怪了!明明发送给 bin 账户的邮件怎么会被 root 账户收到了呢?其实,这就是使用用户别名技术来实现的。在 aliases 邮件别名服务的配置文件中能够看到,里面定义了大量的用户别名,这些用户别名大多数是 Linux 系统本地的系统账户,而在冒号(:)间隔符后面的root 账户则是用来接收这些账户邮件的人。用户别名可以是 Linux 系统内的本地用户, 也可以是完全虚构的用户名字。
Tips :
下述命令会显示大量的内容,考虑到篇幅限制,这里已经做了部分删减,其实际的输出名单将是这里的两倍多。
root@linuxprobe:~# cat /etc/aliases
#
# Aliases in this file will NOT be expanded in the header from
# Mail, but WILL be visible over networks or from /bin/mail.
#
# >>>>>>>>>> The program "newaliases" must be run after
# >> NOTE >> this file is updated for any changes to
# >>>>>>>>>> show through to sendmail.
#
# Basic system aliases -- these MUST be present.
mailer-daemon: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
halt: root
mail: root
………………省略部分输出信息………………
现在大家能猜出是怎么一回事了吧。原来 aliases 邮件别名服务的配置文件专门用来定义用户别名与邮件接收人的映射。除了使用本地系统中系统账户的别名外,我们还可以自行定义一些别名来接收邮件。例如,创建一个名为 winston 的账户,而真正接收该账户邮件的应该是 root 账户。
root@linuxprobe:~# cat /etc/aliases
#
# Aliases in this file will NOT be expanded in the header from
# Mail, but WILL be visible over networks or from /bin/mail.
#
# >>>>>>>>>> The program "newaliases" must be run after
# >> NOTE >> this file is updated for any changes to
# >>>>>>>>>> show through to sendmail.
#
# Basic system aliases -- these MUST be present.
mailer-daemon: postmaster
postmaster: root
# General redirections for pseudo accounts.
winston: root
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
halt: root
mail: root
………………省略部分输出信息………………
保存并退出aliases 邮件别名服务的配置文件后,需要再执行一下 newaliases 命令, 目的是让新的用户别名配置文件立即生效。然后再次尝试发送邮件,如图 15-16 所示。
root@linuxprobe:~# newaliases
图 15-16 向服务器上的 winston 用户发送邮件
这时,使用 root 账户在服务器上执行 s-nail 命令后,就能看到这封原本要发送给winston 账户的邮件了。最后,再啰嗦一句,用户别名技术不仅应用广泛,而且配置也很简单。所以这里要提醒大家的是,今后千万不要看到有些网站上提供了很多客服信箱就轻易相信别人,没准发往这些客服信箱的邮件会被同一个人收到。
root@linuxprobe:~# s-nail
s-nail version v14.9.24. Type `?' for help
/var/spool/mail/root: 3 messages 1 new
1 liuchuan 2025-03-31 11:11 99/3318 "Hello ~ 这是一封测试邮件 "
2 liuchuan 2025-03-31 11:15 99/3273 "你好,用户bin。 "
▸N 3 liuchuan 2025-03-31 11:20 103/3597 "你好,用户winston。 "
& 3
[-- Message 3 -- 103 lines, 3597 bytes --]:
From: "liuchuan" <liuchuan@linuxprobe.com>
To: <winston@linuxprobe.com>
Subject: 你好,用户winston。
Date: Mon, 31 Mar 2025 11:20:55 +0800
Message-ID: <000a01dba1eb$e9e30f40$bda92dc0$@linuxprobe.com>
[-- #1.1 7/169 text/plain, base64, gb2312 --]
这是一封给winston用户的邮件;
顺利的话会被root用户接收到。
[-- #1.2 70/2459 text/html, quoted-printable, gb2312 --]
& quit
Held 3 messages in /var/spool/mail/root
You have mail in /var/spool/mail/root
复习题
-
电子邮件服务与HTTP、FTP、NFS 等程序的服务模式的最大区别是什么?
答:当对方主机宕机或对方临时离线时,使用电子邮件服务依然可以发送数据。
-
常见的电子邮件协议有哪些?
答:SMTP、POP3 和IMAP4。
-
在电子邮件系统中,MUA、MTA、MDA 这 3 种服务角色的用途分别是什么?
答:MUA 用于收发邮件,MTA 用于转发邮件,MDA 用于保存邮件。
-
使用Postfix 与Dovecot 部署电子邮件系统前,需要先做什么?
答:需要先配置部署 DNS 域名解析服务,以便提供信箱地址解析功能。
-
能否让 Dovecot 服务程序限制允许连接的主机范围?
答:可以,在 Dovecot 服务程序的主配置文件中修改 login_trusted_networks 参数值即可,这样可在不修改防火墙策略的情况下限制来访的主机范围。
-
使用 Outlook 软件连接电子邮件服务器的地址 mail.linuxprobe.com 时,提示找不到服务器或连接超时,这可能是什么原因导致的呢?
答:很有可能是 DNS 域名解析问题引起的连接超时,可在服务器与客户端分别执行 ping mail.linuxprobe.com 命令,测试是否可以正常解析出 IP 地址。
-
如何定义用户别名信箱以及让其立即生效?
答:可直接修改邮件别名服务的配置文件,并在保存退出后执行 newaliases 命令,让新的用户别名立即生效。