我正在尝试在将简历文件上传到职位发布时发送通知电子邮件。我正在尝试在生产中使用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设置,以允许访问不太安全的应用程序。任何帮助或资源指出我正确的方向将不胜感激。
答案 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.rb
和 production.rb
指定纯文本字符串并运行进程以发送电子邮件将是一个简单的实验,前提是安全策略允许您这样做。
作为补充说明,如果错误是“用户名和密码不被接受”,尽管它们设置正确,并且如果您使用的是 Gmail 服务器,那么很可能是因为所使用的 Gmail 帐户的服务器设置。具体来说,必须在 Gmail setting 处打开“访问安全性较低的应用程序”选项。
有关 Gmail 特定问题的信息,请参阅 this Rails-specific answer,或者更详细地参阅 this answer at serverfault。