云端邮件的奇特案例
大多数时候,当我启动一个项目或启动一个虚拟服务器时,它都是在我的地下室“服务器农场”中完成的。就在几年前,如果我希望这些服务是公开的,我只需从我的静态 IP 进行端口转发到我的个人机器。或者,如果我需要暴露一个 Web 应用程序,也许我会设置一个基于名称的虚拟主机作为反向代理。在本地托管项目的好处是,当我需要发送电子邮件消息(通常是错误通知)时,我可以简单地通过我的 ISP 的 SMTP 服务器发送它们。当然,这些年来情况变得稍微复杂了一些,因为 ISP 开始锁定他们的邮件服务器,并且只为有效的域中继邮件,但这仅仅意味着我必须正确注册我的静态 IP。它运行良好。
问题是,过去一年我在办公室互联网连接方面遇到的问题确实迫使我重新考虑如何托管面向公众的服务。出于必要,我不得不启动云实例并远程托管我的众多项目。我实际上很感谢这种需求,因为虽然远程托管项目不是免费的,但它相当便宜且方便得多。我的 Raspberry Pi 仍然免费托管在奥地利(再次感谢 Kyle Rankin,感谢您向我推荐这项很棒的服务!)。不幸的是,Raspberry Pi 的性能不足以应对我在网上尝试的许多疯狂的事情。例如,它很难托管 MySQL。所以我的主要“项目”服务器是一个 Google Compute 实例,我最终每月支付大约 15 美元来保持其活动状态。这并不便宜,但我实际上认为我现在可以关闭我家里的一台 ESXi 机器,而且我怀疑它消耗的电费不止这个数。
问题互联网托管服务器的问题在于,缺少可用的 SMTP 中继使得电子邮件非常困难。是的,可以安装 Postfix 作为功能齐全的电子邮件服务器,但我不想担心保护我自己的电子邮件服务器免受试图将我用作垃圾邮件中继的攻击。而且,尽管安装非中继电子邮件服务器当然是可能的,但我发现,除非您配置 SPF 记录、MX 记录并特别幸运,否则从云实例发送的电子邮件通常永远不会到达目的地。如果您在运行时启动服务器,则尤其如此。
事实是,我想要电子邮件的首要原因只是为了在我的服务器出现问题时收到通知。我从不需要回复这些电子邮件。我真的不在乎电子邮件来自哪里(地址方面)。我只是想确信我的通知会到达我这里!
解决方案如果您在服务器上安装 Postfix,则可以使用 Gmail 帐户发送系统上的所有电子邮件。这种方法有一些缺点,但配置很简单,而且 Google 的电子邮件服务器非常可靠。此外,由于您自己不充当电子邮件服务器,因此您不必担心您的电子邮件被接收者拒绝。它确实来自 gmail.com。
第一个不幸的后果是,对于其最简单的实现,您需要启用“安全性较低的应用”才能登录您的 Gmail 帐户。我实际上为我的服务器设置了一个单独的 gmail.com 帐户,然后我就不用担心安全性较低的设置了。值得庆幸的是,如果这是一个问题,可以使用双因素身份验证(稍后详细介绍)。
其次,如果您使用 Gmail 作为您的电子邮件中继,则每封电子邮件都将被重写为“来自” gmail.com 地址。对我来说,这不是问题,因为我只是希望我的服务器在出现问题时可靠地给我发送电子邮件。因此,虽然这对许多服务器来说不是问题,但这肯定不是在您的服务器上提供多用户电子邮件的可行方法。您可以从您的 Linux 系统上的多个用户发送邮件,但发送的每封电子邮件都将重写其标头,使其来自同一地址!值得庆幸的是,只有“发件人”地址本身被重写,因此消息来自类似于“用户 1 <user@gmail.com>”和“用户 2 <user@gmail.com>”的地址。因此,即使底层地址不同,您仍然可以分辨出电子邮件消息来自哪个用户。这对我有用,因为它有助于确定哪个应用程序正在向我发送故障信息!
步骤首先,您需要安装 Postfix 以及启用 SASL 连接所需的工具。您的步骤将因发行版而异,但对于 Ubuntu/Debian 用户,它将类似于这样
sudo apt-get install postfix mailutils libsasl2-2
↪ca-certificates libsasl2-modules
当 Postfix 安装时,它会询问您要配置的系统类型。多个选项都可以工作,因为您稍后会编辑主文件,但我建议您选择“Internet 站点”并相应地回答问题。(同样,不要太担心您在设置对话框中输入哪些答案,大多数答案都将被您的修改覆盖。)
接下来,编辑 main.cf 文件
sudo nano /etc/postfix/main.cf
然后,在文件中的某个位置更改或添加以下信息段。请密切注意,因为会有一些行看起来相似,但略有不同。您可能需要添加以下所有行
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_use_tls = yes
现在您需要创建 cacert.pem 文件。您可以直接引用原始文件,但我喜欢将所有必需的文件放在一个文件夹中——这使得在启动新服务器时更容易复制
sudo cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem >
↪/etc/postfix/cacert.pem
为了发送邮件,您需要在服务器上拥有您的身份验证信息。从头开始创建文件
sudo nano /etc/postfix/sasl/sasl_passwd
输入您的 Gmail 帐户信息。将用户名和密码输入到文件中感觉不对,但您将在下一步中严格锁定文件的权限。在文件中使用此格式
[smtp.gmail.com]:587 USER@gmail.com:PASSWORD
USER
和 PASSWORD
显然需要替换为您的帐户凭据。您也可以使用 Google Hosted Domain 帐户,只需使用完整的电子邮件地址而不是 @gmail.com。然后保护文件并创建哈希数据库,以便 Postfix 可以正确读取它
sudo chmod 400 /etc/postfix/sasl/sasl_passwd
sudo postmap /etc/postfix/sasl/sasl_passwd
最后,重新加载 Postfix 并测试外发电子邮件
sudo service postfix reload
echo "It Worked" | mail -s "Email Test" anotheruser@example.com
故障排除
电子邮件很可能失败。如果您在日志文件中收到如下错误
SASL authentication failed; server smtp.gmail.com[1.2.3.4]
↪said: 534-5.7.14 Please log in via your web browser
↪and then try again.
最可能的原因是我之前提到的安全登录设置。就像我之前提到的,我对在我专门为中继电子邮件创建的帐户上这样做没有问题。但是,如果您使用的是您实际的电子邮件地址,我真的不建议这样做。
如果您仍然有兴趣降低安全性来解决此问题,请登录您的 Gmail 帐户并访问此处(图 1)。
图 1. “启用”不安全性似乎很奇怪。
您应该能够将此切换为“开启”,这将启用安全性较低的应用登录的能力。(启用“不安全”方法听起来有点违反直觉,但如果您仔细阅读,那就是您想要做的。)
进行更改后,再次尝试发送电子邮件,它应该会发送出去。原始电子邮件实际上也可能会发送出去,因为 Postfix 会不断尝试发送失败的消息。
如果您更喜欢更高的安全性对于 Postfix 电子邮件中继设置,我使用 Google 应用密码和双因素身份验证的結果好坏参半。我将此作为练习留给那些不想允许安全性较低的身份验证或已经在其帐户上使用双因素身份验证的人。(对于其管理员未启用“安全性较低的应用”功能的 Google Hosted Domain 用户来说,这可能是唯一的选择。)
第一步是在您的帐户上启用双因素身份验证。否则,您将无法生成应用密码。访问此处以启用和配置双因素身份验证。
然后,为您的服务器设置创建应用密码此处。
获得应用密码后,将其复制到您的 Postfix 身份验证文件中,以替换之前输入的密码。您还需要使用 postmap
命令重新创建密码映射。然后重新启动 Postfix,并尝试发送电子邮件。如果它不起作用,请检查您的日志文件并从那里开始进行故障排除。就像我说的那样,我的结果好坏参半。
如果您正在与您的 Gmail 帐户作斗争,或者只是不喜欢依赖 Google 中继您的信息,那么好消息是此过程适用于任何 SMTP 服务器。实际上,对于其他 SMTP 服务器,配置可能要简单得多。如果您有来自您的 ISP 的电子邮件帐户,您很可能可以通过调整上面的设置以匹配您的 ISP 的帐户信息来使用该帐户。我想我有一个 charter.net 电子邮件地址,我从来没有用它做过任何事情。我怀疑很多人都有类似的地址。
电子邮件可能是一种正在消亡的通信形式,但对于服务器通知之类的事情,它很难被击败。问题是,关于中继电子邮件的安全问题太多了,配置最古老的消息传递协议之一可能会令人沮丧地困难!
通常,当我设置新服务器时,我会快速安装 Postfix 并像这样使用 Chef 或 Puppet 方法配置它,以实现快速可靠的配置。如果您有更简单或不同的方法来在云服务器上启用电子邮件,请发送电子邮件至 shawn@linuxjournal.com 给我。我喜欢听取其他解决方案,我将在以后的刊物中与班上的其他同学分享任何真正出色的解决方案!