介绍
设置新的Web服务器时最常见的需求之一是发送电子邮件。 最安全和最简单的方法是将服务器连接到邮件服务(如SendGrid或Amazon SES)。 使用外部服务将帮助您避免陷阱,如您的服务器IP被反垃圾邮件服务列入黑名单。
在本教程中,我们将讨论如何将FreeBSD的内置Sendmail服务连接到SendGrid,以便从您的服务器发送电子邮件。 您还可以适应不同的外部邮件服务的设置,而没有太多的麻烦。
如果你是新来的FreeBSD,我们做的一些可能看起来有点可怕,但你很快就会喜欢滚动你的袖子,做一些小的重新编译系统工具,如FreeBSD专业人士。
目标
在本教程中,我们将:
- 重新编译具有SASL支持的Sendmail,以便服务器可以使用外部服务进行身份验证
- 使用适当的设置配置Sendmail邮件服务器
- 测试外出电子邮件,以确保邮件从您的服务器中传出
先决条件
在开始本指南之前,您需要具备以下条件:
- 一个FreeBSD 10.1 Droplet
- 访问您的root帐户或使用sudo权限下此帐户教程
- 如何从命令行编辑文本文件的工作知识
- 您应该安装你喜欢的文本编辑器,如
nano
或vim
- 免费SendGrid账户用于测试目的,或其他邮件提供商,为您提供服务的SMTP详细信息。 您需要外部邮件提供商的以下详细信息:
- SMTP主机名
- 用户名
- 密码
- 你的服务器的主机名,您可以通过运行找到
hostname
本教程是最容易遵循以root身份 :
sudo su
第1步 - 设置包管理
首先,我们需要重新编译Sendmail,以便它可以使用外部邮件服务(在这种情况下为SendGrid)进行身份验证。
所有的步骤都包括在内,但如果你喜欢,你可以用跟随一起正式FreeBSD使用手册 。
有些软件会从FreeBSD的编译Ports套件 ,所以我们需要确保是最新的第一位。
portsnap fetch && portsnap update
Portmaster实用程序将让我们从Ports树轻松地编译软件,让我们来安装。
pkg install portmaster
运行以下命令以确保系统知道以最新的软件包格式安装新编译的软件包。
echo 'WITH_PKGNG=yes' >> /etc/make.conf
第2步 - 安装和配置SASL软件包
使用我们新安装的主端口工具,编译和安装cyrus-sasl2
用下面的命令包。 这用于与外部邮件服务进行身份验证。
portmaster security/cyrus-sasl2
当系统提示,确保LOGIN检查,这应该是默认的。 选择确定 ,然后按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
pwcheck_method: saslauthd
接下来,安装saslauthd
为SASL验证服务。 当系统提示,接受默认值,然后选择确定 。
portmaster security/cyrus-sasl2-saslauthd
编辑系统配置文件/etc/rc.conf
并在文件的最后添加下面的配置参数。 替换your_hostname
与服务器的主机名。
vim /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
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
your_server.example.com
example.com
创建和编辑local-host-names
文件,添加以下参数。 将变量替换为本地主机名。
vim /etc/mail/local-host-names
your_server
your_server.example.com
创建和编辑的access
文件,添加以下参数。 (请注意,您需要更改smtp.sendgrid.net
如果您使用的是其他SendGrid供应商地址)。
vim /etc/mail/access
smtp.sendgrid.net OK
GreetPause:localhost 0
创建和编辑authinfo
文件,添加以下参数。 更换smtp_username
和smtp_password
与SendGrid帐户名和密码。 如果您选择使用不同的外部邮件提供商,你还需要改变smtp.sendgrid.net
两条线路上的价值给服务器地址为您供应商。
vim /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
块,如下所示。
你需要的改变smtp.sendgrid.net
如果你不使用SendGrid账户比如上例中的地址到你的供应商的服务器地址。 您还需要更新的两个实例example.com
域您想要的邮件是从 。 (请注意,您可能需要设置适当的TXT,DKIM,PTR等记录,以避免欺骗的报告。
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
重新启动Sendmail:
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应用程序现在都可以利用这一点,从最少到没有配置。
如果您有任何问题或意见,请将其留在下面。