摘自《Ubuntu Linux实用指南》(版本 8.10 和 8.04),A,第二版。

作者:Mark Sobell
Cover image

作者:Mark G. Sobell
由 Prentice Hall 出版
ISBN-10: 0-13-700388-9
ISBN-13: 978-0-13-700388-4

第 20 章exim4:设置邮件服务器、客户端及更多

exim4 简介

当后来发展成为互联网的网络首次建立时,它连接了几台计算机,每台计算机服务于大量用户并运行多项服务。每台计算机都能够发送和接收电子邮件,并具有唯一的hostname(主机名),该hostname被用作电子邮件的目的地。

如今,互联网拥有大量的临时客户端。由于这些客户端没有固定的IP地址或主机名,因此它们无法直接接收电子邮件。这些系统上的用户通常在其雇主或ISP运行的电子邮件服务器上维护一个帐户,并且他们使用POP或IMAP从此帐户收集电子邮件。除非您拥有想要接收电子邮件的域名,否则您无需设置 exim4 以从非本地系统接收邮件。

智能主机 (Smarthost)

您可以在客户端系统上设置 exim4,使其将发往非本地系统的邮件发送到SMTP服务器,该服务器将邮件中继到其目的地。这种类型的服务器称为智能主机(smarthost)。使用防火墙来阻止电子邮件从公司官方邮件服务器以外的任何系统发送到互联网的组织需要这种配置。作为防止病毒传播的部分防御措施,一些ISP阻止出站端口25,以防止其客户直接向远程计算机发送电子邮件。这些ISP需要这种配置。

您还可以将 exim4 设置为服务器,该服务器将邮件发送到非本地系统,并且不使用ISP作为中继。在这种配置中, exim4 直接连接到接收电子邮件的域的SMTP服务器。设置为智能主机的ISP就是以这种方式配置的。

您可以设置 exim4 以接受注册域名(如域的DNS MX记录中所指定)的电子邮件。但是,大多数邮件客户端(MUA)不直接与 exim4 交互以接收电子邮件。相反,它们使用POP或IMAP—包含用于管理邮件文件夹、在服务器上保留消息以及仅读取电子邮件主题而不下载整个消息的功能的协议。如果您想从运行传入邮件服务器以外的系统收集电子邮件,则可能需要设置POP或IMAP服务器,如前所述。

设置邮件服务器 (exim4)

本节介绍如何设置 exim4 邮件服务器。

先决条件

安装以下软件包

  • exim4 (一个虚拟软件包)

  • eximon4 (可选;监控 exim4)

  • mailx (可选;安装 mail,这对于从命令行测试 exim4 非常方便)

  • exim4-doc-html (可选;HTML格式的 exim4 文档)

  • exim4-doc-info (可选;info格式的 exim4 文档)

exim4 init 脚本

当您安装 exim4 软件包时,dpkg postinst 脚本会 минимально 配置 exim4 并启动 exim4 守护进程。在您配置 exim4 之后,调用 exim4 init 脚本以重启 exim4

$ sudo /etc/init.d/exim4 restart

在活动服务器上更改 exim4 配置后,使用 reload 代替 restart 以重新加载 exim4 配置文件,而不会中断 exim4 正在进行的工作。 exim4 init 脚本接受几个非标准参数

$ /etc/init.d/exim4
Usage: /etc/init.d/exim4 {start|stop|restart|reload|status|what|force-stop}

statuswhat 参数显示有关 exim4 的信息。 force-stop 参数立即终止所有 exim4 进程。

注释

防火墙

SMTP服务器通常使用TCP端口25。如果接收非本地邮件的SMTP服务器系统正在运行防火墙,则需要打开此端口。为此,请使用 firestarter (或设置允许SMTP服务的策略)。

日志文件

您必须是 adm 组的成员或使用 root 权限才能查看 /var/log/exim4. 中的日志文件。

sendmail 和 exim4

虽然它的工作方式与 sendmail 不同,但 Ubuntu 将 exim4 配置为 sendmail 的直接替代品。 exim4 虚拟软件包的一部分 exim4-daemon-light 软件包包含 /usr/sbin/sendmail,它是指向 exim4 的链接。由于 exim4 守护进程接受 sendmail 的许多选项,因此依赖 sendmail 的程序将与安装 exim4 代替 sendmail 一起工作。

本地和非本地系统

