3

我正在使用 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 由于可疑活动而阻止登录的帖子,但我没有收到此类警报。当我使用配置变量时它不起作用 - 将其更改回字符串使其在我的本地开发环境中工作。我在这里有点不知所措。有任何想法吗?

4

1 回答 1

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 终端上 EXPORT 时 - 您必须用单引号将密码括起来才能按字面意思解释字符串,如下所示:

'ANEXAMPLEPA$$0RD'

如果您不这样做 - 您使用 export PASSWORD=PWD 或 heroku config:add KEY=VALUE 键入的密码实际上会删除其中一些特殊字符(当您链接命令时,UNIX 将 $1 和 $2 等作为变量的占位符 -这原来是我的问题)。

因此,请确保如果您使用的密码您觉得很强大,那么密码的任何组合都不会意外地被解释为 UNIX 级别的命令。export FOO=BAR 和 heroku config:add FOO=BAR 都会返回而没有错误,你会认为你的密码设置正确。然后一小时后,您将检查以确保密码正确,并且您会注意到发生了一些插值。

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

于 2014-02-20T02:15:39.050 回答