介绍
在设置新 Web 服务器时,最常见的需求之一是发送电子邮件. 最安全和最简单的方法是将您的服务器连接到邮件服务(如 SendGrid 或 Amazon SES)。
在本教程中,我们将讨论如何将FreeBSD的内置Sendmail服务连接到SendGrid,以便从您的服务器发送电子邮件。
如果你是新手的FreeBSD,我们做的一些事情可能看起来有点可怕,但你很快就会觉得很舒服地把手套滚起来,做一些系统工具的重构,比如FreeBSD的专业人士。
<$>[注] 注: 截至 2022 年 7 月 1 日,DigitalOcean 将不再通过控制面板或 API 支持 FreeBSD Droplets。
目标
在本教程中,我们将:
- 重新编译Sendmail与SASL支持,以便服务器可以通过外部服务 进行身份验证 * 配置Sendmail邮件服务器与相应的设置
- 测试输出电子邮件,以确保邮件来自您的服务器
前提条件
在您开始本指南之前,您将需要以下内容:
- FreeBSD 10.1 服务器
- 访问您的 root 帐户或使用 sudo 特权的帐户,如本教程(https://andsky.com/tech/tutorials/how-to-add-and-remove-users-on-freebsd)
- 如何从命令行中编辑文本文件的工作知识
- 您应该安装您最喜欢的文本编辑器,如
nano
或vim
- 免费的 SendGrid 用于测试的帐户,或其他邮件提供商为您提供服务的 SMTP 详细信息。
这个教程最容易跟随作为 root:
1sudo su
步骤 1 – 设置包管理
首先,我们需要重新编译Sendmail,以便它可以通过外部邮件服务进行身份验证 - 在这种情况下,SendGrid。
所有步骤都包含在这里,但如果你喜欢,你可以跟随官方的FreeBSD手册(https://www.freebsd.org/doc/handbook/SMTP-Auth.html)。
一些软件将从FreeBSD的Ports Collection(LINK0)中编译,所以我们需要先确保它是最新的。
1portsnap fetch && portsnap update
Portmaster 实用程序将让我们从 Ports 树中轻松编译软件,所以让我们安装它。
1pkg install portmaster
运行以下命令,以确保系统知道如何在FreeBSD的最新包格式中安装新编译的包。
1echo 'WITH_PKGNG=yes' >> /etc/make.conf
步骤 2 — 安装和配置 SASL 包
使用我们新安装的 Portmaster 实用程序,用以下命令编译和安装 cyrus-sasl2
包,用于与外部邮件服务的身份验证。
1portmaster security/cyrus-sasl2
当被提示时,请确保 LOGIN被检查,这应该是默认情况下。选择 OK并按两次按ENTER
来选择所有默认情况。当被要求时,请回答y
来升级和安装您的包。
1[secondary_label Output]
2===>>> Done displaying pkg-message files
3
4===>>> The following actions were performed:
5 Upgrade of pkg-1.4.12 to pkg-1.5.0
6 Upgrade of perl5-5.18.4_11 to perl5-5.18.4_13
7 Installation of security/cyrus-sasl2 (cyrus-sasl-2.1.26_9)
编辑文件(如果它尚未存在,则创建它) /usr/local/lib/sasl2/Sendmail.conf
,并添加以下内容:
1vim /usr/local/lib/sasl2/Sendmail.conf
1[label /usr/local/lib/sasl2/Sendmail.conf]
2pwcheck_method: saslauthd
接下来,安装 SASL 身份验证的 saslauthd
服务. 当被提示时,接受默认值并选择 OK。
1portmaster security/cyrus-sasl2-saslauthd
编辑系统配置文件 /etc/rc.conf
并在文件末尾添加以下配置参数. 用您的服务器的主机名替换 your_hostname
。
1vim /etc/rc.conf
1[label /etc/rc.conf]
2hostname = "your_hostname"
3sendmail_enable="YES"
4saslauthd_enable="YES"
现在就开始萨拉赫
服务了。
1service saslauthd start
你应该看到这个输出:
1[secondary_label Output]
2usage: hostname [-fs] [name-of-host]
3usage: hostname [-fs] [name-of-host]
4Starting saslauthd.
编辑 /etc/make.conf
文件,添加以下参数,以便系统知道使用哪些 SASL Sendmail 选项。
1vim /etc/make.conf
1[label /etc/make.conf]
2SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL
3SENDMAIL_LDFLAGS=-L/usr/local/lib
4SENDMAIL_LDADD=-lsasl2
步骤 3 – 使用 SASL 支持重新编译 Sendmail
在本节中,我们将重构Sendmail以使用SASL身份验证。
现在我们需要对 FreeBSD 10.1 的最新源代码进行同步。
首先,我们将安装Subversion,以便我们可以轻松获得所需的源代码。
1pkg install subversion
现在我们可以直接从FreeBSD项目网站查看最新的复制代码,以更新我们的来源在 `/usr/src。
1svn co http://svn.freebsd.org/base/releng/10.1/ /usr/src
我们在这里做的是告诉系统以新的安全性和登录要求重新编译(或重建)内置的Sendmail包,然后重新安装Sendmail。
1cd /usr/src/lib/libsmutil
2make cleandir && make obj && make
1cd /usr/src/lib/libsm
2make cleandir && make obj && make
1cd /usr/src/usr.sbin/sendmail/
2make cleandir && make obj && make && make install
步骤 4 – 设置Sendmail
你已经完成了这一点,我们已经完成了收集东西。
对于下一步,我们将通过一个基本的Sendmail配置,该配置将告诉Sendmail通过我们选择的外部智能托管服务来路由所有输出邮件。
首先,我们将保持安全,并创建一个/etc/mail
目录的备份。
1cp -a /etc/mail /etc/mail.bak
进入邮件配置目录。
1cd /etc/mail
运行以下命令来生成基本邮件配置。
1make
创建和编辑relay-domains
文件,添加以下参数. 用您的 FQDN 替换your_server.example.com
,用您的域名替换example.com
。
1vim /etc/mail/relay-domains
1[label /etc/mail/relay-domains]
2your_server.example.com
3example.com
创建和编辑本地主机名
文件,添加以下参数。
1vim /etc/mail/local-host-names
1[label /etc/mail/local-host-names]
2your_server
3your_server.example.com
创建和编辑访问
文件,添加以下参数(注意,如果您正在使用SendGrid以外的提供商,您需要更改smtp.sendgrid.net
地址)。
1vim /etc/mail/access
1[label /etc/mail/access]
2smtp.sendgrid.net OK
3GreetPause:localhost 0
创建和编辑authinfo
文件,添加以下参数。 将smtp_username
和smtp_password
替换为您的SendGrid帐户名称和密码。 如果您选择使用不同的外部邮件提供商,您还需要在两个行上更改smtp.sendgrid.net
值到您的服务器地址。
1vim /etc/mail/authinfo
1[label /etc/mail/authinfo]
2AuthInfo:smtp.sendgrid.net "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN"
3AuthInfo:smtp.sendgrid.net:587 "U:root" "I:smtp_username" "P:smtp_password" "M:LOGIN"
访问
和authinfo
文件实际上是简单的数据库,从那里Sendmail读取配置参数。这听起来很困惑,特别是如果你是新手的FreeBSD和Sendmail,但你只需要从/etc/mail/
执行这两个无痛的命令来生成数据库。
1makemap hash access < access
2makemap hash authinfo < authinfo
现在我们将编辑我们生成的几个命令 aback 的基本配置. 编辑 your_server.mc
文件. (如果您不确定文件名,您可以 ls
的 /etc/mail/
目录。
1vim /etc/mail/your_server.example.com.mc
将下列配置行插入dnl define
(SMART_HOST
,your.isp.mail.server
)块和dnl Uncomment
块之间,以更改默认块的位置,如下所示。
您还需要将smtp.sendgrid.net
地址更改为提供商的服务器地址,如果您不使用像示例中的SendGrid帐户,您还需要将example.com
的两个实例更新到您希望邮件的域名为 from。
1[label /etc/mail/your_server.example.com.mc]
2dnl define(`SMART_HOST', `your.isp.mail.server')
3
4dnl SET OUTBOUND DOMAIN
5MASQUERADE_AS(`example.com')
6MASQUERADE_DOMAIN(example.com)
7FEATURE(masquerade_envelope)
8FEATURE(masquerade_entire_domain)
9
10dnl SMART HOST CONFIG
11define(`SMART_HOST', `smtp.sendgrid.net')dnl
12define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
13define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
14FEATURE(`authinfo',`hash /etc/mail/authinfo.db')dnl
15TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
16
17dnl Uncomment the first line to change the location of the default
在我们应用这些更改之前,让我们通过上面的一些配置。第一个区块是告诉Sendmail,我们希望确保它显示出我们的出发邮件来自我们的域名example.com
。
第二个区块是定义我们要 smart host 我们的邮件到哪里,包括端口,身份验证方法和我们在上一个步骤中设置的身份验证信息。
现在让我们应用我们所做的更改,确保您仍然在/etc/mail/
目录中,确保Sendmail已启动:
1service sendmail start
更新我们的配置:
1make
2make install restart
重新启动邮件:
1service sendmail restart
我们的Sendmail配置完成了,下一步是发送测试电子邮件。
步骤5 - 发送测试电子邮件
现在我们已经通过了正确设置的所有步骤,让我们确保一切都起作用。
使用mailx
命令将测试消息发送到您每天使用的真实电子邮件帐户。
1mailx [email protected]
当被提示时,输入测试
或任何你想要的主题,然后按进入
。
1Subject: test
然后,你将被呈现的只是一个方程式,并有能力写你的测试电子邮件的身体. 只需再次写单个单词测试
,然后再次按输入
。
1test
你需要告诉mailx
,你完成了写你的消息;要做到这一点,我们必须用单个``结束消息,并按下ENTER
最后一次。
1.
2EOT
接下来,运行以下命令来检查邮件排队是否空,并且我们的消息已发送。
1mailq
如果我们的测试消息已成功发送,输出应该是这样的,你应该很快在你的收件箱中看到它。
1/var/spool/mqueue is empty
2 Total requests: 0
现在去检查你的电子邮件,以确保消息已经到达. 它应该来自 [email protected]。
盲目相信邮件排队是空的并不是一个有效的成功测试,即使你已经收到消息,你会想知道查看邮件日志的基本知识。
1tail -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)
确保您可以在下面的日志输出中找到这些消息。
1[secondary_label Mail Log]
2Feb 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]
3Feb 11 04:09:13 your_server sendmail[49079]: t1B49CZ4049079: [email protected], 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)
4Feb 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
5Feb 11 04:09:13 your_server sm-mta[49082]: t1B49CW0049080: to=<[email protected]>, 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服务器发送输出电子邮件。
如果您有任何疑问或评论,请在下方留言。