exim4 守护进程发送和接收电子邮件。 exim4 接收的电子邮件可能源自本地系统或非本地系统。同样, exim4 发送的电子邮件可能发往本地或非本地系统。 exim4 守护进程根据每封电子邮件的来源和目的地对其进行处理。

本地系统与本地系统们

本地系统exim4 正在运行的系统。本地系统们是在与本地系统同一LAN上的系统。

按照安装方式, exim4 仅向本地系统传递邮件。

快速入门 I:配置 exim4 以使用智能主机 (Smarthost)

此快速入门配置一个 exim4 服务器,该服务器将来自本地系统用户的邮件发送到本地和非本地目的地,并且不接受来自非本地系统的邮件。此服务器

  • 接受源自本地系统的电子邮件,以传递到本地系统。

  • 接受源自本地系统的电子邮件,以传递到非本地系统,使用SMTP服务器(智能主机),通常是ISP,以将电子邮件中继到其目的地。

  • 不传递源自非本地系统的电子邮件。通常情况下,您需要使用POP或IMAP来接收电子邮件。

  • 不转发源自非本地系统的电子邮件到其他非本地系统(不中继电子邮件)。

要设置此服务器,您需要更改 /etc/exim4/update-exim4.conf.conf 中几个配置变量的值,并重启 exim4。 dpkg-reconfigure 实用程序会引导您编辑此文件;此快速入门使用文本编辑器。使用 root 权限,使用文本编辑器对 update-exim4.conf.conf 进行以下更改:

dc_eximconfig_configtype='smarthost'
smarthost='mail.example.net'

配置类型

dc_eximconfig_configtype 配置变量设置为 smarthost,以使 exim4 将发往非本地系统的邮件发送到 smarthost 配置变量指定的系统。此行应与前面的示例完全相同。

智能主机 (Smarthost)

dc_eximconfig_configtype 设置为 smarthost 时,将 smarthost 设置为远程SMTP服务器(智能主机)的FQDN或IP地址(首选), exim4 使用该服务器将电子邮件中继到非本地系统。将 mail.example.net 替换为此FQDN或IP地址。对于 update-exim4.conf.conf 中的布尔变量, exim4 将空值(由' '指定)解释为false值。进行这些更改后,文件应类似于此

$ cat /etc/exim4/update-exim4.conf.conf
...
dc_eximconfig_configtype='smarthost'
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='mail.example.net'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='false'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

exim4 服务器在智能主机 (smarthost) 配置中不使用 dc_local_interfaces 变量的值,因此您可以将其留空。但是,在其他配置中,127.0.0.1 的值会阻止 exim4 接受来自非本地系统的电子邮件。最好以这种方式配置 exim4,并且仅在您准备好接受来自其他系统的邮件时才更改此变量。

为了最大限度地减少DNS查找的网络访问,如果您正在使用拨号线路,这可能会有所帮助,请将 dc_minimaldns 配置变量的值更改为 true

/etc/mailname

/etc/mailname 文件最初保存服务器的节点名称(uname –n)。存储在 /etc/mailname 中的字符串将显示为源自本地系统的电子邮件的 envelope-from 和 From 行上的发送系统名称。如果您希望电子邮件看起来来自不同的系统,请更改此文件的内容。您可以使用文本编辑器修改此文件; dpkg-reconfigure 实用程序也可以更改它。

以下文件使从本地系统发送的邮件看起来来自 username@example.com,其中 username 是发送电子邮件的用户的用户名

$ cat /etc/mailname
example.com

有关 exim4 配置变量的更多信息,请参见第 688 页。进行这些更改后,重启 exim4

测试

使用以下命令测试 exim4

$ echo "my exim4 test" | exim4 user@remote.host

user@remote.host 替换为您接收电子邮件的另一个系统上的电子邮件地址。您需要向远程系统发送电子邮件,以确保 exim4 正在向远程SMTP服务器(智能主机)发送电子邮件。如果邮件未送达,请检查发送电子邮件的用户(在本地系统上)的电子邮件中是否有错误。另请检查 /var/log/exim4 目录中的日志文件。

快速入门 II:配置 exim4 以发送和接收邮件

要接收从非本地系统发送到注册域名(您控制的域名)的电子邮件,您需要配置 exim4 以接受来自非本地系统的电子邮件。此快速入门描述了如何设置一个服务器,该服务器

  • 接受来自本地和非本地系统的电子邮件。

  • 将源自本地系统的电子邮件传递到本地系统或直接传递到非本地系统,而无需使用中继。

  • 仅将源自非本地系统的电子邮件传递到本地系统。

  • 不转发源自非本地系统的电子邮件到其他非本地系统(不中继电子邮件)。

