第 31 章 电子邮件

如果发现翻译错误,请直接 发起PR修改

31.1. 简介

“电子邮件”,更为人所知的是 email ,是当今最广泛使用的通信形式之一。本章介绍了在 FreeBSD 上运行邮件服务器的基本概念,以及使用 FreeBSD 发送和接收电子邮件的简介。如需更全面的内容,请参考 Bibliography 中列出的书籍。

本章内容包括:

  • 发送和接收电子邮件涉及哪些软件组件?

  • 如何配置 DragonFly Mail Agent 。

  • 在 FreeBSD 中,基本的 Sendmail 配置文件位于哪里?

  • 远程邮箱和本地邮箱的区别。

  • 如何安装和配置替代的邮件传输代理( Mail Transfer Agent ),以替换 DragonFly Mail Agent 或 Sendmail 。

  • 如何解决常见的邮件服务器问题。

  • 如何配置 Sendmail 仅发送邮件。

  • 如何在 Sendmail 中配置 SMTP 身份验证以增加安全性。

  • 如何安装和使用邮件用户代理( Mail User Agent ),例如 mutt ,来发送和接收电子邮件。

  • 如何从远程的 POP 或 IMAP 服务器下载邮件。

  • 如何自动应用过滤器和规则到收件箱中的电子邮件。

31.2. 邮件组件

电子邮件交换涉及五个主要部分:邮件用户代理( MUA ),邮件传输代理( MTA ),邮件主机,远程或本地邮箱以及 DNS 。本节概述了这些组件。

邮件用户代理( MUA )

邮件用户代理( MUA )是一种用于撰写、发送和接收电子邮件的应用程序。这个应用程序可以是一个命令行程序,比如内置的 mail 实用程序,也可以是来自 Ports Collection 的第三方应用程序,比如 alpine 、 elm 或 mutt 。 Ports Collection 中还提供了许多图形化程序,包括 Claws Mail 、 Evolution 和 Thunderbird 。一些组织提供了一个可以通过 Web 浏览器访问的 Web 邮件程序。关于在 FreeBSD 上安装和使用 MUA 的更多信息可以在 邮件用户代理 中找到。

邮件传输代理( MTA )

邮件传输代理( MTA )负责接收传入邮件和投递传出邮件。从 FreeBSD 14.0 版本开始,默认的 MTA 是 DragonFly Mail Agent ( dma(8) );在早期版本中,默认的 MTA 是 sendmail(8) 。其他 MTA ,包括 Exim 、 Postfix 和 qmail ,可以安装来替换默认的 MTA 。

邮件主机和邮箱

邮件主机是负责为主机或网络传递和接收邮件的服务器。邮件主机收集发送到该域的所有邮件,并根据配置将其存储在默认的 mbox 或备选的 Maildir 格式中。一旦邮件被存储,可以使用 MUA 在本地阅读,也可以使用 POP 或 IMAP 等协议进行远程访问和收取。如果邮件在本地阅读,则不需要安装 POP 或 IMAP 服务器。

域名系统( DNS )

域名系统( DNS )及其守护进程 named(8) 在邮件传递中起着重要作用。为了将邮件从一个站点传递到另一个站点,邮件传输代理( MTA )将在 DNS 中查找远程站点,以确定哪个主机将接收目标站点的邮件。当邮件从远程主机发送到 MTA 时,也会发生这个过程。

31.3. DragonFly Mail Agent ( DMA )

DragonFly Mail Agent (DMA) 是 FreeBSD 14.0 版本开始的默认邮件传输代理( MTA )。 dma(8) 是一个小型的邮件传输代理,专为家庭和办公室使用而设计。它接收来自本地安装的邮件用户代理( MUA )的邮件,并将邮件传递到本地或远程目的地。远程传递包括多个功能,如 TLS/SSL 支持和 SMTP 身份验证。

dma(8) 并不是用来替代真正的、大型的邮件传输代理( MTA )如 sendmail(8)postfix(1) 的。因此, dma(8) 不会监听端口 25 来接收传入连接。

31.3.1. 配置 DragonFly Mail Agent (DMA)

DMA 带有一个默认配置,适用于许多部署。自定义设置在 [/etc/dma/dma.conf] 中定义, SMTP 身份验证在 [/etc/dma/auth.conf] 中配置。

31.3.1.1. 使用 DMA 通过 Gmail 路由发送邮件( STARTTLS:SMTP 示例)

