Laravel 密码重置电子邮件未在 Heroku 上使用 gmail 发送
Posted
技术标签:
【中文标题】Laravel 密码重置电子邮件未在 Heroku 上使用 gmail 发送【英文标题】:Laravel password reset email not sending using gmail on Heroku 【发布时间】:2019-08-09 22:59:04 【问题描述】:我目前在使用make:auth in Laravel 5.6
创建的密码重置邮件时遇到问题。我的应用程序托管在 Heroku 上。在我当地的环境中,一切正常。我在 Heroku 的配置变量中设置了正确的值,在我的本地 .env
文件中相同:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=myMail@gmail.com
MAIL_PASSWORD=bla
MAIL_ENCRYPTION=tls
我在这里读到我必须对 app/mail.php
中的值进行硬编码,而不是引用 .env
文件,因为 Heroku 无法识别/理解此引用
'password' => env('MAIL_PASSWORD')
但是我的数据将在 GitHub 存储库中可见。
我在这里做错了什么?
编辑:
公认的答案是要走的路,应该使用附加组件在 Heroku 中发送邮件。在设置 sendgrid 之后,我仍然找到了一种让它与 gmail 一起使用的方法;)
- Use `Port 465 with ssl` as encryption.
- Allow `less secure apps` access to my account.
- Visit `http://www.google.com/accounts/DisplayUnlockCaptcha` and sign in with your Gmail username and password.
在这些步骤之后,它起作用了。 也许这对其他人有帮助。
EDIT2:
我将 Laravel 从 5.x 版迁移到 8 版,但又遇到了问题,所以我不得不再次使用 gmail 改变我的方法。
我不得不:
- Allow `less secure apps` access to my account.
- Enable two step verification and create an App Password like in the accepted answer of this question: https://***.com/questions/42558903/expected-response-code-250-but-got-code-535-with-message-535-5-7-8-username
- Change Port back to 587 and tls again
- Visit `http://www.google.com/accounts/DisplayUnlockCaptcha` and sign in with your Gmail username and password.
【问题讨论】:
使用 getenv('ENV_VARIABLE') 可能会对您有所帮助。 您的解决方案有效,只需更改端口和加密类型。谢谢! 【参考方案1】:请勿在生产环境中使用 Gmail¹。
Gmail 并非旨在充当您的应用程序的 SMTP 网关。相反,请使用 Heroku 推荐的众多 mail addons 之一。 Mailgun 和 SendGrid 都是非常受欢迎的选项,但还有很多其他选项。
这些工具旨在为应用程序发送邮件。他们拒绝您的邮件的可能性要小得多,并且如果配置得当,您的邮件被垃圾邮件过滤器捕获的可能性就会大大降低。他们中的大多数都有设置的演练,我鼓励你遵循它们。确保不要跳过SPF 和DKIM 反垃圾邮件功能。
我在这里读到我必须对
app/mail.php
中的值进行硬编码,而不是引用.env
文件,因为 Heroku 无法识别/理解此引用'password' => env('MAIL_PASSWORD')
这是不正确的。
您说您在 Heroku 上设置了配置变量,并填充了环境。 .env
文件只是一个方便的本地解决方法来做同样的事情。无论您选择哪个邮件插件,都会自动为您设置一个或多个环境变量,您应该在代码中使用这些环境变量。
¹您可能也不应该在 开发 中使用它,但这不是问题。我强烈建议您改用 Mailtrap(云)或 Mailcatcher(本地)之类的东西。
【讨论】:
感谢您的帮助。我只想将 gmail 用于密码重置链接。我不明白为什么它不起作用?我看了一下mailgun,如果我想向任何人发送邮件,我必须提供我的信用卡凭证。这不是很方便。这是正常的吗?我理解它背后的垃圾邮件保护思想,但仍然 它不起作用,因为这不是它的设计目的。为了防止人们使用他们的 SMTP 服务器发送垃圾邮件,谷歌几乎肯定会检测到来自流行云主机(如运行在 AWS 上的 Heroku)的请求并拒绝处理它们。设置 Sendgrid 非常简单,如果您只是将它用于偶尔的密码重置链接,您可能会接受他们的免费计划。如果您不想使用这两种服务中的任何一种,您可以随意寻找另一种旨在为应用程序(而非人员)提供电子邮件的服务。但不要使用 Gmail 或类似的东西。 有道理,谢谢!它看起来很容易是的。那么 Laravel 会在设置好并添加 config vars/api 键后自动使用 sendgrid 吗?我是否必须更改我的任何 php 代码或做其他事情? 我不完全确定您需要更改什么,但从 Gmail 切换到 Sendgrid 或 Mailgun 之类的东西绝对是解决方案。有appear to be lots of options supported natively by Laravel 和SendGrid support looks relatively straightforward, too。如果您在实施过程中遇到困难,请随时回来询问有关问题的具体问题,最好提供您尝试过的代码。以上是关于Laravel 密码重置电子邮件未在 Heroku 上使用 gmail 发送的主要内容,如果未能解决你的问题,请参考以下文章