第三十一章 电子邮件

第三十一章 电子邮件31.1. 简介31.2. 邮件组件31.3. DragonFly Mail Agent (DMA)31.3.1. 配置DragonFly邮件代理(DMA)31.3.1.1. 使用DMA通过Gmail路由发送邮件(STARTTLS:SMTP示例)31.3.1.2. 使用DMA通过Fastmail路由发送邮件(SSL/TLS示例)31.3.1.3. 使用DMA通过自定义邮件主机路由发送邮件31.4. Sendmail31.4.1. 配置文件31.5. 更改邮件传输代理31.5.1. 用其他MTA替换Sendmail31.5.2. 用其他MTA替换DragonFly邮件代理(DMA)31.6. 邮件用户代理31.6.1. 邮件31.6.2. Mutt31.6.3. alpine31.7. 高级主题31.7.1. 基本配置31.7.2. 域的邮件31.7.3. 设置为仅发送31.7.4. Sendmail中的SMTP身份验证

31.1. 简介

“Electronic Mail”,更为人所知的是email,是当今使用最广泛的通信形式之一。本章提供了在FreeBSD上运行邮件服务器的基本介绍,以及使用FreeBSD发送和接收电子邮件的介绍。有关此主题的完整介绍,请参阅【附录B:参考书目】中列出的书籍。

本章涵盖: • 发送和接收电子邮件涉及哪些软件组件。 • 如何配置DragonFly邮件代理。 • 基本Sendmail配置文件位于FreeBSD中。 • 远程邮箱和本地邮箱之间的区别。 • 如何安装和配置替换DragonFly邮件代理或Sendmail的备用邮件传输代理。 • 如何解决常见的邮件服务器问题。 • 如何将Sendmail配置为仅发送邮件。 • 如何在Sendmail中配置SMTP身份验证以增加安全性。 • 如何安装和使用邮件用户代理(如mutt)发送和接收电子邮件。 • 如何从远程POP或IMAP服务器下载邮件。 • 如何对收到的电子邮件自动应用过滤器和规则。

31.2. 邮件组件

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