这个示例 /etc/dma/dma.conf 可以用来通过 Google 的 SMTP 服务器发送邮件。

SMARTHOST smtp.gmail.com
PORT 587
AUTHPATH /etc/dma/auth.conf
SECURETRANSFER
STARTTLS
MASQUERADE [email protected]

在 [/etc/dma/auth.conf] 文件中,可以通过一行代码设置身份验证。

[email protected]|smtp.gmail.com:password

执行以下命令来测试配置:

% echo this is a test | mail -v -s testing-email [email protected]

31.3.1.2. 使用 DMA 将出站邮件通过 Fastmail 路由( SSL/TLS 示例)

这个示例 /etc/dma/dma.conf 可以用来通过 Fastmail 的 SMTP 服务器发送邮件。

SMARTHOST smtp.fastmail.com
PORT 465
AUTHPATH /etc/dma/auth.conf
SECURETRANSFER
MAILNAME example.server.com

在 [/etc/dma/auth.conf] 文件中,可以通过一行代码设置身份验证。

[email protected]|smtp.fastmail.com:password

执行以下命令来测试配置:

% echo this is a test | mail -v -s testing-email [email protected]

31.3.1.3. 使用 DMA 将出站邮件路由到自定义邮件主机

这个示例 /etc/dma/dma.conf 可以用来使用自定义邮件主机发送邮件。

SMARTHOST mail.example.org
PORT 587
AUTHPATH /etc/dma/auth.conf
SECURETRANSFER
STARTTLS

在 [/etc/dma/auth.conf] 文件中,可以通过一行代码设置身份验证。

[email protected]|mail.example.org:password

执行以下命令来测试配置:

% echo this is a test | mail -v -s testing-email [email protected]

31.4. Sendmail 是一种用于电子邮件传输的开源软件。它是一种邮件传输代理( MTA ),用于将电子邮件从发送者的计算机发送到接收者的计算机。 Sendmail 具有广泛的功能和灵活性,可以在各种操作系统上运行,并且被广泛用于互联网上的电子邮件传输。它支持多种邮件协议和格式,并提供了丰富的配置选项,使用户能够根据自己的需求进行定制。 Sendmail 是互联网上最早的邮件传输代理之一,至今仍然被广泛使用。

Sendmail 是一个古老而多功能的邮件传输代理( MTA ),在 UNIX 和类 UNIX 系统中有着悠久的历史。它曾是 FreeBSD 基本系统的一部分,直到 FreeBSD 13 版本,提供强大的电子邮件传输功能、广泛的自定义选项以及对复杂路由和过滤的支持。

31.4.1. 配置文件

Sendmail 的配置文件位于 [/etc/mail/] 目录中。

/etc/mail/access

此访问数据库文件定义了哪些主机或 IP 地址可以访问本地邮件服务器以及他们的访问权限。以“ OK ”列出的主机是允许向本主机发送邮件的,默认选项是只要邮件的最终目的地是本地机器即可。以“ REJECT ”列出的主机将被拒绝所有邮件连接。以“ RELAY ”列出的主机可以使用此邮件服务器发送任何目的地的邮件。以“ ERROR ”列出的主机将返回带有指定邮件错误的邮件。如果将主机列为“ SKIP ”, Sendmail 将中止对此条目的当前搜索,而不接受或拒绝邮件。以“ QUARANTINE ”列出的主机的消息将被保留,并将收到指定的文本作为保留原因。

在 FreeBSD 的示例配置文件 /etc/mail/access.sample 中可以找到使用这些选项的 IPv4 和 IPv6 地址的示例。

