18.8. 一些有用的 sendmail 配置

存在无数种可能的 sendmail 配置。在此处,我们将仅说明几种重要的配置类型,这些配置在许多 sendmail 安装中将非常有用。

18.8.1. 信任用户设置 From: 字段

有时覆盖From外发邮件消息的字段非常有用。假设您有一个基于 Web 的程序生成电子邮件。通常,邮件消息似乎来自拥有 Web 服务器进程的用户。我们可能想指定一些其他源地址,以便邮件看起来像是来自该机器上的其他用户或地址。sendmail 提供了一种指定哪些系统用户被委托具有执行此操作的能力的方法。

Theuse_ct_file功能允许指定和使用列出受信任用户名称的文件。默认情况下,少量系统用户受到 sendmail 的信任(root例如)。此功能的默认文件名为/etc/mail/trusted-users在利用/etc/mail/配置目录的系统中,以及/etc/sendmail.ct在不使用该目录的系统中。您可以通过覆盖confCT_FILE定义来指定文件的名称和位置。

将 FEATURE(use_ct_file) 添加到您的sendmail.mc文件以启用该功能。

18.8.2. 管理邮件别名

邮件别名是一项强大的功能,它使邮件能够定向到邮箱,这些邮箱是目标主机上用户或进程的备用名称。例如,常见的做法是将与万维网服务器相关的反馈或评论定向到 “webmaster”。通常,在目标机器上没有名为 “webmaster” 的用户,而是另一个系统用户的别名。邮件别名的另一个常见用途是由邮件列表服务器程序利用,其中别名将传入的消息定向到列表服务器程序进行处理。

The/etc/aliases文件是存储别名的地方。sendmail 程序在确定如何处理传入的邮件消息时会查阅此文件。如果它在此文件中找到与邮件消息中的目标用户匹配的条目,它会将消息重定向到条目描述的任何位置。

具体来说,别名允许发生三件事

所有系统都需要 PostmasterMAILER-DAEMON 的别名才能符合 RFC 标准。

在定义调用程序或写入程序的别名时,始终要高度注意安全性,因为 sendmail 通常以 root 权限运行。

有关邮件别名的详细信息,请参见aliases(5)手册页。示例aliases文件在 示例 18-4 中显示。

示例 18-4. 示例别名文件

#
# The following two aliases must be present to be RFC-compliant.
# It is important to resolve them to 'a person' who reads mail routinely.
#
postmaster:    root                            # required entry
MAILER-DAEMON: postmaster                      # required entry
#
#
# demonstrate the common types of aliases
#
usenet:        janet                           # alias for a person
admin:         joe,janet                       # alias for several people
newspak-users: :include:/usr/lib/lists/newspak # read recipients from file
changefeed:    |/usr/local/lib/gup             # alias that invokes program
complaints:    /var/log/complaints             # alias writes mail to file
#

每当您更新/etc/aliases文件时,请务必运行命令
# /usr/bin/newaliases
以重建 sendmail 内部使用的数据库。/usr/bin/newaliases 命令是指向 sendmail 可执行文件的符号链接,并且当以这种方式调用时,其行为与以以下方式调用时完全相同
# /usr/lib/sendmail -bi
newaliases 命令是一种替代且更方便的方式来执行此操作。

18.8.3. 使用智能主机

有时,主机发现邮件无法直接传递到所需远程主机。通常,让网络上的单个主机承担管理邮件传输到难以访问的远程主机的角色是很方便的,而不是让每个本地主机都尝试独立执行此操作。

有几个充分的理由让单个主机承担邮件管理。您可以通过仅让一个主机具有全面的邮件配置来简化管理,该配置知道如何处理所有不同的邮件传输类型,例如 UUCP、Usenet 等。所有其他主机只需要一个传输协议即可将其邮件发送到此中央主机。承担此中央邮件路由和转发角色的主机称为 智能主机。如果您有一个智能主机可以接受您的邮件,您可以向其发送任何类型的邮件,它将管理该邮件的路由和传输到所需的远程目的地。

