如何在Ubuntu16.04上使用Postfix和Mailgun设置邮件中继

来自菜鸟教程
跳转至:导航、​搜索

介绍

设置 SMTP 服务器不是胆小的人的任务。 不仅安全是一个主要问题,而且邮件的可传递性是一个更大的问题。 由于当今大多数电子邮件提供商都提供了高度的垃圾邮件保护,因此确保来自自制 SMTP 服务器的电子邮件的高交付率而不被标记为垃圾邮件并不是很可行。

邮件中继解决了这两个问题。 它比完整的 SMTP 服务器配置简单得多,因为您只需将服务器生成的任何电子邮件路由到专业管理的 SMTP 服务器。 因此,您将摆脱大多数电子邮件送达方面的麻烦。

邮件中继有两种类型:openclose。 开放式邮件中继路由来自外部来源的邮件以及内部服务器邮件。 这种类型的中继对于垃圾邮件发送者的滥用已经成熟。 一个封闭的中继只转发我们的服务器和内部网络内部生成的消息。

虽然您可以使用任何外部 SMTP 服务器来路由电子邮件,但 Mailgun 提供了许多优于其他 SMTP 服务器的优势。 它每月最多可免费发送 10,000 封电子邮件,非常可靠,并且可以让您从单独的域发送邮件。 通过使用与常规企业电子邮件域不同的域,您可以添加另一层保护,防止意外被列入黑名单。

本教程将引导您完成创建和设置免费 Mailgun 帐户和子域、设置所需的 DigitalOcean DNS 记录以及使用 Postfix 设置封闭邮件中继的过程。

先决条件

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

第 1 步 — 设置 Mailgun 帐户

https://mailgun.com/signup 创建一个新帐户。 注册完成后,登录并转到您的 dashboard,然后单击页面顶部菜单中的 Domains 链接。

您将看到 Mailgun 为您创建的沙盒域。

不要使用沙箱,而是通过单击 添加新域 按钮为 Mailgun 创建一个子域。 您可以将此子域命名为任何您喜欢的名称,例如 mailgun.example.combulkemail.example.com。 本教程将在其示例中使用 mg.example1.com

创建子域后,您的 Domains 页面应如下图所示:

接下来,通过单击其名称的链接进入您的子域页面。 您将看到三组 DNS 记录,如下图所示:

您需要在 DigitalOcean 仪表板中为您的域添加这些 DNS 记录。 SendingTracking 的 DNS 记录是必需的,但您可以忽略 Receiving 的 DNS 记录。 您将使用此页面上的信息在下一步中创建正确的 DNS 记录,因此请保持此页面打开,以便您可以复制这些记录的值。

第 2 步 — 在 DigitalOcean 上设置 DNS 记录

登录到您的 DigitalOcean 帐户,然后单击仪表板上的 Networking 菜单。 然后在 Domain 字段中输入您在 Mailgun 中创建的子域,然后选择您希望在其上配置邮件中继的 Droplet。 然后按创建记录按钮。

新域将出现在您的域列表中。 单击它以显示其编辑页面。 除了已经创建的记录之外,您还需要添加两个 TXT 记录和 Mailgun 指定的 CNAME 记录。 您也可以选择添加 MX 记录,但邮件中继不需要它们。 创建记录时请参考此示例屏幕截图:

使用您在步骤 1 中获得的 Mailgun 提供的信息添加以下记录:

  • 创建一个新的 CNAME 记录: 输入电子邮件作为名称和 mailgun.org。 为主机名。 主机名末尾的句点是必需的。
  • 创建一个 TXT 记录: 输入 @ 作为名称。 对于文本,输入 Mailgun 中第一条 TXT 记录的文本,用双引号引起来。 在此示例中,它是“v=spf1 include:mailgun.org ~all”,但您应该通过查看 Mailgun 提供的值来验证这一点。
  • 创建另一个 TXT 记录: 从 Mailgun 为名称字段提供的第二个 txt 记录中输入主机名的粗体部分。 在此示例中,它是 mallo._domainkey,但它可能与您的 Mailgun 域不同。 对于文本,复制 Mailgun 提供的整个值并用双引号将其括起来。 它应该看起来像“k=rsa;p=MIGfMA0G...AQAB”。

Mailgun 需要先验证您的域设置,然后才能继续。 您可以等待 DNS 记录更新,或返回 Mailgun 中的域页面,找到该部分域验证和 DNS ,然后单击按钮立即检查 DNS 记录当您的 DNS 记录签出时,您将看到已验证的记录旁边的绿色复选框。

DNS 记录可能需要一些时间来更新。 更新时间可以从几分钟到几小时不等。