要配置访问数据库,请使用示例中显示的格式在 [/etc/mail/access] 文件中进行条目输入,但不要在条目前面加上注释符号( # )。为每个需要配置访问权限的主机或网络创建一个条目。与表格左侧匹配的邮件发送者将受到表格右侧操作的影响。

每当此文件更新时,更新其数据库并重新启动 Sendmail :

# makemap hash /etc/mail/access < /etc/mail/access
# service sendmail restart
/etc/mail/aliases

这个数据库文件包含了一个虚拟邮箱列表,这些邮箱可以扩展到用户、文件、程序或其他别名。以下是一些条目,用于说明文件格式:

root: localuser
ftp-bugs: joe,eric,paul
bit.bucket:  /dev/null
procmail: "|/usr/local/bin/procmail"

冒号左侧的邮箱名称会被扩展为右侧的目标邮箱。第一个条目将 root 邮箱扩展为 localuser 邮箱,然后在 .filename/etc/mail/aliases 数据库中查找。如果找不到匹配项,则将消息发送到 localuser 。第二个条目显示了一个邮件列表。邮件发送到 ftp-bugs 会被扩展为三个本地邮箱 joeericpaul 。远程邮箱可以指定为_user @ example.com_。第三个条目展示了如何将邮件写入文件,本例中为 .filename/dev/null 。最后一个条目演示了如何通过 UNIX® 管道将邮件发送到一个程序,即 .filename/usr/local/bin/procmail 。有关此文件格式的更多信息,请参考 aliases(5)

每当此文件更新时,运行 newaliases 命令以更新和初始化别名数据库。

/etc/mail/sendmail.cf

这是 Sendmail 的主配置文件。它控制 Sendmail 的整体行为,包括从重写电子邮件地址到向远程邮件服务器打印拒绝消息的一切。因此,这个配置文件非常复杂。幸运的是,对于标准邮件服务器来说,这个文件很少需要更改。

主 Sendmail 配置文件可以使用定义 Sendmail 功能和行为的 m4 宏来构建。有关详细信息,请参阅 /usr/src/contrib/sendmail/cf/README 文件。

每当对该文件进行更改时,需要重新启动 Sendmail 才能使更改生效。

/etc/mail/virtusertable

这个数据库文件将虚拟域和用户的邮件地址映射到真实的邮箱。这些邮箱可以是本地的、远程的、在 [/etc/mail/aliases](/etc/mail/aliases) 中定义的别名,或者是文件。这样可以在一台机器上托管多个虚拟域。

FreeBSD 在 [/etc/mail/virtusertable.sample] 提供了一个示例配置文件,以进一步展示其格式。以下示例演示了如何使用该格式创建自定义条目:

此文件按照第一匹配的顺序进行处理。当电子邮件地址与左侧的地址匹配时,它将映射到右侧列出的本地邮箱。在此示例中,第一条目的格式将特定的电子邮件地址映射到本地邮箱,而第二条目的格式将特定的电子邮件地址映射到远程邮箱。最后,任何未与前面的条目匹配的来自 example.com 的电子邮件地址将匹配最后一个映射,并发送到本地邮箱 joe 。创建自定义条目时,请使用此格式并将其添加到 /etc/mail/virtusertable 。每当编辑此文件时,请更新其数据库并重新启动 Sendmail :

# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
# service sendmail restart
/etc/mail/relay-domains

在默认的 FreeBSD 安装中, Sendmail 被配置为只能从运行它的主机发送邮件。例如,如果有一个 POP 服务器可用,用户可以从远程位置检查邮件,但他们将无法从外部位置发送出站邮件。通常,在尝试发送邮件后的几分钟内,将会收到来自 MAILER-DAEMON 的邮件,并附带有 5.7 Relaying Denied 的消息。

最直接的解决方案是将 ISP 的 FQDN 添加到 [/etc/mail/relay-domains] 文件中。如果需要多个地址,请每行添加一个地址:

your.isp.example.com
other.isp.example.net
users-isp.example.org
www.example.org

在创建或编辑此文件后,使用 service sendmail restart 重新启动 Sendmail 。

现在,只要在此列表中的任何主机通过系统发送邮件,并且用户在系统上有一个账户,邮件将会成功发送。这使得用户可以远程从系统发送邮件,而不会使系统暴露于来自互联网的垃圾邮件中继。

31.5. 更改邮件传输代理

从 FreeBSD 14.0 版本开始,默认的 MTA 是 dma(8) ,而在 14.0 之前,默认的 MTA 是 sendmail(8) 。然而,系统管理员可以更改系统的 MTA 。在 FreeBSD Ports Collection 的 mail 类别中提供了多种可选的 MTA 。

如果默认的出站邮件服务被禁用,重要的是要用替代的邮件传递系统来替代它。否则,像 periodic(8) 这样的系统功能将无法通过电子邮件传递其结果。系统的许多部分都期望有一个可用的邮件传输代理( MTA )。如果应用程序在禁用后继续使用默认的二进制文件尝试发送电子邮件,邮件可能会进入非活动队列并永远无法传递。

31.5.1. 替换 Sendmail 与其他 MTA

为了完全禁用 sendmail(8) ,执行以下命令:

# sysrc sendmail_enable="NO"
# sysrc sendmail_submit_enable="NO"
# sysrc sendmail_outbound_enable="NO"
# sysrc sendmail_msp_queue_enable="NO"

要仅禁用 sendmail(8) 的传入邮件服务,请执行以下命令:

# sysrc sendmail_enable="NO"

然后停止 sendmail(8) 服务:

# service sendmail onestop

由于 sendmail(8) 非常普遍,一些软件假设它已经安装和配置好,因此需要进行一些额外的配置。请检查 .filename#/etc/periodic.conf# 文件,并确保这些值设置为 NO 。如果该文件不存在,请创建并添加以下条目:

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

下一步是安装另一个 MTA ,本示例将使用 dma(8) 。如上所述, dma(8) 是 FreeBSD 14.0 版本开始的默认 MTA 。因此,如果您使用的是旧版本,则只需要从 ports 安装它。

要安装它,请执行以下命令:

# pkg install dma

按照 << 配置 Dragonfly 邮件代理 >> 中所示进行配置。

然后将文件 /etc/mail/mailer.conf 中的所有条目更改为 dma(8)

# $FreeBSD$
#
# Execute the "real" sendmail program, named /usr/libexec/sendmail/sendmail
#
# If dma(8) is installed, an example mailer.conf that uses dma(8) instead can
# be found in /usr/share/examples/dma
#
sendmail        /usr/local/libexec/dma
mailq           /usr/local/libexec/dma
newaliases      /usr/local/libexec/dma

当使用基本系统中包含的 dma(8) 版本时,路径将更改为 [/usr/libexec/dma]#.

为了确保在启动或关机之前将队列中的所有内容刷新,请执行以下命令:

# sysrc dma_flushq_enable="YES"

一旦所有配置完成,建议重新启动系统。重新启动可以确保系统正确配置,以便在启动时自动启动新的 MTA 。

31.5.2. 用其他邮件传输代理( MTA )替换 DragonFly Mail Agent ( DMA )

如上所述,从 FreeBSD 14.0 版本开始,默认的 MTA 是 DMA 。在这个例子中,将使用 mail/postfix 作为替代的 MTA 。

在安装 mail/postfix 之前,需要进行一些额外的配置。检查 /etc/periodic.conf 并确保这些值设置为 NO 。如果该文件不存在,请创建它并添加以下条目:

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

然后安装包: mail/postfix[] :

# pkg install postfix

要在系统启动时启动 mail/postfix ,执行以下命令:

# sysrc postfix_enable="YES"

在安装应用程序后阅读安装消息是一个好的做法。它提供了有关设置等方面的有用信息。

如果在 /usr/local/etc/mail/mailer.conf 中 * 尚未 * 激活后缀,请执行以下命令:

mv /usr/local/etc/mail/mailer.conf /usr/local/etc/mail/mailer.conf.old
install -d /usr/local/etc/mail
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf

在使用 SASL 时,请确保 postfix 有权限读取 sasldb 文件。可以通过将 postfix 添加到 mail 组,并将 /usr/local/etc/sasldb* 文件设置为 mail 组可读(这应该是新安装的默认设置)来实现这一点。

一旦所有配置完成,建议重新启动系统。重新启动可以确保系统正确配置,以便在启动时自动启动新的 MTA 。

31.6. 邮件用户代理

MUA 是一种用于发送和接收电子邮件的应用程序。随着电子邮件的“演变”和变得越来越复杂, MUA 变得越来越强大,为用户提供了更多的功能和灵活性。 FreeBSD Ports Collection 的“ mail ”类别中包含了许多 MUA 。这些包括图形化的电子邮件客户端,如 Evolution 或 Balsa ,以及基于控制台的客户端,如 mutt 或 alpine 。

31.6.1. 邮件

mail(1) 是默认安装在 FreeBSD 上的 MUA (邮件用户代理)。它是一个基于控制台的 MUA ,提供发送和接收基于文本的电子邮件所需的基本功能。它提供有限的附件支持,并且只能访问本地邮箱。

虽然 mail(1) 本身不支持与 POP 或 IMAP 服务器的交互,但可以使用诸如 fetchmail 或 getmail 之类的应用程序将这些邮箱下载到本地的 mbox 中。

为了发送和接收电子邮件,请运行 mail(1)

% mail

用户的邮箱内容位于 /var/mail 中,会被 mail(1) 自动读取。如果邮箱为空,该工具将退出并显示一条消息表示未找到邮件。如果存在邮件,应用程序界面将启动,并显示一份消息列表。

消息会自动编号,如下面的示例所示:

Mail version 8.1 6/6/93.  Type ? for help.
"/var/mail/username": 3 messages 3 new
>N  1 root@localhost        Mon Mar  8 14:05  14/510   "test"
 N  2 root@localhost        Mon Mar  8 14:05  14/509   "user account"
 N  3 root@localhost        Mon Mar  8 14:05  14/509   "sample"

现在可以通过键入 t 后跟消息编号来阅读消息。

这个例子读取第一封电子邮件:

& t 1
Message 1:
From root@localhost  Mon Mar  8 14:05:52 2004
X-Original-To: username@localhost
Delivered-To: username@localhost
To: username@localhost
Subject: test
Date: Mon,  8 Mar 2004 14:05:52 +0200 (SAST)
From: root@localhost (Charlie Root)

This is a test message, please reply if you receive it.

如本示例所示,消息将显示完整的标题。

要再次显示消息列表,请按下 h

如果需要回复邮件,请按下 Rr 键。 R 命令指示 mail(1) 仅回复邮件的发送者,而 r 命令则回复给所有其他收件人。这些命令可以在回复的邮件编号后面添加。在输入回复内容后,邮件的结尾应该用单独一行的 . 标记。

下面是一个示例:

& R 1
To: root@localhost
Subject: Re: test

Thank you, I did get your email.
.
EOT

要发送一封新邮件,按下 m 键,然后输入收件人的电子邮件地址。可以通过使用 , 分隔符来指定多个收件人。然后可以输入邮件的主题,然后是邮件内容。邮件的结束应该在单独的一行上放置一个单独的 .

& mail root@localhost
Subject: I mastered mail

Now I can send and receive email using mail ... :)
.
EOT

