Gmail SMTP:Net :: SMTPAuthenticationError(需要530-5.5.1身份验证。请点击此处了解详情

时间:2017-07-02 16:07:13

标签: ruby-on-rails email heroku smtp gmail

我正在尝试在将简历文件上传到职位发布时发送通知电子邮件。我正在尝试在生产中使用Gmail SMTP,但我一直在Heroku日志中收到这些错误消息:

Completed 500 Internal Server Error in 505ms (ActiveRecord: 11.3ms)

Net::SMTPAuthenticationError (530-5.5.1 Authentication Required. Learn more at

一切都在Development.rb中完美运行,我无法弄清楚为什么它在生产中不起作用。

这是我的控制器:请参阅'创建'

class ResumesController < ApplicationController
  helper_method :count

    def new
    @resume = Resume.new
    @post = Post.find(params[:post_id])
  end

    def create
    @resume = Resume.new(resume_params)
    @resume.user_id = current_user.id
    @resume.post_id = params[:post_id]
    if @resume.save 

      ResumeMailer.resume_received(@resume).deliver_now

      current_user.credits = current_user.credits + 1
      current_user.save!
      flash[:success] = "Congratulations! Your Candidate has been submitted and 1 Credit has been added to your account!"
      redirect_to :root
    end
  end

  def show
    resume = Resume.find(params[:id])
    if current_user.unlocks.where(resume_id: resume.id).length > 0
      send_file resume.document.path.split('?')[0], :filename => resume.document_file_name, :type => ["application/pdf", "application/doc", "application/docx"], :disposition => "attachment"
    elsif current_user.credits > 0
      current_user.credits = current_user.credits - 1
      current_user.save!
      Unlock.create(user_id: current_user.id, resume_id: resume.id)
      send_file resume.document.path.split('?')[0], :filename => resume.document_file_name, :type => ["application/pdf", "application/doc", "application/docx"], :disposition => "attachment"
    else
      flash[:success] = "Your Credit balance is zero. Submit more resumes for more Credits!"
      redirect_to inbox_path
    end
  end

  def inbox
    @resumes = current_user.incoming_resumes.order("created_at DESC")
    end

  def destroy
    @resume = Resume.find(params[:id])
    @resume.destroy
    flash[:success] = "Your Resume has been successfully deleted!"
    redirect_to inbox_path
  end

  def count
    current_user.resumes.count
  end

  private

  def resume_params
      params.require(:resume).permit(:document)
    end

end

这是我的梅勒:

class ResumeMailer < ApplicationMailer
  default from: "MYEMAIL@gmail.com"

  def resume_received(resume)
    @resume = resume
    @post = @resume.post

    mail to: @post.user.email,
            subject: "You have received a new Candidate for the #{@post.title} posting!"
  end
end

这是我的Development.rb SMTP:

  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

  config.active_record.raise_in_transactional_callbacks = true

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    port: 587,
    domain: "gmail.com",
    authentication: "plain",
    enable_starttls_auto: true,
    user_name: ENV["GMAIL_USERNAME"],
    password: ENV["GMAIL_PASSWORD"]
  }

这是我的Production.rb SMTP:

config.action_mailer.default_url_options = { host: 'MYSITE.herokuapp.com', protocol: 'http' }

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false

  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    port: 587,
    domain: "gmail.com",
    authentication: "plain",
    enable_starttls_auto: true,
    user_name: ENV["GMAIL_USERNAME"],
    password: ENV["GMAIL_PASSWORD"],
    openssl_verify_mode: 'none'
  }
}

此设置在开发中完美运行,我也已进入GMAIL设置,以允许访问不太安全的应用程序。任何帮助或资源指出我正确的方向将不胜感激。

2 个答案:

答案 0 :(得分:3)

如何更改没有http的主机(参见下面的示例) 另一个想法是检查你的系统环境访问你的secret_data variabel它是否工作(ENV [&#34; GMAIL_PASSWORD&#34;]

  config.action_mailer.default_url_options = { :host => "xxx.xxx.xxx.xxx" }

  config.action_mailer.delivery_method=:smtp 
  config.action_mailer.raise_delivery_errors = true

  # Gmail SMTP server setup
  ActionMailer::Base.smtp_settings = {
    :address => "smtp.gmail.com",
    :enable_starttls_auto => true,
    :port => 587,
    :authentication => :plain,
    :user_name => "your username",
    :password => 'your pass'
  }

答案 1 :(得分:0)

虽然 OP 的问题已明显解决,但我还是将其发布出来以供将来遇到类似问题的访问者参考。

当尝试发送电子邮件时出现“需要身份验证”错误时,首先要做的可能是检查相关配置参数是否完全按照您的预期设置。

使用 bin/rails c 启动控制台(如果可以)并运行,例如,如果 Rails 6(和 5?),

Rails.application.config.action_mailer.smtp_settings[:user_name][-10..-1]
 # => "@gmail.com"  (providing your user_name is at Gmail.)
Rails.application.config.action_mailer.smtp_settings[:password].size > 0
 # => true

显然,如果您的安全策略允许,您可以直接浏览它们。 请注意,尽管您可能在代码中以加密方式指定了这些信息,但上面 Hash 的内容是一个纯字符串。

Rails 6 中的一个潜在陷阱是运行时环境的加密字符串可能与 Rails 应用程序中的全局字符串不同。例如,一旦您运行了 bin/rails credentials:edit --environment development,即使您在凭证中不添加任何内容,也会创建文件 config/credentials/development.key(和 development.yml.enc),然后您在 development 中的凭证项 环境将从一开始就不同于全局环境。因此,请确保在您的运行时环境中的 config 中设置的是您想要的。

或者,临时为 user_name(或 password)中的 development.rbproduction.rb 指定纯文本字符串并运行进程以发送电子邮件将是一个简单的实验,前提是安全策略允许您这样做。


作为补充说明,如果错误是“用户名和密码不被接受”,尽管它们设置正确,并且如果您使用的是 Gmail 服务器,那么很可能是因为所使用的 Gmail 帐户的服务器设置。具体来说,必须在 Gmail setting 处打开“访问安全性较低的应用程序”选项。

有关 Gmail 特定问题的信息,请参阅 this Rails-specific answer,或者更详细地参阅 this answer at serverfault