FreeBSD 中的 Sendmail 使用外部 SMTP 发送,无需身份验证

FreeBSD 中的 Sendmail 使用外部 SMTP 发送,无需身份验证

如果这听起来可能让您感到困惑,我很抱歉。

我弟弟让我帮他搭建一个网络服务器,因为他想自己托管自己的网站,不再使用托管服务。问题出在 ISP。除了动态 IP 方案外,他们还阻止端口 25 上的传出 TCP 连接,而是提供不需要身份验证的外部服务器。

对于 Web 服务器设置,我选择了 FreeBSD,因为我更喜欢 jails 而不是虚拟机或直接在主机上运行服务。它使备份和安全管理变得容易得多(至少对我来说)。

目前我已经完全禁用了 sendmail,但我希望再次启用它,以便用户可以在必要时使用恢复密码功能。我的问题是,如何配置 sendmail 以使用外部 SMTP 而无需用户或密码验证?

预先感谢您的帮助!

答案1

您的帖子中的两条评论都是正确的。以下是更全面的回复。

(TL;DR 见底部)

以 root 身份开始对您的目录进行安全复制/etc/mail

# cd /etc
# cp -Rp mail mail.safety

为了便于说明,我假设您没有对电子邮件配置进行任何自定义,事实上,我们将首先“清零”您现有的 sendmail 文件,以确保我们从头开始。如果您确实进行了自定义,不用担心,我们首先备份了这些文件。您可以稍后重新应用您的自定义。

首先进入mail目录并删除现有*.cf文件:

# cd mail
# rm *.cf

在 FreeBSD 系统中,除了随操作系统分发的库存和文件外,还通常有一个$(hostname).mc文件和一个 文件。以下是具有简单主机名的系统上的输出:$(hostname).submit.mcfreebsd.mcfreebsd.submit.mclstest

# ls *.mc
freebsd.mc         freebsd.submit.mc     test.mc         test.submit.mc

您可能会看到类似的文件,但引用的是您自己的机器的主机名。其背后的原因是这些freebsd*.mc文件代表了 sendmail 配置的基本起点。这些$(hostname)*.mc文件(可能)是特定于您的系统的自定义文件。虽然操作系统升级可能会覆盖这些freebsd*.mc文件,但它不会触及您的主机特定文件,因此您精心定制的配置不会被操作系统升级覆盖。您需要做的就是将更改限制在文件上$(hostname)*.mc,而不要freebsd*.mc触及参考文件。

在本教程的其余部分中,我将使用字符串test来表示您应该将机器的主机名作为文件名的一部分看到的位置。

了解了这些背景知识后,我们继续吧。

删除您的$(hostname)*.mc文件,以便Makefile从已知良好的freebsd*.mc文件中克隆您的配置。

# rm -v $(hostname)*.mc
test.mc
test.submit.mc

现在我们已经删除了旧的配置文件,让我们根据操作系统提供的文件来make创建新的配置文件:freebsd.mcfreebsd.submit.mc

# make
cp -f freebsd.mc test.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 test.mc > test.cf
cp -f freebsd.submit.mc test.submit.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 test.submit.mc > test.submit.cf

这实际上比我们需要的要多一点,但没关系。重要的是复制Makefilefreebsd.mc$(hostname).mc复制 freebsd.submit.mc$(hostname).submit.mc

现在,让我们检查一下该$(hostname).mc文件。在第 89 行或附近(我正在查看的 FreeBSD 12 的文件)是SMART_HOST前面的作者提到的指令:

# grep SMART_HOST $(hostname).mc
dnl define(`SMART_HOST', `your.isp.mail.server')

行首的“dnl”表示该行已被注释掉。DNL 可以理解为“丢弃(或忽略)直到换行符”。

编辑您的.mc文件:

# vi $(hostname).mc

并将该行改为:

define(`SMART_HOST', `smtp.example.com')

您的 ISP 告诉您使用的服务器的 DNS 名称在哪里smtp.example.com。请确保也删除“dnl”。保存文件并退出。

现在运行make重新生成 $(hostname)*.cf 文件:

# make
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 test.mc > test.cf
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 test.submit.mc > test.submit.cf

运行make install以将文件复制$(hostname)*.cf到 sendmail 期望的标准名称(sendmail.cfsubmit.cf):

# make install
install -m 444 test.cf /etc/mail/sendmail.cf
install -m 444 test.submit.cf /etc/mail/submit.cf

重新启动sendmail:

# make restart

最后检查/var/log/maillog确保没有错误。


总结

# cd /etc
# cp -Rp mail mail.safety
# cd mail
# rm *.cf
# rm -v $(hostname)*.mc
# make
# vi $(hostname).mc

将该行改为SMART_HOST

define(`SMART_HOST', `smtp.example.com')

并继续:

# make
# make install
# make restart

相关内容