智能主机配置的另一个良好应用是管理跨专用防火墙的邮件传输。组织可以选择安装专用 IP 网络并使用他们自己的、未注册的 IP 地址。专用网络可以通过防火墙连接到 Internet。在传统配置中,使用 SMTP 向专用网络中的主机和从专用网络中的主机发送邮件到外部世界是不可能的,因为主机无法接受或建立与 Internet 上主机的直接网络连接。相反,组织可以选择让防火墙提供邮件智能主机功能。在防火墙上运行的智能主机能够与专用网络和 Internet 上的主机建立直接网络连接。智能主机将接受来自专用网络和 Internet 上主机的邮件,将其存储在本地存储中,然后管理该邮件到正确主机的重新传输。

智能主机通常在所有其他交付方法都失败时使用。在具有专用网络的组织的情况下,让主机首先尝试直接传递邮件,如果失败,则将其发送到智能主机是完全合理的。这减轻了智能主机的许多流量,因为其他主机可以直接向专用网络上的其他主机发送邮件。

sendmail 提供了一种使用SMART_HOST功能配置智能主机的简单方法;在 Virtual Brewery 配置中实现它时,我们正是这样做的。我们配置中定义智能主机的相关部分是
define(`SMART_HOST', `uucp-new:moria')
LOCAL_NET_CONFIG
# This rule ensures that all local mail is delivered using the
# smtp transport, everything else will go via the smart host.
R$* < @ $* .$m. > $*	$#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3

TheSMART_HOST宏允许您指定应该中继您无法直接传递的所有外发邮件的主机,以及用于与其通信的邮件传输协议。

在我们的配置中,我们正在使用uucp-new传输到 UUCP 主机 moria。如果我们想配置 sendmail 以使用基于 SMTP 的智能主机,我们将改为使用类似
define(`SMART_HOST', `mail.isp.net')
我们不需要指定 SMTP 作为传输,因为它是默认值。

您能猜到LOCAL_NET_CONFIG宏和重写规则可能在做什么吗?

TheLOCAL_NET_CONFIG宏允许您将原始 sendmail 重写规则添加到您的配置中,这些规则定义了哪些邮件应该保留在本地邮件系统中。在我们的示例中,我们使用了一个规则,该规则匹配主机属于我们域的任何电子邮件地址 (.$m.) 并重写它,以便将其直接发送到SMTP邮件程序。这确保了发送到我们本地域上任何主机的任何消息都会立即定向到 SMTP 邮件程序并转发到该主机,而不是回退到我们的智能主机,这是默认处理方式。

18.8.4. 管理不需要的或未经请求的邮件(垃圾邮件)

如果您订阅了邮件列表,在网站上发布了您的电子邮件地址,或在 UseNet 上发布了一篇文章,您很可能已经开始收到未经请求的广告电子邮件。现在,人们普遍会在网上搜索电子邮件地址,以添加到邮件列表中,然后将邮件列表出售给寻求宣传其产品的公司。这种群发邮件行为通常称为垃圾邮件。

《免费在线计算词典》对垃圾邮件提供了特定于邮件的定义:[1]

2.(上述意义 1 的缩小)不加区分地发送大量未经请求的电子邮件,旨在推广产品或服务。从这个意义上讲,垃圾邮件有点像发送给“住户”的垃圾邮件的电子等价物。

在 1990 年代,随着商业意识在网络上的兴起,实际上有一些人渣将垃圾邮件作为一项“服务”提供给希望在网络上做广告的公司。他们通过邮寄到电子邮件地址、Usenet 新闻或邮件列表的集合来做到这一点。这种做法引起了许多网民对相关个人的愤怒和激烈的反应。

幸运的是,sendmail 包括一些对机制的支持,这些机制可以帮助您处理未经请求的邮件。

18.8.4.1. 实时黑名单

实时黑名单是一项公共设施,旨在帮助减少您必须处理的未经请求的广告量。已知的电子邮件来源和主机列在 Internet 上的可查询数据库中。它们是由收到来自某些电子邮件地址的未经请求的广告的人员输入到那里的。由于在关闭垃圾邮件方面的疏忽,主要域有时会发现自己出现在列表中。虽然有些人抱怨列表维护者做出的特定选择,但它仍然非常受欢迎,并且通常可以快速解决分歧。有关该服务如何运行的完整详细信息可以在邮件滥用保护系统的主页 http://maps.vix.com/rbl/ 中找到。

如果您启用此 sendmail 功能,它将针对实时黑名单测试每个传入邮件消息的源地址,以确定是否接受该消息。如果您运行一个拥有许多用户的大型站点,此功能可以节省大量磁盘空间。此功能接受一个参数来指定要使用的服务器的名称。默认值是 rbl.maps.vix.com 上的主服务器。

要配置实时黑名单功能,请将以下宏声明添加到您的sendmail.mc文件
FEATURE(rbl)

如果您希望指定其他 RBL 服务器,您可以使用看起来像
FEATURE(rbl,`rbl.host.net')

18.8.4.2. 访问数据库

另一种系统以手动配置为代价提供了更大的灵活性和控制,是 sendmail access_db 功能。访问数据库允许您配置将接受来自哪些主机或用户的邮件,以及将为哪些主机中继邮件。

管理您将为谁中继邮件非常重要,因为这是垃圾邮件主机通常采用的另一种技术,以规避刚刚描述的实时黑名单之类的系统。垃圾邮件发送者不是直接向您发送邮件,而是通过某些允许中继邮件的不设防主机中继邮件。然后,传入的 SMTP 连接不是来自已知的垃圾邮件主机,而是来自中继主机。为了确保您自己的邮件主机不会以这种方式使用,您应该仅为已知主机中继邮件。sendmail 8.9.0 或更高版本默认禁用中继,因此对于这些版本,您需要使用访问数据库来启用单个主机进行中继。

总体思路很简单。当收到新的传入 SMTP 连接时,sendmail 会检索消息头信息,然后查阅访问数据库以查看是否应继续接受消息本身的正文。

访问数据库是描述应针对从指定主机收到的消息采取的操作的规则集合。默认访问控制文件名为/etc/mail/access。该表具有简单的格式。表的每一行都包含一个访问规则。每个规则的左侧是用于匹配传入邮件消息的发送者的模式。它可以是完整的电子邮件地址、主机名或 IP 地址。右侧是要采取的操作。您可以配置五种类型的操作。这些是

OK

接受邮件消息。

RELAY

即使消息不是发往我们的主机的,也接受来自此主机或用户的消息;也就是说,接受来自此主机的消息以中继到其他主机。

REJECT

拒绝邮件,并显示通用消息。

DISCARD

使用$#discard邮件程序丢弃消息。

### 任何文本

使用###作为错误代码(应符合 RFC-821 标准)和 “任何文本” 作为消息返回错误消息。

一个示例/etc/mail/access可能看起来像
friends@cybermail.com   REJECT
aol.com                 REJECT
207.46.131.30           REJECT
postmaster@aol.com      OK
linux.org.au            RELAY

此示例将拒绝从 friends@cybermail.comaol.com 域中的任何主机和主机 207.46.131.30 收到的任何电子邮件。下一个规则将接受来自 postmaster@aol.com 的电子邮件,尽管该域本身具有拒绝规则。最后一个规则允许中继来自 linux.org.au 域中任何主机的邮件。

要启用访问数据库功能,请在您的sendmail.mc文件
FEATURE(access_db)

中使用以下声明默认定义使用hash -o /etc/mail/access

18.8.4.3. 禁止用户接收邮件

如果您有用户或自动化进程发送邮件但永远不需要接收邮件,则有时拒绝接受发往他们的邮件很有用。这节省了存储永远不会被读取的邮件的浪费磁盘空间。blacklist_recipients 功能与 access_db 功能结合使用时,允许您禁用本地用户接收邮件。

要启用该功能,如果它们尚不存在,请将以下行添加到您的sendmail.mc文件
FEATURE(access_db)
FEATURE(blacklist_recipients)

要禁用本地用户接收邮件,只需将他的详细信息添加到访问数据库中即可。通常,您会使用###条目样式,该样式将向发送者返回有意义的错误消息,以便他们知道为什么邮件未被传递。此功能同样适用于虚拟邮件域中的用户,您必须在访问数据库规范中包含虚拟邮件域。一些示例/etc/mail/access条目可能看起来像
daemon          550 Daemon does not accept or read mail.
flacco          550 Mail for this user has been administratively disabled.
grump@dairy.org 550 Mail disabled for this recipient.

18.8.5. 配置虚拟电子邮件托管

虚拟电子邮件托管为主机提供了代表多个不同域接受和传递邮件的功能,就像它是多个单独的邮件主机一样。最常见的是,Internet 应用程序提供商结合虚拟 Web 托管来利用虚拟托管,但它配置简单,而且您永远不知道何时可能会处于为您最喜欢的 Linux 项目虚拟托管邮件列表的位置,因此我们在此处对其进行描述。

18.8.5.1. 接受其他域的邮件

sendmail 收到电子邮件消息时,它会将消息头中的目标主机与本地主机名进行比较。如果它们匹配,sendmail 将接受消息以进行本地传递;如果它们不同,sendmail 可能会决定接受消息并尝试将其转发到最终目的地(有关如何配置 sendmail 以接受邮件进行转发的详细信息,请参见本章前面的 第 18.8.4.2 节)。

如果我们希望配置虚拟电子邮件托管,我们需要做的第一件事是说服 sendmail 它也应该接受我们托管的域的邮件。幸运的是,这是一件非常简单的事情。

sendmail use_cw_file 功能允许我们指定一个文件的名称,我们在该文件中存储 sendmail 接受邮件的域名。要配置此功能,请将功能声明添加到您的sendmail.mc文件
FEATURE(use_cw_file)

文件中该文件的默认名称将是/etc/mail/local-host-names/etc/mail/对于使用/etc/sendmail.cw对于不使用该目录的发行版。或者,您可以通过覆盖confCW_FILE宏(使用
define(`confCW_FILE',`/etc/virtualnames')

的变体)来指定文件的名称和位置。为了坚持使用默认文件名,如果我们希望为 bovine.netdairy.orgartist.org 域提供虚拟托管,我们将创建一个该文件的默认名称将是,如下所示
bovine.net
dairy.org
artist.org

完成后,并假设存在将这些域名指向我们主机的适当 DNS 记录,sendmail 将接受这些域的邮件消息,就像它们是发往我们真实域名的消息一样。

18.8.5.2. 将虚拟托管邮件转发到其他目的地

sendmail virtusertable 功能配置了对虚拟用户表的支持,我们在其中配置虚拟电子邮件托管。虚拟用户表将发往某些 user@host 的传入邮件映射到某些 otheruser@otherhost。您可以将其视为高级邮件别名功能,该功能不仅使用目标用户,还使用目标域进行操作。

要配置 virtusertable 功能,请将该功能添加到您的sendmail.mc配置中,如下所示
FEATURE(virtusertable)

默认情况下,包含执行转换规则的文件将是/etc/mail/virtusertable。您可以通过为宏定义提供参数来覆盖它;请查阅详细的 sendmail 参考资料,以了解有哪些选项可用。

虚拟用户表的格式非常简单。每行左侧包含一个表示原始目标邮件地址的模式;右侧有一个表示虚拟托管地址将映射到的邮件地址的模式。

以下示例显示了三种可能的条目类型
samiam@bovine.net     colin
sunny@bovine.net      darkhorse@mystery.net
@dairy.org            mail@jhm.org
@artist.org           $1@red.firefly.com
在此示例中,我们正在虚拟托管三个域:bovine.netdairy.orgartist.org

第一个条目将发送到 bovine.net 虚拟域中用户的邮件重定向到机器上的本地用户。第二个条目将发送到同一虚拟域中用户的邮件重定向到另一个域中的用户。第三个示例将发送到 dairly.org 虚拟域中任何用户的邮件重定向到单个远程邮件地址。最后,最后一个条目将发送到 artist.org 虚拟域中用户的任何邮件重定向到另一个域中的同一用户;例如,julie@artists.org 将被重定向到 julie@red.firefly.com

注释

[1]

《免费在线计算词典》可以在许多 Linux 发行版中找到,也可以在其主页 http://wombat.doc.ic.ac.uk/foldoc/ 上在线找到。