在使用 mail(1) 时,按下 ? 以随时显示帮助。有关如何使用 mail(1) 的更多帮助,请参考 mail(1)

mail(1) 并不是为了处理附件而设计的,因此在处理附件方面表现不佳。较新的邮件用户代理( MUAs )以更智能的方式处理附件。

31.6.2. Mutt 是一个基于文本的电子邮件客户端,它在 Unix-like 操作系统上运行。它具有高度可定制性和灵活性,可以通过配置文件进行个性化设置。 Mutt 支持多种邮件协议,包括 POP3 、 IMAP 和 SMTP ,并且可以与其他工具集成,如 GnuPG 和 Muttprint 。它被广泛用于命令行环境下的电子邮件管理。

Mutt 是一个功能强大的邮件用户代理程序,具有许多功能,包括:

  • 线程消息的能力。

  • PGP 支持对电子邮件进行数字签名和加密。

  • MIME 支持。

  • Maildir 支持。

  • 高度可定制。

请参考链接: [http://www.mutt.org](http://www.mutt.org) 获取有关 Mutt 的更多信息。

值得一提的是一个名为 NeoMutt 的 Mutt 分支,它带来了额外的功能。请访问链接了解更多信息: [NeoMutt 网站](https://neomutt.org/about.html) 。如果选择 NeoMutt ,请将以下命令示例中的 mutt 替换为 neomutt

Mutt 可以使用 mail/mutt 端口进行安装。安装完成后,可以通过以下命令启动 Mutt :

% mutt

Mutt 将自动读取并显示用户邮箱的内容,路径为 /var/mail 。如果没有找到邮件, Mutt 将等待用户的命令。下面的示例显示了 Mutt 显示消息列表的情况:

Mutt 邮件客户端显示消息列表

要阅读一封电子邮件,使用光标键选择它,然后按下 Enter 。下面是 Mutt 显示电子邮件的示例:

Mutt 邮件客户端显示一封电子邮件

mail(1) 类似, Mutt 可以用于仅回复邮件的发件人,也可以回复给所有收件人。要仅回复给邮件的发件人,按下键盘上的 [r] 键。要向原始发件人和所有收件人发送群组回复,按下键盘上的 [g] 键。

默认情况下, Mutt 使用 vi(1) 编辑器来创建和回复电子邮件。每个用户可以通过在其主目录中创建或编辑 .filename#.muttrc# 文件并设置 editor 变量,或者设置 EDITOR 环境变量来自定义此设置。有关配置 Mutt 的更多信息,请参阅 http://www.mutt.org/

按下 m 键来撰写一封新的邮件。在输入有效的主题后, Mutt 将启动 vi(1) 以便编写邮件内容。完成邮件内容后,保存并退出 vi 。 Mutt 将恢复,并显示待发送邮件的摘要屏幕。要发送邮件,请按下 y 键。下面是摘要屏幕的示例:

Mutt 邮件客户端显示摘要屏幕

Mutt 包含丰富的帮助信息,可以通过在大多数菜单中按下 ? 来访问。在适当的情况下,顶部行还显示键盘快捷键。

31.6.3. 阿尔卑斯

Alpine 面向初学者用户,同时也包含一些高级功能。

在过去, Alpine 曾发现过几个远程漏洞,允许远程攻击者通过发送特制的电子邮件,在本地系统上以用户身份执行任意代码。虽然已经修复了已知的问题,但 Alpine 的代码编写方式存在安全隐患, FreeBSD 安全官员认为可能还存在其他未被发现的漏洞。用户在安装 Alpine 时需自行承担风险。

可以使用 mail/alpine 端口安装当前版本的 alpine 。安装完成后,可以通过以下命令启动 alpine :

% alpine

当 alpine 第一次运行时,它会显示一个问候页面,其中包含简要介绍,以及 alpine 开发团队的请求,要求发送一封匿名电子邮件,以便他们判断有多少用户在使用他们的客户端。要发送这封匿名邮件,请按下 Enter 。或者,按下 E 退出问候页面,而不发送匿名邮件。下面是问候页面的示例:

Alpine 邮件客户端显示问候页面。

然后显示主菜单,可以使用光标键进行导航。该主菜单提供了快捷方式,用于撰写新邮件、浏览邮件目录和管理通讯录条目。在主菜单下方,显示了与当前任务相关的执行特定功能的键盘快捷键。

alpine 打开的默认目录是 inbox 。要查看消息索引,请按下 I ,或选择下面显示的 MESSAGE INDEX 选项。

Alpine 邮件客户端显示默认目录。

消息索引显示当前目录中的消息,并可以使用光标键进行导航。按下 Enter 可以阅读突出显示的消息。

Alpine 邮件客户端显示消息索引

在下面的截图中, alpine 显示了一个示例消息。屏幕底部显示了上下文键盘快捷键。一个快捷键的示例是 r ,它告诉 MUA 回复当前显示的消息。

阿尔派恩邮件客户端显示一封电子邮件。

在 alpine 中回复电子邮件是使用 pico 编辑器完成的, pico 编辑器是 alpine 的默认安装选项。 pico 编辑器使得浏览邮件变得容易,并且对于新手用户来说比 vi(1)mail(1) 更容易使用。完成回复后,按下 Ctrl+X 即可发送邮件。在发送邮件之前, alpine 会要求确认。

阿尔派恩邮件客户端显示消息撰写窗口

可以使用主菜单中的 SETUP 选项来自定义 Alpine 。

31.7. 高级主题

本节涵盖了更复杂的主题,如邮件配置和为整个域名设置邮件。

31.7.1. 基本配置

只要配置了 /etc/resolv.conf 或者网络可以访问到配置的 DNS 服务器,就可以直接向外部主机发送电子邮件。要将电子邮件传递到 FreeBSD 主机上的 MTA ,请执行以下操作之一:

  • 为该域名运行一个 DNS 服务器。

  • 将邮件直接发送到机器的 FQDN 。

为了直接将邮件投递到主机,它必须拥有一个永久的静态 IP 地址,而不是动态 IP 地址。如果系统位于防火墙后面,必须配置防火墙以允许 SMTP 流量。要在主机上直接接收邮件,必须配置以下两种方式之一:

  • 确保 DNS 中最低编号的 MX 记录指向主机的静态 IP 地址。

  • 确保 DNS 中没有主机的 MX 记录。

以上两种方法都可以直接将邮件发送到主机。

试试这个:

# hostname

输出应该类似于以下内容:

example.FreeBSD.org
# host example.FreeBSD.org

输出应该类似于以下内容:

example.FreeBSD.org has address 204.216.27.XX

在这个例子中,直接发送到 mailto:yourlogin @ example.FreeBSD.org[yourlogin @ example.FreeBSD.org] 的邮件应该可以正常工作,前提是在 example.FreeBSD.org 上运行了一个功能齐全的 MTA 。请注意, dma(8) 不会在端口 25 上监听传入连接,因此在这种情况下不能使用它。

对于这个例子:

# host example.FreeBSD.org

输出应该类似于以下内容:

example.FreeBSD.org has address 204.216.27.XX
example.FreeBSD.org mail is handled (pri=10) by nevdull.FreeBSD.org

所有发送到 example.FreeBSD.org 的邮件将会被收集在 nevdull 上,使用相同的用户名,而不是直接发送到您的主机。

上述信息由 DNS 服务器处理。携带邮件路由信息的 DNS 记录是邮件交换器记录( MX 记录)。如果不存在 MX 记录,则邮件将通过其 IP 地址直接传递给主机。

freefall.FreeBSD.org 的 MX 记录曾经是这样的:

freefall		MX	30	mail.crl.net
freefall		MX	40	agora.rdrop.com
freefall		MX	10	freefall.FreeBSD.org
freefall		MX	20	who.cdrom.com

freefall 有许多 MX 记录。最低的 MX 号码对应的主机直接接收邮件,如果可用的话。如果由于某种原因无法访问该主机,下一个较低编号的主机将暂时接收邮件,并在较低编号的主机可用时将其传递。

备用 MX 站点应该有独立的互联网连接,以便发挥最大的作用。您的互联网服务提供商可以提供这项服务。

31.7.2. 域名的邮件

在为网络配置邮件传输代理( MTA )时,任何发送到其域中的主机的邮件都应该被重定向到 MTA ,以便用户可以在主邮件服务器上接收到他们的邮件。

为了使生活更加方便,在 MTA 和带有 MUA 的系统上应该存在相同的用户名的用户账户。使用 adduser(8) 命令来创建用户账户。

除了将本地用户添加到主机上之外,还有一种称为虚拟用户的替代方法。像 Cyrus 和 Dovecot 这样的程序可以集成到 MTA 中,用于处理用户、邮件存储,并通过 POP3 和 IMAP 提供访问。

MTA 必须成为网络上每个工作站的指定邮件交换器。这是通过 DNS 配置中的 MX 记录来完成的:

example.FreeBSD.org	A	204.216.27.XX		; Workstation
			MX	10 nevdull.FreeBSD.org	; Mailhost

无论 A 记录指向何处,这将把工作站的邮件重定向到 MTA 。邮件将发送到 MX 主机。

这必须在 DNS 服务器上进行配置。如果网络没有运行自己的 DNS 服务器,请与 ISP 或 DNS 提供商联系。

以下是虚拟邮件托管的示例。

考虑一个域名为 customer1.org 的客户,所有发送给 customer1.org 的邮件都应该发送到 mail.myhost.com

DNS 条目应该如下所示:

customer1.org		MX	10	mail.myhost.com

为了仅处理 customer1.org 域名的电子邮件,不需要为其创建 A 记录。然而,如果没有为 customer1.org 创建 A 记录,则无法使用 ping 命令对其进行测试。

告诉 MTA 应该接受哪些域名和 / 或主机名的邮件。对于 Sendmail ,以下任一方式都可以使用:

  • 在使用 FEATURE(use_cw_file) 时,将主机添加到 /etc/mail/local-host-names 中。

  • /etc/sendmail.cf 文件中添加一行 Cwyour.host.com

31.7.3. 设置仅发送的配置

有许多情况下,人们可能只想通过中继发送邮件。一些例子包括:

  • 计算机是一台台式机,需要使用诸如 mail(1) 这样的程序,使用 ISP 的邮件中继。

  • 计算机是一个服务器,不处理本地邮件,但需要将所有邮件传递给中继进行处理。

虽然任何邮件传输代理( MTA )都能够满足这个特定需求,但是仅仅为了处理邮件转发而正确配置一个功能齐全的 MTA 可能会很困难。像 Sendmail 和 Postfix 这样的程序对于这种用途来说过于复杂。

此外,一个典型的互联网接入服务协议可能禁止用户运行“邮件服务器”。

满足这些需求的最简单方法是使用包含在 [configuring-dragonfly-mail-agent ,基本系统 ] 中的 dma(8) MTA 。对于版本低于 13.2 的系统,需要从 ports 进行安装。

除了 dma(8) 之外,还可以使用第三方软件来实现相同的功能,比如 mail/ssmtp

# cd /usr/ports/mail/ssmtp
# make install replace clean

安装完成后,可以使用 /usr/local/etc/ssmtp/ssmtp.conf 配置 mail/ssmtp

[email protected]
mailhub=mail.example.com
rewriteDomain=example.com
hostname=_HOSTNAME_

使用真实的电子邮件地址替换 root 。在 mail.example.com 的位置输入 ISP 的出站邮件中继。一些 ISP 称其为“出站邮件服务器”或“ SMTP 服务器”。

请确保禁用 Sendmail ,包括出站邮件服务。有关详细信息,请参阅 [mail-disable-sendmail]

包: mail/ssmtp[] 还有其他可用的选项。有关更多信息,请参阅 /usr/local/etc/ssmtp 中的示例或 ssmtp 的手册页。

以这种方式设置 ssmtp 允许计算机上需要发送邮件的任何软件正常运行,同时不违反 ISP 的使用政策,也不允许计算机被劫持用于发送垃圾邮件。

31.7.4. Sendmail 中的 SMTP 身份验证

在 MTA 上配置 SMTP 身份验证提供了许多好处。 SMTP 身份验证为 Sendmail 增加了一层安全性,并为切换主机的移动用户提供了在不需要每次重新配置邮件客户端设置的情况下使用相同 MTA 的能力。

从 Ports Collection 安装包: security/cyrus-sasl2[] 。该端口支持许多编译时选项。对于在此示例中演示的 SMTP 身份验证方法,请确保 LOGIN 未禁用。

安装完包 :security/cyrus-sasl2[] 后,编辑 /usr/local/lib/sasl2/Sendmail.conf ,如果该文件不存在则创建,并添加以下行:

pwcheck_method: saslauthd

接下来,安装包: security/cyrus-sasl2-saslauthd[] ,并执行以下命令:

# sysrc saslauthd_enable="YES"

最后,启动 saslauthd 守护进程:

# service saslauthd start

该守护进程用作 Sendmail 的代理,用于对 FreeBSD passwd(5) 数据库进行身份验证。这样可以避免为每个需要使用 SMTP 身份验证的用户创建新的用户名和密码,并保持登录和邮件密码相同。

接下来,编辑 [/etc/make.conf] 文件,并添加以下行:

SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL
SENDMAIL_LDADD=/usr/local/lib/libsasl2.so

这些行为 Sendmail 提供了在编译时链接到 cyrus-sasl2 的正确配置选项。在重新编译 Sendmail 之前,请确保已安装 cyrus-sasl2

通过执行以下命令重新编译 Sendmail :

# cd /usr/src/lib/libsmutil
# make cleandir && make obj && make
# cd /usr/src/lib/libsm
# make cleandir && make obj && make
# cd /usr/src/usr.sbin/sendmail
# make cleandir && make obj && make && make install

如果 /usr/src 没有发生大量更改,并且所需的共享库可用,那么这个编译过程不应该出现任何问题。

在重新编译和安装 Sendmail 之后,编辑 [/etc/mail/freebsd.mc] 或本地 [.mc] 文件。许多管理员选择使用 hostname(1) 的输出作为 [.mc] 文件的名称,以确保唯一性。

添加以下行:

dnl set SASL options
TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl
define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')dnl

这些选项配置了 Sendmail 用于对用户进行身份验证的不同方法。如果要使用除 pwcheck 之外的方法,请参考 Sendmail 文档。

最后,在 [/etc/mail] 目录下运行 make(1) 。这将运行新的 .mc 文件并创建一个名为 freebsd.cf 或者与本地 .mc 文件相同的名称的 .cf 文件。

然后,运行 make install restart 命令,它将会把文件复制到 sendmail.cf ,并且正确地重新启动 Sendmail 。

有关此过程的更多信息,请参考 [/etc/mail/Makefile](/etc/mail/Makefile) 。

要测试配置,请使用 MUA 发送一封测试邮件。如需进一步调查,请将 Sendmail 的 LogLevel 设置为 13 ,并观察 /var/log/maillog 中是否有任何错误。

有关更多信息,请参考 http://www.sendmail.org/ ~ ca/email/auth.html[SMTP 认证] 。


上次修改时间: September 18, 2024 by fiercex