Ruby on Rails 中的 Sendgrid / 电子邮件发送问题(托管在 Heroku 上)

Posted

技术标签:

【中文标题】Ruby on Rails 中的 Sendgrid / 电子邮件发送问题(托管在 Heroku 上)【英文标题】:Sendgrid / email sending issues in Ruby on Rails (hosted on Heroku) 【发布时间】:2012-02-05 15:00:05 【问题描述】:

我无法让 sendgrid 在使用 authlogic 进行身份验证并部署在 heroku 上的 rails 3.1 应用程序上成功发送电子邮件。我在 config/environments/[development.rb 和 production.rb] 上有以下动作邮件配置:

config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options =  :host => 'localhost:3000' 
config.action_mailer.default_charset = "utf-8"
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = 
  :address => 'smtp.sendgrid.net',
  :port => 587,
  :domain => ENV['SENDGRID_DOMAIN'],
  :user_name =>  ENV['SENDGRID_USERNAME'],
  :password => ENV['SENDGRID_PASSWORD'],
  :authentication => 'plain',
  :enable_starttls_auto => true

对于production.rb,上面的代码除了

之外都是一样的


    config.action_mailer.default_url_options =  :host => [app name in heroku] 

当我在开发模式下运行时,我收到以下错误报告:


    Completed 500 Internal Server Error in 21740ms
    Net::SMTPFatalError (550 Cannot receive from specified address notification@[app-domain]: Unauthenticated senders not allowed
):

我现在真的不知道如何设置它以使其正常工作。有没有在 heroku 和 rails 上设置 sendgrid 的经验的人知道发生了什么?

非常感谢。你们是最棒的!!!

【问题讨论】:

【参考方案1】:

我为此花了半天的时间,终于让我的工作现在开始了。非常沮丧,因为它是由于糟糕的文档错误。顺便说一下,我正在 Heroku 上运行 Rails 3.1 和 Cedar 堆栈。

所以http://devcenter.heroku.com/articles/sendgrid 会告诉您将 SMTP 设置内容放在 config/initializers/mail.rb 中。但是...在http://docs.sendgrid.com/documentation/get-started/integrate/examples/rails-example-using-smtp/ 上,它说将所有 SMTP 设置内容放在 config/environment.rb 而不是 config/initializers/mail.rb

因此解决方案是将其放入您的 environment.rb 文件中。这就是我的 environment.rb 的外观:

# Load the rails application
require File.expand_path('../application', __FILE__)

# Initialize the rails application
Freelanceful::Application.initialize!

# Configuration for using SendGrid on Heroku
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = 
  :user_name => "yourSendGridusernameyougetfromheroku",
  :password => "yourSendGridpasswordyougetfromheroku",
  :domain => "staging.freelanceful.com",
  :address => "smtp.sendgrid.net",
  :port => 587,
  :authentication => :plain,
  :enable_starttls_auto => true

要获取您的 SendGrid 用户名和密码,请键入

$ heroku config -long

希望对这个头痛的未来有帮助.. 和更多的人。

【讨论】:

我不知道为什么,但我必须在mail.rb中进行配置。 staging.rb 对我不起作用。我在 Heroku + Devise 2.0 + sendgrid 上运行 Rails 3.1 + Cedar 堆栈。 对不起,那是我的错误。那是一个配置问题。 Heroku 中的 RACK_ENV 和 RAILS_ENV 是“生产”,但我编辑了 config/environments/staging.rb。 首先不要直接使用密码和用户名。使用环境变量,这就是它们的用途。第二:初始化程序或 env 文件中的无关紧要。环境文件最终会加载初始化程序文件。命名也无所谓。 我也遇到了这个问题,感谢 Heroku 的文档。但是,您可以将 SMTP 设置保留在 config/initializers/mail.rb 中,只要您不将 ActionMailer::Base.delivery_method = :smtp 放在 mail.rb 中即可。 别忘了像我一样在 Heroku 上实际设置环境变量。 heroku 配置:添加 SENDGRID_USERNAME=foo 和 heroku 配置:添加 SENDGRID_PASSWORD=bar【参考方案2】:

我假设您的意思是本地开发模式?如果是这样,我认为 SendGrid 插件不允许您从 Heroku 网络外部发送电子邮件(因为他们有独立帐户,他们希望您使用)。

也就是说,使用 SendGrid 插件时,您无需在生产环境中配置邮件,因为它会在您部署应用程序时自动为您配置。

因此,您可以删除您的 config.action_mailer.smtp_settings 代码并在开发中使用默认设置。

【讨论】:

好吧,我注释掉了 production.rb 中的 smtp_settings,根据 heroku 日志,我收到了连接被拒绝错误。 Errno::ECONNREFUSED(连接被拒绝 - connect(2)):我应该将 sendgrid 作为 gem 包含在 Gemfile 中吗? 不,您应该只需要将插件添加到应用程序中,然后进行部署。 @NeilMiddleton Heroku 文档确实声明您应该在 Cedar 堆栈上添加 smtp_settings。如果它是 Aspen 或 Bamboo,你应该可以忽略它。 Sendgrid Usage on Heroku【参考方案3】:

另外请注意,如果您在 Bamboo 堆栈上运行 Heroku 应用程序,则无需在 environment.rb 文件中配置您的设置,因为 Heroku 会为您完成。

但是,在将应用程序激活到 Heroku 后,您确实需要至少执行一次 git push 来设置这些设置。我今天早上犯了那个错误,找到了你的帖子。

【讨论】:

以上是关于Ruby on Rails 中的 Sendgrid / 电子邮件发送问题(托管在 Heroku 上)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails - Ruby 中的 KeyCode [关闭]

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Ruby on Rails 中的 Runner

ruby on rails 中的 Coffeescript 编译错误

Cpanel 中的 Ruby On Rails 问题

覆盖Ruby on Rails中的保存