前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在FreeBSD 10.1上使用Sendmail通过外部SMTP服务发送电子邮件

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

原创
作者头像
温浪
修改2018-10-22 11:39:43
3.1K0
修改2018-10-22 11:39:43
举报

介绍

设置新的Web服务器时最常见的需求之一是发送电子邮件。最安全,最简单的方法是将服务器连接到SendGrid或Amazon SES等邮件服务。使用外部服务将帮助您避免陷阱,例如您的服务器IP被反垃圾邮件服务列入黑名单。

在本教程中,我们将讨论如何将FreeBSD的内置Sendmail服务连接到SendGrid以从服务器发送电子邮件。您还可以轻松调整其他外部邮件服务的设置。

如果你是FreeBSD的新手,我们所做的一些事情可能看起来有些可怕,但是你很快就可以轻松地卷起袖子来重新编译像FreeBSD专业版这样的系统工具。

目标

在本教程中,我们将:

  • 使用SASL支持重新编译Sendmail,以便服务器可以使用外部服务进行身份验证
  • 使用适当的设置配置Sendmail邮件服务器
  • 测试出站电子邮件以确保邮件从您的服务器发出

准备

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

  • 一台已经设置好可以使用sudo命令的非root账号的reeBSD 10.1服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 熟悉如何从命令行编辑文本文件
  • 您应该安装自己喜欢的文本编辑器,例如nanovim
  • 用于测试目的的免费SendGrid帐户,或为您提供服务的SMTP详细信息的其他邮件提供程序。您将需要外部邮件提供商的这些详细信息:
    • SMTP主机名
    • 用户名
    • 密码
  • 您的服务器主机名,您可以通过运行hostname找到它

本教程最容易以root身份进行:

代码语言:javascript
复制
sudo su

第1步 - 设置包管理

首先,我们需要重新编译Sendmail,以便它可以使用外部邮件服务进行身份验证 - 在本例中为SendGrid。

所有步骤都包含在这里,但如果您愿意,可以按照官方的FreeBSD手册进行操作

有些软件将从FreeBSD的Ports Collection编译,所以我们需要确保它是最新的。

代码语言:javascript
复制
portsnap fetch && portsnap update

Portmaster实用程序将允许我们从Ports树轻松编译软件,所以让我们安装它。

代码语言:javascript
复制
pkg install portmaster

运行以下命令以确保系统知道以FreeBSD的最新包格式安装新编译的包。

代码语言:javascript
复制
echo 'WITH_PKGNG=yes' >> /etc/make.conf

步骤2 - 安装和配置SASL包

使用我们新安装的Portmaster实用程序,cyrus-sasl2使用以下命令编译和安装软件包。这用于使用外部邮件服务进行身份验证。

代码语言:javascript
复制
portmaster security/cyrus-sasl2

出现提示时,确保选中了LOGIN,默认情况下应该这样。选择确定,然后按ENTER两次以选择所有默认值。出现提示时,请回答y升级并安装软件包。你应该期待大量的输出,结束于:

代码语言:javascript
复制
===>>> 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并向其中添加以下内容:

代码语言:javascript
复制
vim /usr/local/lib/sasl2/Sendmail.conf
代码语言:javascript
复制
pwcheck_method: saslauthd

接下来,安装saslauthdSASL身份验证服务。出现提示时,接受默认值并选择“ 确定”

代码语言:javascript
复制
portmaster security/cyrus-sasl2-saslauthd

编辑系统配置文件/etc/rc.conf,并在文件末尾添加以下配置参数。替换your_hostname为服务器的主机名。

代码语言:javascript
复制
vim /etc/rc.conf
代码语言:javascript
复制
hostname = "your_hostname"
sendmail_enable="YES"
saslauthd_enable="YES"

现在开始saslauthd服务。

代码语言:javascript
复制
service saslauthd start

你应该看到这个输出:

代码语言:javascript
复制
usage: hostname [-fs] [name-of-host]
usage: hostname [-fs] [name-of-host]
Starting saslauthd.

编辑/etc/make.conf文件,添加以下参数,以便系统知道要使用的SASL Sendmail选项。

代码语言:javascript
复制
vim /etc/make.conf
代码语言:javascript
复制
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,以便我们可以轻松获取所需的源代码。

代码语言:javascript
复制
pkg install subversion

现在我们可以直接从FreeBSD项目网站查看最新的重新编译代码,以更新我们的资源/usr/src

代码语言:javascript
复制
svn co http://svn.freebsd.org/base/releng/10.1/ /usr/src

您需要连续运行的下一个命令,一次一个组。我们在这里做的是告诉系统使用我们新的安全和登录要求重新编译(或重建)内置的Sendmail包,然后重新安装Sendmail。