注意: 如果您的 DNS 记录未在 Mailgun 中验证,请仔细检查您输入的值以确保它们与您的 Mailgun 域页面中的值匹配。 请记住将 TXT 记录值放在双引号 (") 中。 此外,第一个(较短的)TXT 记录的名称应该是 @,而不是 Mailgun 提供的 hostname


在等待 DNS 更新时,从您的 MailGun 域页面查看并复制您的 SMTP 凭据。 您很快就会需要这些值。 在域信息部分下,您的用户名列在默认SMTP登录旁边,密码在默认密码旁边。 如果需要,您还可以通过单击链接 Manage SMTP credentials 来更改这些值。

接下来让我们设置 Postfix。

第 3 步 — 安装和配置 Postfix

我们将使用内置的 pacakge 管理器来安装 Postfix。

以非 root 用户身份连接到您的服务器:

ssh sammy@your_server_ip

通常,Postfix 安装过程使用一些交互式屏幕来提示您输入信息。 为了防止在此设置过程中出现任何可能的错误,让我们在开始安装过程之前预先配置此信息。

首先,配置 Postfix 作为邮件中继:

sudo debconf-set-selections <<< "postfix postfix/main_mailer_type select Satellite system"

然后告诉 Postfix 使用你服务器的主机名作为邮件服务器的主机名:

sudo debconf-set-selections <<< "postfix postfix/mailname string $HOSTNAME"

然后将 Postfix 配置为使用 Mailgun 的 SMTP 服务器进行中继邮件:

sudo debconf-set-selections <<< "postfix postfix/relayhost string smtp.mailgun.org"

有了这些配置,安装 Postfix:

sudo apt -y install postfix

为了使 Postfix 与 Mailgun 连接,您必须使用您在步骤 2 中获得的 Mailgun 子域的用户名和密码创建一个凭据文件。

注意:每个 Mailgun 子域都有自己的凭据。 有关详细信息,请参阅 Mailgun 文档中的 在哪里可以找到我的 API 密钥和 SMTP 凭据


创建并编辑一个新的凭证文件:

sudo nano /etc/postfix/sasl_passwd

将以下行添加到新文件中:

/etc/postfix/sasl_password

smtp.mailgun.org your_mailgun_smtp_user@your_subdomain_for_mailgun:your_mailgun_smtp_password

接下来,通过限制对 root 的读写权限来保护文件,并使用 postmap 命令更新 Postfix 的查找表以使用这个新文件:

sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd

接下来,通过防止匿名登录并指定凭证文件以向 Mailgun 提供安全登录来增强邮件中继的安全性。 编辑 Postfix 配置文件:

sudo nano /etc/postfix/main.cf

并将这些行添加到文件的末尾:

/etc/postfix/main.cf

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = AUTH LOGIN

注意:Postfix 有各种安全措施来防止垃圾邮件机器人使用您的邮件中继(有关详细信息,请参阅 http://www.postfix.org/SMTPD_ACCESS_README.html)。 具体来说,main.cf 中的这两行将邮件中继的使用限制为您的本地网络和您之前定义的 SASL 授权用户。

/etc/postfix/main.cf

smtpd_relay_restrictions = permit_mynetworks
permit_sasl_authenticated defer_unauth_destination

现在重新启动 Postfix 以加载新配置:

sudo systemctl restart postfix

您还应该通过运行以下命令检查防火墙的状态来确保没有打开任何传入的 SMTP 端口:

sudo ufw status

输出应如下所示:

OutputTo                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere                  
22 (v6)                    ALLOW IN    Anywhere (v6)      

输出应该 notTo 列中包含以下任何端口:25465587。 这些端口用于 SMTP 访问,并且您不希望允许传入流量使用您的邮件中继。 如果这些端口确实出现在输出中,请查看 本教程 以了解如何删除规则或明确拒绝访问。

通常,为了使用 Postfix 设置 SMTP 服务器,您的服务器的主机名必须与您网站的 完全限定域名 (FQDN) 相同。 如果您的服务器的主机名是 FQDN,您可以向前跳到第 5 步。 否则,请继续阅读。

第 4 步 — 设置域映射

由于我们将 Mailgun 用于我们的 SMTP 服务器而不是 Postfix,因此您的服务器的主机名不需要与您用于电子邮件的 FQDN 匹配。 这是很常见的。 例如,如果您的服务器是数据库服务器或监控服务器,它可能根本没有 FQDN。 我们可以建立一个映射表,用一个e-mail地址代替另一个。

在这种情况下,我们会将您的 Linux 用户电子邮件帐户映射到您希望在 MailGun 域中使用的任何用户名。

通过创建文件 /etc/postfix/generic 来创建和编辑一个新的映射表:

sudo nano /etc/postfix/generic

将此行添加到将您机器上的 sammy 用户映射到 Mailgun 的文件中。

/etc/后缀/通用

sammy@your_hostname sender@your_subdomain_for_mailgun

您可以将 sender 替换为您想要的任何名称,例如 wordpressno-reply。 唯一真正重要的部分是 your_subdomain_for_mailgun,它应该是您在步骤 1 中定义的 Mailgun 子域。

您可以通过创建更多这样的行来指定多个用户。

现在使用 postmap 命令将此映射添加到 Postfix 查找表:

sudo postmap /etc/postfix/generic

然后编辑您的 Postfix 配置文件以添加映射文件:

sudo nano /etc/postfix/main.cf

将此行添加到文件末尾:

/etc/postfix/main.cf

smtp_generic_maps = hash:/etc/postfix/generic

最后,重新启动 Postfix 以合并更改:

sudo systemctl restart postfix

让我们测试一下邮件中继,以确保一切配置正确。

第 5 步 — 测试您的邮件中继

要测试您的新邮件中继,您将从您的服务器向您的个人电子邮件地址发送一条消息。 安装 mailutils 以便您可以快速发送测试电子邮件。

sudo apt -y install mailutils

然后使用 mailutils 撰写并从服务器上的当前用户向您的个人电子邮件帐户发送消息。

mail -s "Test mail" your_email_address <<< "A test message using Mailgun"

您可以将消息更改为您喜欢的任何内容。

检查您的电子邮件客户端,看看您是否收到了测试消息。 如果您这样做了,那么恭喜您成功设置了邮件中继。 如果没有,请继续阅读以进行故障排除。

第 6 步 — 排除邮件中继故障

虽然有很多事情可能会出错,例如在前面的任何步骤中出错,但这里有一些您可能会遇到的常见问题。

首先,确保 Mailgun 已验证您的 DNS 记录。 在该步骤成功之前,什么都不会发生。 仔细检查 Mailgun 的用户界面并确保该域已经过验证。

接下来,仔细检查您的凭据文件 (/etc/postfix/sasl_passwd)。 确保您的用户名和密码与 Mailgun 中相应子域的用户名和密码匹配。 不要使用您的 Mailgun 凭据,因为它们不起作用。 使用 Mailgun 为您的子域提供的特定凭据。

检查您的电子邮件日志以获取任何有用的错误消息。 您需要检查两个地方。 首先,检查服务器上的日志,您可以在文件 /var/log/mail.log 中找到该日志。 您可以查看最新条目

tail -f /var/log/mail.log

这会显示日志文件的最后几行,但也会“跟随”输出,这意味着任何新的日志条目都将在写入日志时显示。 查看有助于诊断任何问题的错误消息的输出。 例如,Mailgun 的密码错误将显示此错误:

Output> Nov 1 16:07:45 cart-1268 postfix/smtp[30082]: 0E8062038A: to=<yourmail@example.com>, relay=smtp.mailgun.org[173.203.37.114]:25, delay=2.3, delays=0.02/0/2.3/0, dsn=4.7.0, status=deferred (SASL authentication failed; server smtp.mailgun.org[173.203.37.114] said: 535 5.7.0 Mailgun is not loving your login or password)

除了您的服务器,Mailgun 还记录事务。 访问您的 Mailgun 仪表板并选择 Logs 菜单以查看任何可能发生的阻止消息传递的错误消息。

最后,如果您的服务器的主机名不是 FQDN,请确保您已完成第 4 步为您的用户创建映射,以便他们可以发送消息。

结论

恭喜您使用 Mailgun 设置了您的第一个电子邮件中继。 您现在拥有从服务器发送各种电子邮件的安全方法,从内部通信和 cron 任务结果到客户通讯或来自 Web 应用程序的消息。

如果您要使用其他服务器来发送邮件,则只需在每台服务器上再次执行步骤 3 和 4。 您可以为任意数量的服务器重复使用相同的 MailGun 域。 您还可以设置多个域,以便根据用途区分您的电子邮件。

一个常见的场景是使用两个域; 一个用于内部服务器邮件,另一个用于批量邮件。 内部服务器邮件是可能从您的服务器程序之一发送的任何内容,例如 cron 任务或 Wordpress。 群发邮件是指将邮件发送到整个邮件列表。 由于垃圾邮件,这种类型的电子邮件特别容易被列入黑名单,因此您可能希望使用一个在被阻止时可以丢弃的域,同时仍保留您的其他域。 无论如何,在发送大量邮件时,请务必使用良好的电子邮件做法。 有关详细信息,请参阅 收件艺术

要添加其他电子邮件域,请为每个新域再次完成步骤 1 和 2,然后根据需要编辑 /etc/postfix/sasl_passwd/etc/postfix/generic。 基本的 Postfix 配置保持不变。

快乐的电子邮件!