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

介绍

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

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

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

目标

在本教程中,我们将:

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

准备

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

  • 一台已经设置好可以使用sudo命令的非root账号的reeBSD 10.1服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 熟悉如何从命令行编辑文本文件
  • 您应该安装自己喜欢的文本编辑器,例如nanovim
  • 用于测试目的的免费SendGrid帐户,或为您提供服务的SMTP详细信息的其他邮件提供程序。您将需要外部邮件提供商的这些详细信息:
    • 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,默认情况下应该这样。选择确定,然后按ENTER两次以选择所有默认值。出现提示时,请回答y升级并安装软件包。你应该期待大量的输出,结束于:

===>>> 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

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

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

你应该看到这个输出:

usage: 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文件,添加以下参数。(注意,如果您使用的是SendGrid以外的提供程序,则需要更改smtp.sendgrid.net地址。)

vim /etc/mail/access
smtp.sendgrid.net      OK
GreetPause:localhost    0

创建并编辑该authinfo文件,添加以下参数。使用您的SendGrid帐户名和密码替换smtp_usernamesmtp_password。如果您选择使用其他外部邮件提供程序,则还需要将两行的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"

accessauthinfo文件真的是简单的数据库,从中读取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等记录,以避免报告欺骗行为。)

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

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

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


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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

经验分享 | Burpsuite抓取非HTTP流量

使用Burp对安卓应用进行渗透测试的过程中,有时候会遇到某些流量无法拦截的情况,这些流量可能不是HTTP协议的,或者是“比较特殊”的HTTP协议(以下统称非HT...

1K100
来自专栏PhpZendo

Jerry Qu 博客 Nginx 配置之性能篇

在介绍完我博客(imququ.com)的 Nginx 配置中与安全有关的一些配置后,这篇文章继续介绍与性能有关的一些配置。WEB 性能优化是一个系统工程,涵盖很...

14420
来自专栏云计算

在Debian 8上使用Varnish和NGINX通过SSL和HTTP提供WordPress服务

Varnish是一个功能强大且灵活的缓存HTTP反向代理。它可以安装在任何Web服务器的前方来缓存其内容,这将提高速度并减少服务器负载。当客户端请求网页时,Va...

24420
来自专栏小巫技术博客

Android Library上传到JCenter仓库实践

12040
来自专栏.Net移动开发

关于发布IOS的方法(本人亲身经历折腾很久终于成功)

前情提要:这位.NET程序员兄弟使用Smobiler开发了一个APP,尽管Smobiler云平台已经最大限度的简化了iOS应用的打包操作,但仍绕不开苹果公司强制...

16910
来自专栏Java架构师学习

如何才能让Spring Boot与RabbitMQ结合实现延迟队列

顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。 延迟队列能做什么? 延迟队列多用于需要延迟工作...

37660
来自专栏雪胖纸的玩蛇日常

python3+django2 开发易语言网络验证(上)

38940
来自专栏Linyb极客之路

运维管理之防止"rm -rf /" 误删除

大概懂点linux的程序员都知道“rm -rf /”意味着擦除根路径“/”下挂载的所有内容而无需询问。以前一个主管说过,在你不充分了解某个工具的原理的时候,不要...

17540
来自专栏技术博文

34款Firefox渗透测试插件

工欲善必先利其器,firefox一直是各位渗透师必备的利器,小编这里推荐34款firefox渗透测试辅助插件,其中包含渗透测试、信息收集、代理、加密解密等功能。...

445130
来自专栏黑泽君的专栏

day07_Tomcat服务器与http学习笔记

    WEB,在英语中web即表示网页的意思,它用于表示Internet主机上(服务器)供外界访问的资源。

12710

扫码关注云+社区

领取腾讯云代金券