如何在 FreeBSD 10.1 上使用 Sendmail 通过外部 SMTP 服务发送电子邮件

介绍

在设置新 Web 服务器时,最常见的需求之一是发送电子邮件. 最安全和最简单的方法是将您的服务器连接到邮件服务(如 SendGrid 或 Amazon SES)。

在本教程中,我们将讨论如何将FreeBSD的内置Sendmail服务连接到SendGrid,以便从您的服务器发送电子邮件。

如果你是新手的FreeBSD,我们做的一些事情可能看起来有点可怕,但你很快就会觉得很舒服地把手套滚起来,做一些系统工具的重构,比如FreeBSD的专业人士。

<$>[注] 注: 截至 2022 年 7 月 1 日,DigitalOcean 将不再通过控制面板或 API 支持 FreeBSD Droplets。

目标

在本教程中,我们将:

  • 重新编译Sendmail与SASL支持,以便服务器可以通过外部服务 进行身份验证 * 配置Sendmail邮件服务器与相应的设置
  • 测试输出电子邮件,以确保邮件来自您的服务器

前提条件

在您开始本指南之前,您将需要以下内容:

这个教程最容易跟随作为 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_usernamesmtp_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命令将测试消息发送到您每天使用的真实电子邮件帐户。

当被提示时,输入测试或任何你想要的主题,然后按进入

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服务器发送输出电子邮件。

如果您有任何疑问或评论,请在下方留言。

Published At
Categories with 技术
Tagged with
comments powered by Disqus