如何在Laravel中设置SMTP中继
了解如何在Laravel中设置SMTP中继,包括逐步的.env配置、测试技巧和事务API替代方案。
什么是SMTP中继,为什么在Laravel中使用它
SMTP中继是一个第三方服务,它接受来自您应用程序的外发邮件,并代表您将其转发到收件人的收件箱。Laravel内置的mail()发送,或者您服务器上的本地Postfix安装,技术上也可以发送电子邮件。但它通常会被标记为垃圾邮件。快速。这篇文章将介绍如何在Laravel中设置SMTP中继,以便您的事务性消息实际上能够到达收件箱,而不是垃圾邮件文件夹。
问题在于声誉。一个共享主机IP,其他数十个应用程序也从中发送,没有与Gmail、Outlook或Yahoo的历史记录。垃圾邮件过滤器在决定消息是进入收件箱还是垃圾邮件文件夹之前,会查看发件人的声誉、认证记录和发送量。像Mailgun、SendGrid或Postmark这样的中继提供商已经建立了这种声誉,并且它管理重试、退信处理和IP预热,因此您不必自己编写这些逻辑。
每当应用程序发送任何事务性内容时,中继比本地邮件服务器更受欢迎:密码重置、发票、订单确认、注册验证链接。营销发送也有好处,但事务性电子邮件是一个类别,其中错过的投递会直接破坏用户流程——没有人会重置他们的密码两次。如果您想更全面地了解收件箱投递情况,这份关于电子邮件投递最佳实践的指南更深入地涵盖了声誉评分。
开始之前的先决条件
在接触任何配置文件之前,先收集一份简短的清单。跳过这一步是设置拖延一个下午而不是十分钟的最常见原因。
- 一个正常工作的Laravel安装(Laravel 8到11都使用相同的邮件配置结构)。
- 访问项目的
.env文件,无论是在本地还是在已部署的服务器上。 - 一个SMTP中继提供商的账户——Mailgun、SendGrid、Postmark、Amazon SES或类似服务。
- 中继凭据:SMTP主机、端口、用户名和密码(或用作密码的API密钥)。
- 提供商那边的已验证发送域,以便外发邮件在离开之前不会被拒绝。
大多数提供商在其仪表板的“SMTP”或“集成”部分直接显示这些凭据。将它们复制到安全的地方。您将需要每个字段。
Laravel SMTP 配置 — 步骤设置
Laravel 将邮件配置分为两个文件:config/mail.php,该文件定义了每个邮件发送器的结构,以及.env,该文件保存实际值。您几乎不需要直接编辑config/mail.php — 默认值已经从环境变量中读取。如果您从未这样做过,学习如何在 Laravel 中设置 SMTP 中继实际上只是填入正确的环境变量并按正确的顺序进行。
- 打开您的
.env文件并设置MAIL_MAILER=smtp。这告诉 Laravel 使用 SMTP 传输,而不是log、sendmail或 API 驱动程序。 - 将
MAIL_HOST设置为中继的 SMTP 服务器地址,例如smtp.mailgun.org或smtp.sendgrid.net。 - 设置
MAIL_PORT。常见值为 587(用于 TLS)、465(用于 SSL)或 2525(当 587 被阻止时的后备)。 - 将
MAIL_USERNAME和MAIL_PASSWORD设置为您的提供商发放的凭据。对于某些提供商,“用户名”字面上就是单词apikey,密码是您的实际 API 密钥。 - 将
MAIL_ENCRYPTION设置为tls,在大多数情况下。只有在提供商明确表示端口 25 不加密时,才将其留空。 - 设置
MAIL_FROM_ADDRESS和MAIL_FROM_NAME。这些控制默认的“发件人”头部,它们应该与您已验证的域名匹配。 - 保存后运行
php artisan config:clear。Laravel 会积极缓存配置,过时的值是新设置在第一次尝试时“无法工作”的主要原因。
填写后的典型块如下所示:
| 变量 | 示例值 | 目的 |
|---|---|---|
| MAIL_MAILER | smtp | 选择传输驱动程序 |
| MAIL_HOST | smtp.mailgun.org | 中继服务器地址 |
| MAIL_PORT | 587 | 连接端口 |
| MAIL_ENCRYPTION | tls | 加密 SMTP 会话 |
| MAIL_USERNAME | postmaster@yourdomain.com | 中继账户标识符 |
| MAIL_PASSWORD | your-api-key | 中继身份验证密钥 |
这里没有什么特别的。主要是复制粘贴,错误通常来自于端口和加密组合不匹配,而不是拼写错误。
在 Laravel 中测试您的 SMTP 中继连接
在实际邮件到达之前,永远不要相信配置更改。测试一下。
- 使用
php artisan tinker打开 Tinker 会话。 - 运行
Mail::raw('来自 Laravel SMTP 中继的测试消息', function ($message) { $message->to('you@example.com')->subject('SMTP 测试'); });. - 在一两分钟内检查您的收件箱——以及您的垃圾邮件文件夹,以防万一。
- 如果没有任何内容到达,请检查
storage/logs/laravel.log以获取提供商返回的实际 SMTP 错误。 - 将结果与您提供商的仪表板进行交叉检查,仪表板通常会记录每次尝试发送的状态。
两个错误不断出现。连接超时通常意味着端口被您的托管提供商或防火墙阻塞,这在便宜的 VPS 计划中很常见,默认情况下阻止出站端口 25。身份验证失败几乎总是意味着用户名和密码被调换,或者 API 密钥后面粘贴了空格。如果您想要一种更系统的方法来验证可送达性,而不仅仅是单次测试发送,有专门的 电子邮件可送达性测试工具 可以在一次检查中检查垃圾邮件评分、身份验证和内容标志。
Laravel 事务电子邮件 API — SMTP 的替代方案
SMTP 不是唯一的选择。每个主要的中继提供商也提供 REST API,Laravel 对大多数提供商都有官方或社区驱动程序包 — Mailgun、SendGrid、Postmark 和 SES 都是这样工作的。
API 路由完全跳过 SMTP 握手。您的应用程序不是打开套接字连接、进行身份验证并逐行传输消息,而是发出一个带有电子邮件有效负载的单个 HTTPS POST 请求,负载以 JSON 附加。这很重要,因为许多托管环境会阻止或限制 SMTP 端口,而端口 443 几乎从不被阻塞。对于高流量的事务应用程序,API 发送通常也更快,因为每条消息不需要协商持久连接。
设置因提供商而异,但模式是一致的:
- 通过 Composer 安装提供商的 Laravel 包,例如
composer require symfony/mailgun-mailer symfony/http-client用于 Mailgun。 - 在
.env中设置MAIL_MAILER=mailgun(或等效的驱动程序名称)。 - 将 API 密钥和域名作为环境变量添加,遵循驱动程序期望的特定键。
- 清除配置缓存,并以与 SMTP 相同的方式发送测试消息。
SMTP 仍然有其存在的价值——它是通用的,无论提供商如何,它的工作方式都是一样的,这在你更换中继时非常方便。构建在 Laravel 之外的团队会遇到相同的端口阻塞问题;在这篇针对 Node.js 应用的 SMTP 中继指南 中的推理在概念上同样适用,尽管代码有所不同。
保护您的 SMTP 凭据
将 SMTP 密码和 API 密钥视为生产数据库凭据。因为它们本质上就是这样。
- 绝不要将
.env提交到版本控制中。确认它已列在.gitignore中——在 Laravel 中默认是这样,但在任何框架升级后请再次检查。 - 为暂存和生产使用不同的凭据。泄露的暂存密钥不应能够从您的生产域发送邮件。
- 定期轮换 API 密钥,特别是在团队成员离开或笔记本电脑丢失后。大多数提供商允许您生成新的密钥
并在不造成停机的情况下禁用旧密钥。
如果您的提供商支持 IP 白名单,请限制访问实际发送邮件的服务器。将其与云和部署工具中的最小权限访问结合使用,以便只有应用程序环境可以读取邮件机密。
排查常见的 SMTP 中继问题
即使一切配置正确,邮件投递仍可能因 Laravel 之外的原因而失败。当发生这种情况时,系统地解决问题:
- 验证您的环境文件中的主机名、端口、加密设置、用户名和密码。
- 检查您的提供商是否需要经过验证的发件人域或特定的发件地址。
- 确保您的服务器防火墙或托管提供商允许出站 SMTP 流量。
- 检查提供商的活动日志以查找拒绝消息、速率限制或身份验证失败。
- 从 Laravel Tinker 或简单路由发送测试消息,以将问题与应用程序的其余部分隔离。
如果消息被接受但从未到达,问题可能在于可投递性而非投递。在这种情况下,请检查您的 SPF、DKIM 和 DMARC 设置,并确认您的 DNS 记录与您使用的 SMTP 服务匹配。
最终思考
在 Laravel 中设置 SMTP 中继主要是使用正确的凭据,选择可靠的提供商,并保持配置的清晰和安全。一旦它正常工作,您将获得比基本邮件服务器更好的可投递性、可见性和控制。
有了可靠的中继,您的应用程序可以在开发、预发布和生产环境中稳定地发送邮件,而无需不必要的麻烦。
在此页面
← 所有文章一键操作。它告诉我们接下来该写什么。
尚无评分 — 您的将是第一条。
评论
评论在显示之前会被阅读。