第 31 章。电子邮件

31.1. 概述

"电子邮箱",更常被称为电子邮件,是当今使用最广泛的通信方式之一。本章将对在 FreeBSD 上运行邮件服务器以及使用 FreeBSD 发送和接收电子邮件进行基本介绍。有关本主题的完整内容,请参考参考文献中列出的书籍。

本章内容包括

  • 哪些软件组件参与发送和接收电子邮件。

  • 如何配置 DragonFly 邮件代理。

  • FreeBSD 中 Sendmail 基本配置文件的位置。

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

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

  • 如何排查常见的邮件服务器问题。

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

  • 如何配置 Sendmail 的 SMTP 身份验证以提高安全性。

  • 如何安装和使用邮件用户代理(例如 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 邮件代理 (dma(8));在早期版本中,它是 sendmail(8)。其他 MTA(包括 Exim、Postfix 和 qmail)可以安装以替换默认的 MTA。

邮件主机和邮箱

邮件主机是负责为主机或网络传递和接收邮件的服务器。邮件主机收集发送到该域的所有邮件,并将其存储在默认的 mbox 或替代的 Maildir 格式中,具体取决于配置。邮件存储后,可以本地使用 MUA 读取,也可以使用 POP 或 IMAP 等协议远程访问和收集。如果本地读取邮件,则无需安装 POP 或 IMAP 服务器。

域名系统 (DNS)

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

31.3. DragonFly 邮件代理 (DMA)

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

dma(8) 并非旨在替代真正的大型 MTA,例如 sendmail(8)postfix(1)。因此,dma(8) 不会在端口 25 上监听传入连接。

31.3.1. 配置 DragonFly 邮件代理 (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

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 示例配置中提供了有关对 IPv4 和 IPv6 地址使用这些选项的示例,/etc/mail/access.sample

要配置访问数据库,请使用示例中显示的格式在 /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 邮箱,然后在 /etc/mail/aliases 数据库中查找。如果没有找到匹配项,则将邮件传递给 localuser。第二个条目显示了一个邮件列表。发送到 ftp-bugs 的邮件将扩展到三个本地邮箱 joeericpaul。可以将远程邮箱指定为 [email protected]。第三个条目显示了如何将邮件写入文件,在本例中为 /dev/null。最后一个条目演示了如何通过 UNIX® 管道将邮件发送到程序 /usr/local/bin/procmail。有关此文件格式的更多信息,请参见 aliases(5)

只要更新了此文件,就运行 newaliases 来更新并初始化别名数据库。

/etc/mail/sendmail.cf

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

Sendmail 的主配置文件可以从 m4(1) 宏构建,这些宏定义了 Sendmail 的功能和行为。有关详细信息,请参见 /usr/src/contrib/sendmail/cf/README

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

/etc/mail/virtusertable

此数据库文件将虚拟域和用户的邮件地址映射到实际的邮箱。这些邮箱可以是本地的、远程的、在 /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。

现在,通过系统发送的任何邮件,只要用户在系统上拥有帐户,该邮件将成功发送。这允许用户从系统远程发送邮件,而无需将系统开放给互联网上的SPAM中继。

31.5. 更改邮件传输代理

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

如果默认的传出邮件服务被禁用,则必须用替代的邮件传递系统替换它。否则,诸如periodic(8)之类的系统功能将无法通过电子邮件传递其结果。系统的许多部分都期望一个功能完备的MTA。如果应用程序在禁用默认二进制文件后继续使用它们来尝试发送电子邮件,邮件可能会进入非活动队列,并且永远不会被传递。

31.5.1. 用其他MTA替换Sendmail

为了完全禁用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)非常普遍,以至于一些软件假设它已经安装并配置好了。检查/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)。如上所述,从FreeBSD 14.0版本开始,dma(8)是默认的MTA。因此,只有在使用先前版本时才需要从端口安装它。

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

# pkg install dma

按照配置DragonFly邮件代理(DMA)中的说明进行配置。

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

# 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邮件代理(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"

在安装应用程序后阅读安装消息是一个好习惯。提供有关设置等的有用信息。

如果postfix在/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添加到邮件组并将/usr/local/etc/sasldb*文件(这些文件应该是新安装的默认文件)设为邮件组可读来实现这一点。

