发送邮件时不接受用户名和密码(Heroku)

时间:2013-08-03 08:44:49

标签: ruby-on-rails email heroku actionmailer

我正在使用ActionMailer从我的网站发送一封确认电子邮件,该电子邮件是在Heroku上托管的。 当我在smtp_settings中输入我的用户名和密码作为字符串时,它工作得非常好,但这显然是一个安全漏洞,因为它们在Github上供所有人查看。所以今天我更改了我的gmail密码并使用Heroku的配置来保存用户名和密码。我的smtp设置现在看起来像这样:

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings ={
  address: "smtp.gmail.com",
  port: 587,
  domain: "gmail.com",
  user_name: "#{ENV['EMAIL_USER']}",
  password: "#{ENV['EMAIL_PASS']}",
  authentication: "plain",
  enable_starttls_auto: true
}

只有每次我尝试发送邮件时,它都会给我一个“Net :: SMTPAuthenticationError(535-5.7.8用户名和密码不被接受”错误。我甚至添加了puts来显示控制台中配置设置的值:

puts "USERNAME : #{ENV['EMAIL_USER']}"
puts "PASSWORD : #{ENV['EMAIL_PASS']}"

在Heroku的日志里,他们完全没问题。我读了另一篇关于Gmail由于可疑活动阻止登录的帖子,但我没有这样的提醒。当我使用配置变量时它不起作用 - 将其更改回字符串使其在我的本地开发环境中工作。我在这里有点不知所措。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我已经显示了您显示的SMTPAuth错误消息,我有几个建议:

首先 - 这是在我的生产应用程序中适用于我的配置:

  config.action_mailer.default_url_options = { :host => 'WWW.MYDOMAIN.COM' }
  config.action_mailer.raise_delivery_errors = true;
  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => "MYDOMAIN.COM",
  :user_name => ENV["MAILER_USER_NAME"],
  :password => ENV["MAILER_PASSWORD"],
  :from => 'SALES@MYDOMAIN.COM',
  :authentication => 'plain',
  :enable_starttls_auto => true 
}

所有MYDOMAIN的东西都是我的真实凭据。

第二 - 让我感动的是使用由Linux解释为BASH命令的令牌 - 所以这里是一个例子密码:

ANEXAMPLEPA$$0RD

现在,当您在Heroku或您自己的UNIX终端上导出此内容时,您必须使用单引号括起密码,以便按字面解释字符串,如下所示:

'ANEXAMPLEPA$$0RD'

如果您不这样做 - 使用export PASSWORD = PWD或heroku配置键入的密码:添加KEY = VALUE实际上会删除其中一些特殊字符(UNIX需要$ 1和$ 2等作为变量的占位符链命令 - 这结果是我的问题。)

因此,请确保如果您使用的密码感觉很强,则密码的任何组合都不会被意外地解释为UNIX级命令。导出FOO = BAR和heroku配置:添加FOO = BAR将返回没有错误,您将认为您的密码设置正确。然后一小时后你会检查以确保密码是正确的,你会发现有一些插值。

第三 - 与SO和个人博客上的许多帖子相反:domain =>关键是不必要的,甚至实际上有助于发送失败,我发现它对这个元素完全正常。