此服务器不中继源自非本地系统的电子邮件。(您必须设置 dc_relay_domains 变量才能使本地系统充当中继。)为了使此配置工作,您必须能够建立出站连接并在端口25上接收入站连接(请参阅“防火墙” )。

使用 root 权限,使用文本编辑器在 /etc/exim4/update-exim4.conf.conf 中设置以下配置变量

dc_eximconfig_configtype='internet'
dc_other_hostnames='mydom.example.com'
dc_local_interfaces=''

配置类型

dc_eximconfig_configtype 设置为 internet,以使 exim4 将邮件直接发送到邮件地址域的DNS MX记录指定的非本地系统,并接受 dc_local_interfaces (下一页)指定的接口上的电子邮件。此行应与上面显示的完全相同。

其他主机名

dc_other_hostnames 配置变量指定本地服务器接收邮件地址的FQDN或IP地址。将 mydom.example.com 替换为这些FQDN或IP地址。您必须用分号分隔多个条目。这些值不一定包括本地服务器的FQDN或IP地址。

本地接口

dc_local_interfaces 设置为您希望 exim4 监听的接口。将其设置为空值 (' ') 以监听所有接口。

与快速入门 I 中一样,您可能需要更改 /etc/mailname 的值。对于此文件中的布尔变量, exim4 将空值(由' '指定)解释为false。该文件应类似于此

$ cat /etc/exim4/update-exim4.conf.conf
...
dc_eximconfig_configtype='internet'
dc_other_hostnames='mydom.example.com'
dc_local_interfaces=''
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname=''
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

有关 exim4 配置变量的更多信息,请参见第 688 页。一旦您重启 exim4,它将接受发往本地系统的邮件。要接收发往域的电子邮件,该域的DNS MX记录(第 790 页)必须指向本地系统的IP地址。如果您没有运行DNS服务器,则必须要求您的ISP设置MX记录,否则在服务器的IP地址处接收邮件。如果您接收发往IP地址的电子邮件,请将 dc_other_hostnames 设置为该IP地址。

使用 exim4 消息

exim4 接收到来自本地和非本地系统的电子邮件时,它会在 /var/spool/exim4/input 目录中创建两个文件,这些文件在 exim4 处理消息时保存消息。为了识别特定消息, exim4 生成一个16个字符的消息ID,并在与电子邮件相关的文件名中使用该字符串。 exim4 守护进程将消息正文存储在以消息ID后跟 –D (数据)命名的文件中。它将标头和信封信息存储在以消息ID后跟 –H (标头)命名的文件中。

冻结的消息

如果 exim4 无法传递消息,它会将消息标记为冻结,并且不再尝试传递它。一旦它成功传递了电子邮件, exim4 将从 /var/spool/exim4/input 中删除与该电子邮件相关的所有文件。

发往本地系统的邮件

默认情况下, exim4 将发往本地系统的电子邮件传递到邮件假脱机目录 /var/mail 中用户的邮件文件中,格式为 mbox 格式。在此目录中,每个用户都有一个以用户用户名命名的邮件文件。邮件保留在这些文件中,直到被收集,通常由MUA收集。一旦MUA从邮件假脱机中收集了邮件,MUA就会按照用户的指示存储邮件,通常在用户的主目录中。

发往非本地系统的邮件

exim4 用于处理发往非本地系统的电子邮件的方案取决于它的配置方式:它可以将电子邮件发送到智能主机,它可以将电子邮件发送到电子邮件地址域的DNS MX记录指向的系统,或者它可以拒绝发送电子邮件。

mbox 与 maildir

mbox 格式将用户的所有消息保存在单个文件中。为了防止损坏,进程必须在向文件添加消息或从中删除消息时锁定此文件;因此,MUA不能在MTA添加消息的同时删除消息。竞争格式 maildir 将每条消息保存在单独的文件中。此格式不使用锁,允许MUA在邮件传递给同一用户的同时从用户处删除消息。此外,maildir 格式能够更好地处理更大的邮箱。缺点是当您使用IMAP等协议检查消息时, maildir 格式会增加开销。 exim4 守护进程同时支持 mbox 和 maildir 格式(请参阅 dc_localdelivery)。 Qmail, sendmailexim4 的替代品,使用 maildir 格式的邮箱。