31.3. DragonFly Mail Agent (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服务器发送邮件。

可以在 /etc/dma/auth.conf 中用一行设置身份验证:

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

31.3.1.2. 使用DMA通过Fastmail路由发送邮件(SSL/TLS示例)

此示例 /etc/dma/dma.conf 可用于使用Fastmail的SMTP服务器发送邮件。

可以在 /etc/dma/auth.conf 中用一行设置身份验证:

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

31.3.1.3. 使用DMA通过自定义邮件主机路由发送邮件

此示例 /etc/dma/dma.conf 可用于使用自定义邮件主机发送邮件。

可以在 /etc/dma/auth.conf 中用一行设置身份验证:

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

31.4. Sendmail

Sendmail是一种历史悠久且功能多样的邮件传输代理(MTA),在UNIX®和类UNIX系统中有着悠久的历史。在FreeBSD 13之前,它一直是FreeBSD基础系统的一部分,提供强大的电子邮件传输功能、广泛的定制选项,并支持复杂的路由和过滤。

31.4.1. 配置文件

Sendmail的配置文件位于 /etc/mail/ 中。

31.5. 更改邮件传输代理

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

31.5.1. 用其他MTA替换Sendmail

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

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

然后停止 sendmail(8) 服务:

需要一些额外的配置,因为 sendmail(8) 无处不在,以至于一些软件认为它已经安装并配置好了。检查 /etc/periodic.conf 并确保这些值设置为 NO 。如果此文件不存在,请使用以下条目创建它:

下一步是安装另一个MTA,本例中将使用 dma(8) 。如上所述,dma(8) 是FreeBSD 14.0版本开始的默认MTA。因此,在使用早期版本时,只需要从端口安装它。

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

按照配置DragonFly邮件代理(DMA)中的指示执行配置。

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

要确保在启动时或关闭之前清空队列中的任何内容,请执行以下命令:

配置完所有内容后,建议重新启动系统。重新启动提供了一个机会,可以确保系统正确配置为在启动时自动启动新的MTA。

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

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

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

然后安装 mail/postfix

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

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

使用SASL时,确保postfix有权读取sasldb文件。这是通过向组邮件添加后缀并使 /usr/local/etc/sasldb* 文件可由组邮件读取来实现的(这应该是新安装的默认设置)。

配置完所有内容后,建议重新启动系统。重新启动提供了一个机会,可以确保系统正确配置为在启动时自动启动新的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服务器的交互,但可以使用 fetchmailgetmail 等应用程序将这些邮箱下载到本地mbox。

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

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

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

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

此示例读取第一封电子邮件:

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

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

如果电子邮件需要回复,请按 Rr mail(1) 键。R 指示 mail(1) 仅回复电子邮件的发件人,而 r 回复邮件的所有其他收件人。这些命令可以用要回复的邮件的邮件号作为后缀。键入响应后,邮件的末尾应在其自己的行上用一个 . 标记。

下面可以看到一个例子:

要发送新电子邮件,请按 m ,然后按收件人电子邮件地址。可以通过用 , 分隔符分隔每个地址来指定多个收件人。然后可以输入消息的主题,然后输入消息内容。消息的结尾应该通过在自己的行上放置一个 . 来指定。

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

31.6.2. Mutt

Mutt是一款功能强大的MUA,具有许多功能,包括: • 传递消息的能力。 • PGP支持电子邮件的数字签名和加密。 • MIME支持。 • Maildir支持。 • 高度可定制。

参见 http://www.mutt.org 了解更多关于Mutt的信息。

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

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

31.6.2-1

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

31.6.2-2

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

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

31.6.2-3

Mutt包含广泛的帮助,可以通过按 ? 从大多数菜单中访问。顶行还显示了适当的键盘快捷键。

31.6.3. alpine

alpine面向初学者,但也包含一些高级功能。

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

alpine第一次运行时,它会显示一个带有简短介绍的问候页面,以及alpine开发团队发送匿名电子邮件的请求,让他们判断有多少用户在使用他们的客户端。要发送此匿名消息,请按 Enter 键。或者,按 E 退出问候语,不发送匿名消息。问候页面示例如下:

31.6.3-1

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

alpine打开的默认目录是收件箱。要查看信息索引,请按I,或选择下面显示的信息索引选项:

31.6.3-2

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

31.6.3-3

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

31.6.3-4

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

31.6.3-5

alpine可以使用主菜单中的 SETUP 选项进行自定义。

31.7. 高级主题

本节涵盖了更多涉及的主题,如邮件配置和为整个域设置邮件。

31.7.1. 基本配置

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

• 为域运行DNS服务器。 • 将邮件直接传递到计算机的FQDN。

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

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

上述任何一种方式都可以直接在主机上接收邮件。

键入以下:

在此示例中,邮件直接发送到 yourlogin@example.FreeBSD.org 假设功能齐全的MTA在 example.FreeBSD.org 上正常运行,应该可以正常工作。请注意, dma(8) 不监听端口25上的传入连接,因此不能在这种情况下使用。

例如:

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

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

freefall.FreeBSD.org 的MX条目曾经看起来像这样:

freefall 有很多MX条目。最低的MX号码是直接接收邮件的主机(如果可用)。如果由于某种原因无法访问,下一个编号较低的主机将临时接受消息,并在编号较低主机可用时传递消息。

备用MX站点应具有单独的Internet连接,以便最有用。ISP可以提供这项服务。

31.7.2. 域的邮件

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

为了使生活更轻松,MTA和带有MUA的系统上都应该存在具有相同用户名的用户帐户。使用 adduser(8) 创建用户帐户。

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

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

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

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

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

DNS条目应如下所示:

customer1.org 不需要A记录,只处理该域的电子邮件。但是,除非存在A记录,否则对 customer1.org 运行 ping 将不起作用。

告诉MTA它应该接受哪些域和/或主机名的邮件。以下任何一种方法都适用于Sendmail:

• 使用 FEATURE(use_cw_file) 时,将主机添加到/etc/mail/本地主机名中。 • 在 /etc/sendmail.cf 中添加 Cwyour.host.com 行。

31.7.3. 设置为仅发送

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

• 计算机是一台台式机,需要使用ISP的邮件中继使用 mail(1) 等程序。 • 计算机是一台不在本地处理邮件的服务器,但需要将所有邮件传递给中继进行处理。

虽然任何MTA都能够填补这一特定的利基市场,但很难正确配置一个功能齐全的MTA来处理卸载邮件。Sendmail和Postfix等程序在这种用途上显得有些多余。

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

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

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

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

使用 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的能力,而无需每次重新配置其邮件客户端的设置。

从端口集合中安装 security/cyrus-sasl2 。此端口支持许多编译时选项。对于本示例中演示的SMTP身份验证方法,请确保未禁用 LOGIN

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

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

最后,启动saslauwd守护进程:

此守护进程充当Sendmail的代理,以对FreeBSD passwd(5) 数据库进行身份验证。这省去了为需要使用SMTP身份验证的每个用户创建一组新的用户名和密码的麻烦,并保持登录和邮件密码不变。

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

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

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

如果 /usr/src 没有发生很大变化,并且所需的共享库可用,则此编译应该不会有任何问题。

编译并重新安装Sendmail后,编辑 /etc/mail/fibebsd.mc 或本地 .mc 。许多管理员选择使用 hostname(1) 的输出作为 .mc 的名称以保持唯一性。

添加以下行:

这些选项配置了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身份验证