代码语言:javascript
复制
cd /usr/src/lib/libsmutil
make cleandir && make obj && make
代码语言:javascript
复制
cd /usr/src/lib/libsm
make cleandir && make obj && make
代码语言:javascript
复制
cd /usr/src/usr.sbin/sendmail/
make cleandir && make obj && make && make install

第4步 - 配置Sendmail

你已经做到了这一点,我们已经完成了重新编译。我们继续吧!

对于下一步,我们将介绍一个基本的Sendmail配置,该配置将告诉Sendmail通过我们选择的外部智能托管服务路由所有出站邮件。

首先,我们将安全并创建/etc/mail目录的备份。

代码语言:javascript
复制
cp -a /etc/mail /etc/mail.bak

输入邮件配置目录。

代码语言:javascript
复制
cd /etc/mail

运行以下命令以生成基本邮件配置。

代码语言:javascript
复制
make

创建并编辑该relay-domains文件,添加以下参数。替换your_server.example.com为您的FQDN和替换example.com为您的域名。

代码语言:javascript
复制
vim /etc/mail/relay-domains
代码语言:javascript
复制
your_server.example.com
example.com

创建并编辑该local-host-names文件,添加以下参数。用本地主机名替换变量。

代码语言:javascript
复制
vim /etc/mail/local-host-names
代码语言:javascript
复制
your_server
your_server.example.com

创建并编辑该access文件,添加以下参数。(注意,如果您使用的是SendGrid以外的提供程序,则需要更改smtp.sendgrid.net地址。)

代码语言:javascript
复制
vim /etc/mail/access
代码语言:javascript
复制
smtp.sendgrid.net      OK
GreetPause:localhost    0

创建并编辑该authinfo文件,添加以下参数。使用您的SendGrid帐户名和密码替换smtp_usernamesmtp_password。如果您选择使用其他外部邮件提供程序,则还需要将两行的smtp.sendgrid.net值更改为提供程序的服务器地址。

代码语言:javascript
复制
vim /etc/mail/authinfo
代码语言:javascript
复制
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"

accessauthinfo文件真的是简单的数据库,从中读取Sendmail的配置参数。这可能听起来令人困惑,特别是如果你是FreeBSD和Sendmail的新手,但你只需要运行这两个无痛的命令/etc/mail/来生成数据库。

代码语言:javascript
复制
makemap hash access < access
makemap hash authinfo < authinfo

现在我们将编辑我们生成的一些命令的基本配置。编辑your_server.mc文件。(如果您不确定文件名,可以使用ls/etc/mail/目录。)

代码语言:javascript
复制
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等记录,以避免报告欺骗行为。)

代码语言:javascript
复制
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已启动:

代码语言:javascript
复制
service sendmail start

更新我们的配置:

代码语言:javascript
复制
make
make install restart

重启Sendmail:

代码语言:javascript
复制
service sendmail restart

我们的Sendmail配置已完成。下一步是发送测试电子邮件。

第5步 - 发送测试电子邮件

现在我们已经完成了正确设置的所有步骤,让我们确保一切正常。

使用此mailx命令将测试邮件发送到您每天使用的真实电子邮件帐户。

代码语言:javascript
复制
mailx your_real_email_address@example.com

出现提示时,输入test或您想要的主题或任何内容,然后按ENTER

代码语言:javascript
复制
Subject: test

然后,您将看到一个光标,并能够编写测试电子邮件的正文。只需test再次单个单词,然后ENTER再次按下。

代码语言:javascript
复制
test

你需要告诉mailx你已经写完了你的信息; 要做到这一点,我们必须用一个结束消息.并按ENTER最后一次。你会立即看到EOT确认。

代码语言:javascript
复制
.
EOT

接下来,运行以下命令以检查邮件队列是否为空并且我们的消息是否已发送。

代码语言:javascript
复制
mailq

如果我们的测试消息已成功发送,则输出应如下所示,您很快就会在收件箱中看到它。

代码语言:javascript
复制
/var/spool/mqueue is empty
                Total requests: 0

立即检查您的电子邮件,确保邮件到达。它应该来自freebsd @ example.com

盲目地相信邮件队列是空的这一事实并不是成功的有效测试。即使您已收到该消息,您也会想知道查看邮件日志的基本知识。运行以下命令。

代码语言:javascript
复制
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)

确保您可以在下面的日志输出中发现这些消息。

代码语言:javascript
复制
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 CVM发送出站电子邮件。您部署的任何网站或Web应用程序现在都可以利用此功能,只需极少配置即可。

如果您有任何问题或意见,请在下面留下。

更多Free BSD教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Send Email through an External SMTP Service with Sendmail on FreeBSD 10.1》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 目标
      • 准备
        • 第1步 - 设置包管理
          • 步骤2 - 安装和配置SASL包
            • 第3步 - 使用SASL支持重新编译Sendmail
              • 第4步 - 配置Sendmail
                • 第5步 - 发送测试电子邮件
                  • 结论
                  相关产品与服务
                  多因子身份认证
                  多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档