邮件日志

默认情况下, exim4 将正常日志消息发送到 /var/exim4/mainlog,其他消息发送到同一目录中的其他文件。 mainlog 文件中的以下行描述了直接发送到远程系统SMTP服务器的电子邮件消息。 exim4 守护进程每次收到消息时写入一行,每次尝试传递消息时写入一行。“Completed”行表示 exim4 已完成其在传递消息中的部分。每行都以条目的日期和时间开头,后跟消息ID。

$ tail -3 /var/log/exim4/mainlog
2007-07-19 23:13:12 1IBljk-0000t8-1Z <= zachs@example.com U=sam P=local S=304
2007-07-19 23:13:17 1IBljk-0000t8-1Z => zachs@example.com R=dnslookup T=remote_smtp
  H=filter.mx.meer.net  [64.13.141.12]
2007-07-19 23:13:17 1IBljk-0000t8-1Z Completed

除了“Completed”行之外,每行上的下一个条目是一个双字符状态标志,告诉您该行描述的事件类型

<=

R

=>

D

–>

S

*>

N

**

F

= =

T

标志后面的信息前面会有一个字母,指示信息的类型,后跟一个等号

H

远程系统名称 (主机)

U

发送消息的用户的用户名

P

用于接收消息的协议

R

用于处理消息的路由器

T

用于处理消息的传输

S

消息的大小(字节)

前面的示例中的第一行指示 exim4 收到了一条 304 字节的消息,该消息要从本地系统上的 sam 传递到 zachs@example.com。下一行指示 exim4 使用DNS(dnslookup)查找了地址,并将其传递到 filter.mx.meer.net 的远程SMTP服务器(remote_smtp),该服务器的IP地址为 64.13.141.12。

以下日志条目描述了 exim4 从远程系统接收并传递到本地系统的消息

2007-07-19 23:13:32 1IBlk4-0000tL-8L <= zachs@gmail.com H=wx-out-0506.google.com
  [66.249.82.229]  P=esmtp S=1913 id=7154255d0707192313y304a1b27t39f...@mail.gmail.com
2007-07-19 23:13:32 1IBlk4-0000tL-8L => sam <sams@example.com> R=local_user T=mail_spool
2007-07-19 23:13:32 1IBlk4-0000tL-8L Completed

有关日志文件的更多信息,请参见 exim4 规范。如果您发送和接收大量电子邮件,则邮件日志可能会变得非常大。 logrotate exim4-base 文件会定期存档和轮换这些文件。

使用消息

您可以调用 exim4 并使用许多不同的选项来处理系统上的邮件,并生成已通过系统的邮件记录。这些选项中的大多数以 –M 开头,并且需要您要处理的电子邮件的消息ID(请参阅上一节)。以下命令从队列中删除消息

$ sudo exim4 -Mrm 1IEKKj-0006CQ-LM
Message 1IEKKj-0006CQ-LM has been removed

以下是一些您可以使用 exim4 选项来处理消息。每个选项后面都必须跟一个消息ID。有关完整列表,请参见 exim4 手册页。

–Mf

将消息标记为冻结

–Mrm

删除消息

–Mt

解冻消息

–Mvb

显示消息正文

–Mvh

显示消息标头

别名和转发

您可以使用 aliases.forward 文件来转发电子邮件。

/etc/aliases

大多数时候,当您发送电子邮件时,它会发送给特定的人;收件人 user@system 映射到指定系统上的真实用户。但是,有时您可能希望电子邮件发送给一类用户,而不是特定的收件人。用户类别的示例包括 postmasterwebmasterroottech_support。不同的用户可能会在不同的时间收到此电子邮件,或者电子邮件可能会发送给一组用户。您可以使用 /etc/aliases 文件将本地地址和类别映射到本地用户、文件、命令以及本地和非本地地址。

/etc/aliases 中的每一行都包含本地(伪)用户的名称,后跟冒号、空格和以逗号分隔的目的地列表。由于发送到 root 帐户的电子邮件很少被检查,因此默认安装包含类似于以下内容的条目,该条目将发送到 root 的电子邮件重定向到初始用户

root:		sam

您可以设置别名以将电子邮件转发给多个用户。以下行将发送到本地系统上的 abuse 的邮件转发给 sammax

abuse:		sam, max

您可以使用这种类型的别名创建简单的邮件列表。例如,以下别名将发送到本地系统上的 admin 的所有电子邮件的副本发送给多个用户,包括位于不同系统上的 Zach

