专栏首页云计算教程系列如何在FreeBSD 10.1上使用Sendmail通过外部SMTP服务发送电子邮件
原创

如何在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 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 14.04上安装Graylog 1.x.

    在本教程中,我们将介绍如何在Ubuntu 14.04上安装Graylog v1.3.x(有时称为Graylog2),并将其配置为在集中位置收集系统的syslog...

    温浪
  • 如何在Ubuntu 14.04上配置Redis群集

    Redis是一个开源键值数据存储,使用内存存储模型和可选的磁盘写入来实现持久性。它具有事务,发布/订阅和自动故障转移等功能。建议将Redis与Linux一起用于...

    温浪
  • 如何在CentOS 7上添加Swap

    使服务器响应更快,并防止应用程序中出现内存不足错误的最简单方法之一是添加一些swap空间。Swap是存储驱动器上的一个区域,操作系统可以在该区域临时存储无法再保...

    温浪
  • 移动端兼容适配js+css全局样式

    用户3055976
  • 简单粗暴的移动端适配方案 - REM

    腾讯NEXT学位
  • 简单粗暴的移动端适配方案 - REM

    手机市场日渐丰富的同时,给我们前端开发人员带来的网页内容自适应屏幕尺寸进行显示的问题也日渐凸显出来。原本可能通过百分比/媒体查询等简单手段就可以常见的适配问题,...

    IMWeb前端团队
  • 零碎笔记:移动Web特别样式处理

    高清图片跟我们平时下的那种电影高清图片是不一样的,移动Web的高清图片的概念是我这张图这么大,清晰度这么多,那么我们在移动设备上就该展示这么清晰。那么为什么会产...

    张张
  • 移动端适配之终极适配方案rem适配

    前面几篇移动端专区博文简单介绍了移动端的概述,以及简单的适配方案,百分比适配,比例缩放适配,viewport适配等,但是难免都有一些各种问题!这次这个rem终极...

    十月梦想
  • VUE开发一个组件——Vue PC城市选择控件

    前面用vue开发了三四个组件了,都是H5的,现在来看看PC是如何玩转组件的?其实和H5相同,样式不同而已。

    Javanx
  • Shell系列-Shell概述

    一、shell环境及特性 1.什么是shell? 负责向内核翻译以及传达用户/程序指令,相当于操作系统的”外壳”.在Linux中默认shell一般为/bin/b...

    行 者

扫码关注云+社区

领取腾讯云代金券