一切配置完成后,建议重新启动系统。重新启动提供了确保系统配置正确以在启动时自动启动新的MTA的机会。

31.6. 邮件用户代理

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

31.6.1. mail

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

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

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

% mail

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

邮件会自动编号,如下面的示例所示

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 mail(1)键。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)不是为了处理附件而设计的,因此它对附件的处理很差。较新的MUA以更智能的方式处理附件。

31.6.2. Mutt

Mutt是一个功能强大的MUA,具有许多功能,包括

  • 能够将邮件串起来。

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

  • MIME支持。

  • Maildir支持。

  • 高度可定制。

有关Mutt的更多信息,请参阅http://www.mutt.org

值得一提的是名为NeoMutt的Mutt分支,它带来了更多功能。在NeoMutt网站上了解详情。如果选择了NeoMutt,请将以下命令示例中的mutt替换为neomutt

可以使用mail/mutt端口安装Mutt。安装端口后,可以通过发出以下命令启动Mutt

% mutt

Mutt会自动读取并显示/var/mail中用户邮箱的内容。如果找不到邮件,Mutt将等待用户的命令。以下示例显示Mutt显示邮件列表

Mutt email client showing a list of messages

要阅读电子邮件,请使用光标键选择它并按Enter。以下示例显示Mutt显示电子邮件

Mutt email client displaying an email

mail(1)类似,Mutt可以用于仅回复邮件的发送者以及所有收件人。要仅回复电子邮件的发送者,请按r。要向原始发送者以及所有邮件收件人发送群组回复,请按g

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

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

Mutt email client showing the summary screen

Mutt 包含广泛的帮助信息,可以在大多数菜单中按 ? 键访问。顶部行也会在适当的时候显示键盘快捷键。

31.6.3. alpine

alpine 针对初学者用户设计,但也包含一些高级功能。

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

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

% alpine

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

alpine email client showing the greeting page

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

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

alpine email client showing the default directory

邮件索引显示当前目录中的邮件,可以使用光标键进行导航。可以通过按 Enter 键来阅读突出显示的邮件。

alpine email client showing the message index

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

alpine email client showing an email

在 alpine 中回复电子邮件是使用 pico 编辑器完成的,该编辑器默认情况下与 alpine 一起安装。pico 使得导航邮件变得容易,对于新手用户来说,它比 vi(1)mail(1) 更容易使用。完成回复后,可以通过按 Ctrl+X 键发送邮件。alpine 将在发送邮件之前要求确认。

alpine email client showing the message compose window

可以使用主菜单中的 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

在此示例中,直接发送到 [email protected] 的邮件应能正常工作,前提是在 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 将临时接受消息,并在编号更低的 MX 可用时转发消息。

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

31.7.2. 域邮件

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

为了简化操作,MTA 和具有 MUA 的系统上应该存在具有相同用户名的用户帐户。使用 adduser(8) 创建用户帐户。

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

MTA 必须是网络中每个工作站的指定邮件交换器。这在 DNS 配置中使用 MX 记录完成

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

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

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

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

假设一个客户拥有域 customer1.org,所有 customer1.org 的邮件都应发送到 mail.myhost.com

DNS 条目应如下所示

customer1.org		MX	10	mail.myhost.com

为了只处理该域的电子邮件,customer1.org 不需要 A 记录。但是,除非存在 customer1.orgA 记录,否则运行 ping 来 ping customer1.org 将不会成功。

告诉 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 这样的程序对于此用途来说过于复杂。

此外,典型的互联网访问服务协议可能会禁止您运行“邮件服务器”。

满足这些需求的最简单方法是使用 dma(8) MTA,该 MTA 包含在 基本系统 中。对于 13.2 之前的系统,需要从端口安装。

除了 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 的真实电子邮件地址。将 ISP 的传出邮件中继输入 mail.example.com 的位置。一些 ISP 将其称为“传出邮件服务器”或“SMTP 服务器”。

确保禁用 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

要测试配置,请使用 MUA 发送测试消息。要进行进一步调查,请将 Sendmail 的 LogLevel 设置为 13 并查看 /var/log/maillog 中是否存在任何错误。

有关更多信息,请参考 SMTP 身份验证


最后修改时间: 2024 年 9 月 23 日,作者 Fernando Apesteguía