admin:		sam, helen, max, zach@example.com

您可以通过指定绝对路径名而不是目标地址来将电子邮件定向到文件。以下别名在不太尽职的系统管理员中非常流行,它将发送到 complaints 的电子邮件重定向到 /dev/null,邮件将在其中消失

complaints:				/dev/null

您还可以通过在命令前加上管道字符 (|) 将电子邮件发送到命令的标准输入。邮件列表软件(例如 Mailman)通常使用此技术。对于它维护的每个列表,Mailman 在别名文件中都有条目,例如以下针对 painting_class 的条目

painting_class:   "|/var/lib/mailman/mail/mailman post painting_class"

有关 exim4 文件(包括别名)的信息,请参见 exim4_files 手册页。

newaliases

编辑 /etc/aliases 后,您必须在使用 root 权限时运行 newaliases。 /usr/bin/newaliases 文件是指向 exim4 的符号链接。运行 newaliases 会调用 exim4,从而重建 exim4 别名数据库。

~/.forward

系统范围的别名在许多情况下都很有用,但非root用户无法创建或更改它们。有时您可能想要转发自己的邮件:也许您希望来自多个系统的邮件发送到一个地址,或者您可能希望在另一个办公室工作时转发邮件。 ~/.forward 文件允许普通用户转发他们的电子邮件。

.forward 文件中的行与本节前面解释的 aliases 文件的右列相同:目标每行列出一个,可以是本地用户、远程电子邮件地址、文件名或以管道字符 (|) 开头的命令。

您转发的邮件不会发送到您的本地邮箱。如果您想转发邮件并在本地邮箱中保留副本,则必须指定您的本地用户名,并在前面加上反斜杠,以防止无限循环。以下示例将 Sam 的电子邮件发送给自己(在本地系统上)和 example.com 上的系统

$cat ~sam/.forward
sams@example.com
\sam
相关程序

exim4

exim4 软件包包含几个程序。主程序 exim4 从标准输入读取并将电子邮件发送给其参数指定的收件人。您可以从命令行使用 exim4 来检查邮件传递系统是否正常工作以及通过电子邮件发送脚本的输出。有关示例,请参见“测试”。命令 apropos exim4 显示与 exim4 相关的文件和实用程序列表。此外,您可以调用带有选项的 exim4 或通过链接调用它以使其执行各种任务。

exim4 –bp

当您使用 –bp 选项调用 exim4 时,或者当您调用 mailq 实用程序(它是指向 exim4 的符号链接)时,它会显示传出邮件队列的状态。当队列中没有消息时,它不显示任何内容。除非是暂时的,否则队列中的消息通常表示本地或远程MTA配置或网络问题。

$ sudo exim4 -bp
24h 262 1IBhYI-0006iT-7Q <sam@> frozen
zachs@example.com

eximstats

eximstats 实用程序显示基于 exim4 日志文件的统计信息。调用此实用程序时,请使用日志文件的名称作为参数,例如 /var/log/mainlog/var/log/mainlog2.gz。在没有任何选项的情况下,eximstats 会将基于日志文件的信息以文本格式发送到标准输出。当您包含 –html 选项时,eximstats 会生成HTML格式的输出,适合使用浏览器查看

$ eximstats -html /var/log/exim4/mainlog.2.gz  > exim.0720.html

如果您不是 adm 组的成员,则必须使用 root 权限运行上述命令。有关更多信息,请参见 eximstats 手册页。

eximon

eximon 是 eximon4 软件包的一部分,它显示 exim4 队列和日志文件的简单图形表示。


© Copyright Pearson Education。保留所有权利。

本节摘自 Mark Sobell 撰写的《Ubuntu Linux实用指南》新版第二版的第 20 章。本章继续介绍如何配置 exim4 邮件服务器(跳转到第 56 页:http://www.informit.com/content/images/9780137003884/samplepages/0137003889_Sample.pdf)本书由 Prentice Hall Professional 于 2009 年 1 月出版,ISBN 0137003889 版权所有 2009 Mark G. Sobell。有关本书的更多信息,请访问:www.informit.com/title/0137003889,要了解有关 Mark Sobell 其他书籍的更多信息,请访问:www.sobell.com Safari Books Online 订阅者可以在此处访问本书:http://my.safaribooksonline.com/9780137003884?portal=informit

加载 Disqus 评论