Hartl Ruby on Rails教程 - Sendgrid不会在生产中发送电子邮件

时间:2017-01-29 21:10:51

标签: ruby-on-rails railstutorial.org

更新: 我通过heroku的网站实际访问我的应用程序发送电子邮件,但是当我从cloud9 ide中的生产服务器运行应用程序时,它仍然失败。这是正常的吗?这是教程要我这样做的方式吗?

在Michael Hartl的Ruby on Rails教程的第11章中,系统会要求您在部署模式下注册示例应用程序,并使用您控制的电子邮件,并检查您的电子邮件帐户是否有帐户激活电子邮件。我没有收到任何电子邮件和heroku报告的sendgrid插件没有发送电子邮件请求。但是,在cloud 9 ide puma服务器控制台中,它报告电子邮件以正确的格式发送到正确的地址,我可以从控制台检索激活令牌和电子邮件地址。我不确定我做错了什么。希望所有相关代码都包含在下面。请帮忙。

我实际上去了示例应用程序网站并点击注册然后等待电子邮件。这不是Hartl通过“注册生产中的新账户”的意思吗?

配置/ environment.rb中:

# Load the Rails application.
require_relative 'application'

# Initialize the Rails application.
Rails.application.initialize!

#Sendgrid configurations from their website
ActionMailer::Base.smtp_settings = {
  :user_name =>ENV['SENDGRID_USERNAME'],
  :password  =>ENV['SENDGRID_PASSWORD'],
  :domain    => 'heroku.com',
  :address   => 'smtp.sendgrid.net',
  :port      => 587,
  :authentication => :plain,
  :enable_starttls_auto => true
}

寄件人/ application_mailer:

class ApplicationMailer < ActionMailer::Base
  default from: 'noreply@example.com'
  layout 'mailer'
end

环境/ production.rb:

 config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = 'gentle-lake-88943.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }

users_controller.rb:

 def create
    @user = User.new(user_params)
    if @user.save
      @user.send_activation_email
      flash[:info] = "Please check your email to activate your account"
      redirect_to root_url
    else 
      render 'new'
    end
  end

user.rb:

 def activate
    update_columns(activated: true, activated_at: Time.zone.now)
  end

  def send_activation_email
    UserMailer.account_activation(self).deliver_now
  end

routes.rb中:

 resources :account_activations, only: [:edit]

1 个答案:

答案 0 :(得分:0)

我刚解决了本教程的问题。我最初的问题是我没有正确写出变量名。我查看了我的代码并修复了它。正如教程所说,我的应用现在工作正常。

正如Igor在他的最后一句话中所说,你在config / environments.rb中不需要任何特殊的代码,所以如果你保留它就应该删除它。

使用heroku run printenv检查Heroku中的环境变量。如果这些是正确的,请尝试BAD方式,就像测试一样:用sendgrid的用户名和密码替换ENV['SENDGRID_xxx']

Thanks to Nathan Road