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 邮件头

在开发环境中使用 Rails 3 发送邮件

Rails - 你如何测试 ActionMailer 在测试中发送了特定的电子邮件

通过电子邮件发送ActionMailer中的当前用户 - Rails 5