如何在FreeBSD10.1上使用Sendmail通过外部SMTP服务发送电子邮件
介绍
设置新 Web 服务器时最常见的需求之一是发送电子邮件。 最安全和最简单的方法是将您的服务器连接到邮件服务,例如 SendGrid 或 Amazon SES。 使用外部服务将帮助您避免诸如您的服务器 IP 被反垃圾邮件服务列入黑名单的陷阱。
在本教程中,我们将讨论如何将 FreeBSD 的内置 Sendmail 服务连接到 SendGrid 以从您的服务器发送电子邮件。 您还可以轻松地为不同的外部邮件服务调整设置。
如果您是 FreeBSD 的新手,我们所做的一些事情可能看起来有点吓人,但您很快就会习惯卷起袖子重新编译一些像 FreeBSD 专业人士这样的系统工具。
目标
在本教程中,我们将:
- 使用 SASL 支持重新编译 Sendmail,以便服务器可以使用外部服务进行身份验证
- 使用适当的设置配置 Sendmail 邮件服务器
- 测试出站电子邮件以确保邮件从您的服务器发出
先决条件
在开始本指南之前,您需要以下内容:
- FreeBSD 10.1 Droplet
- 按照此 tutorial 访问您的 root 帐户或具有 sudo 权限的帐户
- 如何从命令行编辑文本文件的工作知识
- 您应该安装您喜欢的文本编辑器,例如
nano
或vim
- 用于测试目的的免费 SendGrid 帐户,或为您提供服务 SMTP 详细信息的其他邮件提供商。 您将需要外部邮件提供商的这些详细信息:
- 您的服务器的主机名,您可以通过运行
hostname
找到它
本教程最容易遵循 root:
sudo su
第 1 步 — 设置包管理
首先,我们需要重新编译 Sendmail,以便它可以通过外部邮件服务(在本例中为 SendGrid)进行身份验证。
所有步骤都包含在此处,但如果您愿意,可以按照 官方 FreeBSD 手册 进行操作。
有些软件会从 FreeBSD 的 Ports Collection 编译,所以我们需要首先确保它是最新的。
portsnap fetch && portsnap update
Portmaster 实用程序可以让我们轻松地从 Ports 树编译软件,所以让我们安装它。
pkg install portmaster
运行以下命令以确保系统知道以 FreeBSD 的最新包格式安装新编译的包。
echo 'WITH_PKGNG=yes' >> /etc/make.conf
第 2 步 — 安装和配置 SASL 包
使用我们新安装的 Portmaster 实用程序,使用以下命令编译并安装 cyrus-sasl2
包。 这用于通过外部邮件服务进行身份验证。
portmaster security/cyrus-sasl2
出现提示时,确保选中 LOGIN,这应该是默认设置。 选择 OK 并按 ENTER
两次以选择所有默认值。 出现提示时,回答 y
以升级和安装您的软件包。 您应该期待大量的输出,以:
Output===>>> Done displaying pkg-message files ===>>> The following actions were performed: Upgrade of pkg-1.4.12 to pkg-1.5.0 Upgrade of perl5-5.18.4_11 to perl5-5.18.4_13 Installation of security/cyrus-sasl2 (cyrus-sasl-2.1.26_9)
编辑文件(如果它不存在则创建它)/usr/local/lib/sasl2/Sendmail.conf
并添加以下内容:
vim /usr/local/lib/sasl2/Sendmail.conf
/usr/local/lib/sasl2/Sendmail.conf
pwcheck_method: saslauthd
接下来,安装 saslauthd
服务进行 SASL 认证。 出现提示时,接受默认值并选择 OK。
portmaster security/cyrus-sasl2-saslauthd
编辑系统配置文件/etc/rc.conf
,在文件末尾添加如下配置参数。 将 your_hostname
替换为您的服务器的主机名。
vim /etc/rc.conf
/etc/rc.conf
hostname = "your_hostname" sendmail_enable="YES" saslauthd_enable="YES"
现在启动 saslauthd
服务。
service saslauthd start
你应该看到这个输出:
Outputusage: hostname [-fs] [name-of-host] usage: hostname [-fs] [name-of-host] Starting saslauthd.
编辑 /etc/make.conf
文件,添加以下参数,以便系统知道要使用哪些 SASL Sendmail 选项。
vim /etc/make.conf
/etc/make.conf
SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
第 3 步 — 使用 SASL 支持重新编译 Sendmail
在本节中,我们将重新编译 Sendmail 以使用 SASL 身份验证。
现在我们需要同步 FreeBSD 10.1 的最新源代码。
首先,我们将安装 Subversion,以便我们可以轻松获得所需的源代码。
pkg install subversion
现在我们可以直接从 FreeBSD 项目网站查看用于重新编译的最新代码,以更新 /usr/src
中的源代码。
svn co http://svn.freebsd.org/base/releng/10.1/ /usr/src
您需要连续运行的下一个命令,一次一组。 我们在这里所做的是告诉系统使用我们新的安全和登录要求重新编译(或重建)内置的 Sendmail 包,然后重新安装 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
第 4 步 — 配置 Sendmail
你已经做到了这一步,我们已经完成了重新编译。 我们继续吧!
对于下一步,我们将介绍一个基本的 Sendmail 配置,该配置将告诉 Sendmail 通过我们选择的外部智能托管服务路由所有出站邮件。
首先,我们要确保安全并创建 /etc/mail
目录的备份。
cp -a /etc/mail /etc/mail.bak
进入邮件配置目录。
cd /etc/mail
运行以下命令以生成基本邮件配置。
make
创建并编辑 relay-domains
文件,添加以下参数。 将 your_server.example.com
替换为您的 FQDN,将 example.com
替换为您的域名。
vim /etc/mail/relay-domains
/etc/mail/relay-domains
your_server.example.com example.com
创建并编辑 local-host-names
文件,添加以下参数。 用您的本地主机名替换变量。
vim /etc/mail/local-host-names
/etc/mail/本地主机名
your_server your_server.example.com
创建并编辑 access
文件,添加以下参数。 (请注意,如果您使用的是 SendGrid 以外的提供程序,则需要更改 smtp.sendgrid.net
地址。)
vim /etc/mail/access
/etc/邮件/访问
smtp.sendgrid.net OK GreetPause:localhost 0
创建并编辑 authinfo
文件,添加以下参数。 将 smtp_username
和 smtp_password
替换为您的 SendGrid 帐户名和密码。 如果您选择使用不同的外部邮件提供商,您还需要将两行中的 smtp.sendgrid.net
值更改为您的提供商的服务器地址。
vim /etc/mail/authinfo
/etc/mail/authinfo
AuthInfo:smtp.sendgrid.net "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN" AuthInfo:smtp.sendgrid.net:587 "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN"
access
和 authinfo
文件实际上是简单的数据库,Sendmail 从中读取配置参数。 这可能听起来令人困惑,特别是如果您是 FreeBSD 和 Sendmail 的新手,但您只需要从 /etc/mail/
运行这两个简单的命令来生成数据库。
makemap hash access < access makemap hash authinfo < authinfo
现在我们将编辑我们生成的一些命令的基本配置。 编辑 your_server.mc
文件。 (如果您不确定文件名,可以 ls
/etc/mail/
目录。)
vim /etc/mail/your_server.example.com.mc
在 dnl define(
SMART_HOST'、your.isp.mail.server')
块和 dnl Uncomment the first line to change the location of the default
块之间插入以下配置行,如下所示。
如果您不使用示例中的 SendGrid 帐户,则需要将 smtp.sendgrid.net
地址更改为您的提供商的服务器地址。 您还需要将 example.com
的两个实例更新为您希望邮件从 变为 的域。 (请注意,您可能需要设置适当的 TXT、DKIM、PTR 等。 记录以避免欺骗报告。)
/etc/mail/<^>your_server.example.com<^>.mc
dnl define(`SMART_HOST', `your.isp.mail.server') dnl SET OUTBOUND DOMAIN MASQUERADE_AS(`example.com') MASQUERADE_DOMAIN(example.com) FEATURE(masquerade_envelope) FEATURE(masquerade_entire_domain) dnl SMART HOST CONFIG define(`SMART_HOST', `smtp.sendgrid.net')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl FEATURE(`authinfo',`hash /etc/mail/authinfo.db')dnl TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl Uncomment the first line to change the location of the default
在我们应用更改之前,让我们来看看上面的配置。 第一个块是告诉 Sendmail 我们要确保我们的出站邮件似乎来自我们的域 example.com
。
第二个块是定义我们想要智能主机我们的邮件到哪里,包括我们在上一步中设置的端口、身份验证方法和我们的身份验证信息。 请注意,我们正在引用 /etc/mail/authinfo.db
文件。
现在让我们应用我们所做的更改。 确保您仍在 /etc/mail/
目录中。 确保 Sendmail 已启动:
service sendmail start
更新我们的配置:
make make install restart
重新启动发送邮件:
service sendmail restart
我们的 Sendmail 配置完成。 下一步是发送测试电子邮件。
第 5 步 — 发送测试电子邮件
现在我们已经完成了正确设置的所有步骤,让我们确保一切正常。
使用 mailx
命令将测试消息发送到您每天使用的真实电子邮件帐户。
mailx your_real_email_address@example.com
出现提示时,输入 test
或任何您想要的主题,然后按 ENTER
。
Subject: test
然后,您将看到一个光标和编写测试电子邮件正文的能力。 只需再次写入单个单词 test
并再次按 ENTER
。
test
你需要告诉 mailx
你写完你的信息了; 为此,我们必须以单个 .
结束消息,然后最后一次按 ENTER
。 您会立即看到 EOT
作为对此的确认。
. EOT
接下来,运行以下命令检查邮件队列是否为空,以及我们的消息是否已发送。
mailq
如果我们的测试消息已成功发送,输出应如下所示,您很快就会在收件箱中看到它。
/var/spool/mqueue is empty Total requests: 0
现在去检查您的电子邮件以确保消息到达。 它应该来自 freebsd@example.com。
盲目相信邮件队列为空这一事实并不是成功的有效测试。 即使您已经收到邮件,您也会想了解查看邮件日志的基础知识。 运行以下命令。
tail -f /var/log/maillog
您在日志输出中寻找的两个键是
Sent (<message id> Message accepted for delivery)
relay=smtp.sendgrid.net. [208.43.76.147], dsn=2.0.0, stat=Sent (Delivery in progress)
确保您可以在下面的日志输出中发现这些消息。
Mail LogFeb 11 04:09:13 your_server sm-mta[49080]: t1B49CW0049080: from=<freebsd@your_server>, size=331, class=0, nrcpts=1, msgid=<201502110409.t1B49CZ4049079@your_server>, proto=ESMTP, daemon=Daemon0, relay=localhost [127.0.0.1] Feb 11 04:09:13 your_server sendmail[49079]: t1B49CZ4049079: to=your_real_email_address@example.com, ctladdr=freebsd (1001/1001), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30040, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (t1B49CW0049080 Message accepted for delivery) Feb 11 04:09:13 your_server sm-mta[49082]: STARTTLS=client, relay=smtp.sendgrid.net., version=TLSv1/SSLv3, verify=FAIL, cipher=AES128-GCM-SHA256, bits=128/128 Feb 11 04:09:13 your_server sm-mta[49082]: t1B49CW0049080: to=<your_real_email_address@example.com>, ctladdr=<freebsd@your_server> (1001/1001), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30331, relay=smtp.sendgrid.net. [208.43.76.147], dsn=2.0.0, stat=Sent (Delivery in progress)
这表明您的消息已被接受并正在发送到您的收件箱,如果您已经收到它可能会有点虎头蛇尾。
要进行实时测试和故障排除,您可以打开两个终端会话并让 tail -f /var/log/maillog
命令在一个中运行,而在另一个中发送测试消息。
结论
您现在可以开始通过 SendGrid 或任何其他您喜欢的邮件服务从 FreeBSD Droplet 发送出站电子邮件。 您部署的任何网站或 Web 应用程序现在都可以利用这一点,只需最少的配置甚至无需配置。
如果您有任何问题或意见,请在下方留言。