ActionMailer 在开发 Rails 4 中不发送邮件
Posted
技术标签:
【中文标题】ActionMailer 在开发 Rails 4 中不发送邮件【英文标题】:ActionMailer not sending mail in development Rails 4 【发布时间】:2014-01-13 05:01:52 【问题描述】:为什么这个邮件程序不发送任何邮件? (或者有什么调试的想法?)
在 my_app/config/environments/development.rb 我有这个代码:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings =
address: 'smtp.gmail.com',
port: 587,
domain: 'my_app.com',
user_name: ENV['GMAIL_USERNAME'],
password: ENV['GMAIL_PASSWORD'],
authentication: 'plain',
enable_starttls_auto: true
然后在我的本地计算机上 ~/.bash_profile 我有这个代码:
export GMAIL_USERNAME='blah@my_app.com'
export GMAIL_PASSWORD='***'
当我在终端中运行$ env
时,我看到两个环境变量都已正确设置。
我还重新启动了我的 Rails 服务器。
【问题讨论】:
在:test
或:file
交付模式下是否按预期工作?这会将问题隔离到您的 smtp 设置。
也许是个愚蠢的问题:您是否更改了 config.action_mailer.perform_deliveries = true,因为默认情况下此设置为 false,从而阻止从您的开发环境发送邮件...
一点也不傻@DannyVanHoof 因为就是这样!谢谢。
【参考方案1】:
你应该添加
config.action_mailer.perform_deliveries = true
默认设置为 false,阻止从您的开发环境发送邮件...
【讨论】:
我建议开启config.action_mailer.raise_delivery_errors = true
,这样配送问题就不会被吞没。【参考方案2】:
对于不使用 smtp 的任何人,除了明确设置要执行的交付之外,将交付方式切换为 sendmail 对我有帮助:
config.action_mailer.delivery_method = :sendmail
【讨论】:
sendmail 在许多服务器上的配置速度更快。对于开发模式特别有用。 我只是想在 Rails 5 中为我添加,切换到 :sendmail 是唯一可行的方法【参考方案3】:如果您在从控制台发送电子邮件时遇到问题,您必须在您的邮件上调用传递方法。
MyMailer.create_email.deliver
【讨论】:
那句话对我来说没有意义。您可以在控制台中进行调用。 在 Rails 控制台中,仅调用您的方法实际上不会传递邮件。您需要在 Mailer 方法返回的邮件对象上调用deliver
方法。
我的错误,我不知道有一个 create_email 方法,但在最新的 Rails 中(我假设现在有一段时间),MyMailer.deliver
应该足够了。您可以在控制台或应用程序中执行此操作【参考方案4】:
所以我想通了。在config/environment.rb
中设置ActionMailer::Base.delivery_method = :smtp
行会覆盖config/environments/test.rb
中的ActionMailer::Base.delivery_method = :test
。
所以,从config/environment.rb
中删除那行ActionMailer::Base.delivery_method = :smtp
并将其放入config/environments/production.rb
。这使您可以将ActionMailer::Base.delivery_method = :test
放在config/environments/test.rb
中,并将您想要的版本放在config/environments/development.rb
中。当我使用 Faker 填充我的数据库并将其更改为 :smtp
时,我创建了 development.rb
:test
,因此我确定发送了真实的电子邮件作为附加检查。
注意:您必须重新启动服务器才能使这些更改生效。
另一个注意事项:Heroku 当前的 SendGrid 指令 (https://devcenter.heroku.com/articles/sendgrid) 将 SendGrid Heroku 配置代码放在一个新的 config/initializers/mail.rb
文件中,这可能需要删除其最后一行并将所需的版本放置在每个 config/environments/[production.rb, development.rb, test.rb]
中
【讨论】:
【参考方案5】:所有这些答案都很棒,但还有另一个地方可能会让您感到困惑,尤其是在调试的情况下。
在development.rb
中确保设置config.action_mailer.raise_delivery_errors = true
如果您的 .deliver
方法似乎可以正常工作,但您实际上从未通过网络收到电子邮件,则您的传递方法可能会引发异常,并且 rails 正在吞噬错误。如果您只是简单地遇到配置错误的凭证或 aws access denied API 错误,那么这是非常正确的。保存撕掉你的头发,并确保你打开了raise_delivery_errors
。它想告诉你一些事情,但不能。
【讨论】:
以上是关于ActionMailer 在开发 Rails 4 中不发送邮件的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 ActionMailer - 如何在使用 Deliver_later 时捕获连接和 SMTP 错误
Rails 4, RSpec 3.2 - 如何模拟 ActionMailer 的 Deliver_now 方法来引发异常
在 Rails3 / ActionMailer 中设置 Message-ID 邮件头