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

时间:2010-11-30 11:23:46

标签: ruby-on-rails ruby-on-rails-3 actionmailer

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

我只需要在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详细信息),目前在自己的初始化配置/ initialisers / setup_mail.rb

我还尝试过几个不同的smtp服务器,包括Gmail和Sendgrid,相应地调整smtp设置,但仍然没有。我可以在终端和开发日志中看到邮件,就是这样。

有没有人知道我可能错过的任何其他问题,需要设置ActionMailer才能工作?如果没有这种方法可以获得有关邮件未被发送的原因的更多信息?我有

config.action_mailer.raise_delivery_errors = true

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

为了它的价值,我正在使用Ubuntu 10.04笔记本电脑进行开发,以防万一需要任何特定的设置。

非常感谢

8 个答案:

答案 0 :(得分:55)

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

解决方案是在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

就像我说的,不知道为什么,但这似乎可以解决问题。谢谢所有指针

答案 1 :(得分:27)

我在config/environments/development.rb

中有以下内容
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

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

希望这会有所帮助:)

答案 2 :(得分:6)

尝试使用'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
}

答案 3 :(得分:3)

三件事。

首先,端口是一个整数,不需要引号,如第一个示例所示。 (但我认为字符串应该仍然有用。)

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

config.action_mailer.raise_delivery_errors = true

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

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

答案 4 :(得分:1)

将所有配置放入: 配置/环境/ 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

它对我有用。

答案 5 :(得分:1)

ActionMailer::Base.delivery_method = :sendmail

config.action_mailer.perform_deliveries = true

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

答案 6 :(得分:0)

此外,您的gmail用户名不是别名。

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

答案 7 :(得分:0)

我的两个便士值得:

我在Rails 5.1中遇到了完全相同的症状:没有发生任何事情,我的development.rb文件中的设置完全被忽略了......

然后我记得重新启动机器!(这解决了这个问题)

之前的几条评论已经指出了这一点。

然而,问题很棘手,因为您不期望这种行为。在我看来,development.rb中的默认评论在这方面具有误导性:

# 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*.