技巧与诀窍 / - 创建本地 Mutt 邮件服务器
如果您还没有注意到,我在本专栏中多次提到 mutt。对我来说,在这个大型图形邮件程序和基于 Web 的邮件应用程序盛行的时代,您仍然无法超越 mutt 的速度、强大功能和自定义性。 还有 vi 风格的快捷键——我非常喜欢。
然而,您第一次使用 mutt 时可能会注意到一件事,它严格来说是一个 MUA(邮件用户代理),而不是一个 MTA(邮件传输代理)。 这意味着 mutt 只专注于充当电子邮件客户端,实际上不包含任何与远程邮件服务器通信的代码。 这项工作由 MTA 完成。 虽然许多邮件客户端也包含代码,以便它们可以通过 MTA 转发邮件,但 mutt 选择使用系统自己的本地邮件服务器。 传统上,这在 Linux 上一直不是问题,因为大多数 Linux 服务器都安装并设置了一些邮件服务器。 然而,如今,您的桌面安装上可能没有完全配置的邮件服务器。 不过没关系,因为在本专栏中,您将看到借助 Postfix 设置您自己的本地邮件服务器是多么简单。
即使您不使用 mutt,拥有自己的本地邮件服务器也有很多优势,即使只是为了为您转发邮件。 首先,它可以处理您所有电子邮件的假脱机,并且如果由于某种原因或其他原因(例如,如果您的无线连接断开或您关闭笔记本电脑)导致传递失败,它将自动重试传递,而无需保持您的邮件程序打开。 其次,一旦您按照您想要的方式设置好邮件服务器,您计算机上的任何其他邮件客户端都可以利用它:只需将您的客户端指向 localhost 即可。
如今,Linux 上有许多不同的邮件服务器可用,每个服务器都有其自身的优点和缺点。 关于 Sendmail 与 Postfix 与 Exim 与使用 Telnet 直接连接到邮件服务器上的端口 25 并键入原始 SMTP 命令的圣战已经进行了很多次。 多年来,我尝试了所有这些(是的,甚至是 Telnet),对我而言,Postfix 在稳定性能、安全性和最重要的简单配置文件之间取得了最佳平衡。 因此,在本专栏中,我将讨论设置 Postfix 作为邮件中继的具体步骤。
第一步是安装 Postfix 服务器本身。 在大多数发行版上,您会发现此软件包分为一个主要的 Postfix 软件包和一些提供特定功能的额外软件包,例如 MySQL 或 LDAP 集成。 因为我们在这里只是设置一个基本的邮件中继,所以我们真正需要的只是主要的 Postfix 软件包。 现在,如果您在基于 Debian 的系统上安装此软件包,后安装脚本(充当向导)将提示您设置 Postfix。 如果您愿意,您可以简单地完成向导,然后选择“Internet 站点”以将电子邮件直接发送到 Internet 的其余部分,或者选择“使用智能主机的 Internet”以首先通过第二个邮件服务器(可能由您的 ISP 提供)中继您的所有邮件。 无论哪种方式,您都会被问到几个简单的问题,最后,您将获得一个基本的 Postfix 配置,可以随时使用。
在其他系统上(或者如果您在基于 Debian 的系统上选择“无配置”),您最终可能会在 /etc/postfix/main.cf 中得到一个空的或注释非常多的 Postfix 配置文件。 您会发现,对于基本的邮件服务器,您实际上只需要在配置中添加几行代码。 Postfix 选择非常合理和安全的默认值,因此如果您希望它代表您传递邮件,您只需要几行代码
mynetworks = 127.0.0.0/8 inet_interfaces = loopback-only
是的,基本上就是这样。 现在,只需使用以下命令重启 Postfix/etc/init.d/postfix restart,您的邮件服务器将启动并运行。 借助 Postfix 中合理的默认设置,您只需硬编码这两个设置即可确保 Postfix 仅接受来自 localhost 的邮件。 inet_interfaces 行告诉 Postfix 仅侦听 localhost 地址的电子邮件,这样外部客户端就无法连接到您的服务器。 mynetworks 行增加了安全性,并告诉 Postfix 仅允许来自 localhost 的邮件通过服务器中继。
过去,上述所有内容就是您在 Internet 上运行邮件服务器所需的全部内容。 然而,随着垃圾邮件措施和对策的兴起,如今,越来越少的 ISP 愿意允许来自客户端的端口 25 流量传输到外部世界。 即使他们这样做,Internet 上的许多邮件服务器也不会接受来自 ISP 网络内部主机的流量。 如果您发现自己处于这样的网络中,您可能需要在您的 main.cf 中添加一个中继主机。 中继主机通常是由您的 ISP 提供的邮件服务器,您的邮件服务器可以通过它发送电子邮件。 例如,如果您要设置像 Thunderbird 这样的客户端,这将是您为其配置的 SMTP 服务器。
要在 Postfix 中设置通用中继主机,只需添加
relayhost = mail.somedomain.net
到您的 /etc/postfix/main.cf。 替换mail.somedomain.net为您的 ISP 中继主机的主机名。 修改文件后,只需键入postfix reload作为 root 用户以启用新设置。
当然,有些邮件服务器不会让网络上的任何人通过它们进行中继(这样做是正确的)。 在这种情况下,他们通常要求每个人首先通过身份验证。 这需要 Postfix 执行一些额外的步骤,但是与所有其他操作一样,这仍然不是很困难。 首先,将以下行添加到 /etc/postfix/main.cf
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous
这告诉 postfix 启用 SMTP 身份验证,并告诉它在 /etc/postfix/sasl_passwd 中查找用于主机的登录名和密码。 下一步是创建 /etc/postfix/sasl_passwd 文件。 如果我想使用用户名 kyle 和密码 muttrules 登录到 mail.somedomain.net,我会在文件中放入以下行
mail.somedomain.net kyle:muttrules
这样做有一个缺点,即帐户密码现在以明文形式存在。 这不太理想,但您至少可以确保只有 root 用户可以读取该文件。 以 root 用户身份,键入
# chown root:root /etc/postfix/sasl_password # chmod 600 /etc/postfix/sasl_passwd
Postfix 实际上并不直接读取此文件; 而是读取从此文件创建的哈希数据库。 要创建文件,请运行
# postmap /etc/postfix/sasl_passwd
您将看到已创建了一个新文件 /etc/postfix/sasl_passwd.db。 每当您修改 /etc/postfix/sasl_passwd 文件时,都需要运行 postmap 命令。 现在,最后一次重新加载 Postfix,mutt 应该能够通过您的本地主机中继邮件。 如果您想在不使用 mutt 的情况下执行快速测试,您可以键入
echo test | mail -s "test" user@remotehost
它将向您指定的用户发送一封主题和正文为“test”的电子邮件。
Postfix 的日志文件可能会因您的系统而略有不同,但您应该能够在 /var/log/mail.log 或 /var/log/maillog 中找到它。 如果您发现某些邮件未送达,这是您应该查看的第一个地方。 第二个要查看的地方是 mailq 命令。 该命令将为您提供当前在本地假脱机中的所有电子邮件及其状态的快速状态。 如果您的所有邮件都已成功传递到其他主机,则输出将如下所示
$ mailq Mail queue is empty
确实就是这么简单。 当然,当您想做的不只是中继您的个人电子邮件时,邮件服务器管理肯定会变得比这更复杂。 但是,很高兴知道像上面这样的简单配置是可能的。 如果您像我一样,节省 Postfix 配置的时间只会让您有更多时间来调整您的 mutt 配置。
Kyle Rankin 是旧金山湾区的系统架构师,并且是多本书籍的作者,包括 The Official Ubuntu Server Book、Knoppix Hacks 和 Ubuntu Hacks。 他目前是 North Bay Linux Users' Group 的总裁。