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?