ActionMailer在Rails 4开发环境中无法发送邮件

48

为什么这个邮件程序没有发送任何邮件?(或者有任何调试的想法吗?)

在 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设置。 - jb_314
7
也许这是一个愚蠢的问题:你是否修改了config.action_mailer.perform_deliveries = true,因为默认情况下它设置为false,阻止从开发环境发送邮件... - Danny
2
不傻 @DannyVanHoof 因为那就是答案! 谢谢。 - Don P
5个回答

120

你应该添加

config.action_mailer.perform_deliveries = true

默认情况下,此项为假,防止从您的开发环境发送邮件...


5
我建议打开config.action_mailer.raise_delivery_errors = true,这样就不会忽略投递问题了。 - Ryan Romanchuk

13

对于不使用SMTP的人,将投递方式切换为sendmail有助于我,此外还需要明确设置执行投递:

对于未使用SMTP的用户,将投递方式切换为sendmail并明确设置执行投递,可以帮助我解决问题。

config.action_mailer.delivery_method = :sendmail

sendmail 在许多服务器上配置更快。特别适用于开发模式。 - Jerome
我只想补充一点,对于我而言,在Rails 5中切换到:sendmail是唯一可行的选择。 - Dog

9
如果您在控制台发送电子邮件时遇到问题,您需要在邮件上调用deliver方法。
MyMailer.create_email.deliver

那个语句对我来说没有意义。你可以在控制台中进行该调用。 - dtc
在Rails控制台中仅仅调用你的方法并不能真正地发送邮件。你需要在Mailer方法返回的邮件对象上调用deliver方法。 - Michael Brawn
1
我的错误,我不知道有一个create_email方法,但在最新的Rails中(而且已经有一段时间了,我假设),MyMailer.deliver应该足够了。你可以在控制台或应用程序中执行此操作。 - dtc

3
所有这些答案都很棒,但在调试的情况下,还有另一个可能会让你受伤的地方。
development.rb中确保您设置了config.action_mailer.raise_delivery_errors = true 如果您的.deliver方法似乎没有任何问题,但实际上您从未通过电子邮件收到邮件,则您的传递方法可能会抛出异常并且Rails正在吞噬错误。 如果您只是简单地遇到了诸如配置不正确的凭据或AWS访问被拒绝API错误之类的问题,那么请不要过多地纠结,确保您已经打开了raise_delivery_errors。 这些错误想要告诉你什么,但它们不能。

0

我已经弄清楚了。在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中。这样,您就可以在config/environments/test.rb中放置ActionMailer::Base.delivery_method = :test,并在config/environments/development.rb中放置所需版本。我将development.rb设置为:test,因为我使用Faker填充了我的数据库,并将其更改为:smtp,以确保发送了真实电子邮件作为额外检查。

注意:您必须重新启动服务器才能使这些更改生效。

另一个注意事项:Heroku当前的SendGrid说明(https://devcenter.heroku.com/articles/sendgrid)将SendGrid Heroku配置代码放在一个新的config/initializers/mail.rb文件中,这可能需要删除其最后一行并将所需版本放置在每个config/environments/[production.rb,development.rb,test.rb]中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接