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

Posted

技术标签:

【中文标题】在开发环境中使用 Rails 3 发送邮件【英文标题】:Sending mail with Rails 3 in development environment 【发布时间】:2011-05-17 19:46:51 【问题描述】:

我确信这已经被问过一百万次了,但我找不到任何适合我的东西,所以我再问一次!

我只需要一种在 Rails 3 中使用 ActionMailer 发送电子邮件的方法。我已经学习了许多教程,包括关于新 ActionMailer 的 Railscasts 教程,我可以看到正在生成的邮件,但我没有收到它们。

我尝试了很多不同的方法,但它们通常相当于配置以下设置

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = 
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true

我已经在我的 config/environment.rb、config/environments/development.rb 中尝试了上面的代码(当然还有有效的 gmail 详细信息),并且目前在它自己的初始化程序 config/initialisers/setup_mail.rb 中有它

我还尝试了一些不同的 smtp 服务器,包括 Gmail 和 Sendgrid,相应地调整了 smtp 设置,但仍然没有。我可以在终端中看到邮件和开发日志,仅此而已。

有没有人知道我可能遗漏的任何其他问题需要设置才能使 ActionMailer 工作?如果做不到这一点,是否有办法获取有关邮件未发送原因的更多信息?我有

config.action_mailer.raise_delivery_errors = true

在我的 config/development.rb 中设置,但开发日志仍然显示与我在终端中看到的相同。

无论如何,我正在一台 Ubuntu 10.04 笔记本电脑上进行开发,以防万一需要任何特定设置。

非常感谢

【问题讨论】:

您可以尝试从设置中删除 :domain 或将其更改为其他域。 【参考方案1】:

好吧,我已经解决了这个问题,但我不知道为什么这个方法有效而其他方法无效。

解决方案是在 config/initialisers/setup_mail.rb 中创建一个包含以下内容的初始化程序

if Rails.env != 'test'
  email_settings = YAML::load(File.open("#Rails.root.to_s/config/email.yml"))
  ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil?
end

然后我添加了包含开发和生产电子邮件帐户详细信息的 config/email.yml

development:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true
production:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true

就像我说的,不知道为什么,但这似乎起到了作用。谢谢大家的指点

【讨论】:

这行得通,没有别的。很困惑为什么它有效,但谢谢。数小时的谷歌搜索已经结束。我本来应该来这里的。 我四处寻找一个好的解决方案,这正是我应该做的。谢谢!【参考方案2】:

我在config/environments/development.rb中有以下内容

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

实际的邮件配置,config.actionmailer.* 我已经放在config\application.rb

希望这会有所帮助:)

【讨论】:

谢谢大家,不幸的是他们都已经在那里了。谢谢你的建议 在这种情况下,您应该会收到错误,为什么它不起作用。对吗? 嗨 nathanvda,对不起,我才看到你的评论。部分问题是我没有收到任何错误。我已经在下面发布了我是如何解决这个问题的,但老实说,我看不出有任何理由说明为什么下面的方法应该有效,而其他方法都没有。 perform_deliveries 做到了——你还需要重启服务器【参考方案3】:

尝试使用“sendmail”而不是“smtp”。

ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = 
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true

【讨论】:

感谢您的建议。不幸的是,我刚刚尝试过,我得到了与 sendmail 完全相同的行为【参考方案4】:

三件事。

首先,端口是一个整数,不需要引号,就像您的第一个示例一样。 (但我认为字符串应该仍然有效。)

其次,每次修改此(或任何)初始化程序文件时不要忘记重新启动服务器。这可以解释为什么您在添加后没有看到错误:

config.action_mailer.raise_delivery_errors = true

如果没有该错误消息,就很难确定为什么邮件没有发送,但现在却发送了。一种可能是您在密码周围使用双引号。如果您使用的是强密码并且您的密码中有一个未转义的令牌,则它可能会被重新解释。 (即"P@ssw\0rd" 将变为P@s-s-rd)。正是因为这个原因,我总是在我的代码中使用单引号,除非我特别需要语法糖。

最后,enable_starttls_auto: true 是默认值,是不必要的。

【讨论】:

【参考方案5】:

ActionMailer::Base.delivery_method = :sendmailconfig.action_mailer.perform_deliveries = true

是让我解决这个问题的两个必要步骤

【讨论】:

【参考方案6】:

只需将所有配置放入: config/environments/development.rb

我是说

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = 
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

它对我有用。

【讨论】:

【参考方案7】:

此外,您的 gmail 用户名没有别名。

参考:https://support.google.com/mail/answer/12096?hl=en

【讨论】:

【参考方案8】:

我的两便士值:

我在使用 Rails 5.1 时遇到了完全相同的症状:什么也没发生,我的 development.rb 文件中的设置被完全忽略了...

然后我记得重启机器!(神奇地解决了问题)

之前的几位 cmets 已经指出了这一点。

但是,这个问题很棘手,因为您不希望出现这种行为。在我看来,development.rb 中的默认 cmets 在这方面具有误导性:

# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since *you don't have to restart the web server when you make code changes*.

【讨论】:

以上是关于在开发环境中使用 Rails 3 发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 应用程序发送电子邮件时的 Net::SMTPAuthenticationError(在暂存环境中)

Rails 4.2 - Sidekiq 在开发中不发送电子邮件

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

我们可以在 rails 3.0 中使用 mailchimp 发送用户通知电子邮件吗

Heroku 环境中的 Ruby on Rails 应用程序:“使用 Mailgun 发送电子邮件”错误

在 Rails 3 中发送时事通讯