Ruby on rails Rails Mailer Net::SMTPServerBusy

Ruby on rails Rails Mailer Net::SMTPServerBusy,ruby-on-rails,gmail,Ruby On Rails,Gmail,在我的rails站点上,当我尝试通过GMail发送邮件时,它工作得非常好。但是当我尝试通过MandrillApp发送它时,它会给出以下错误(RController.create是调用deliver命令的地方): 如上所述,代码不起作用-我没有收到电子邮件,也没有错误弹出。如果我改用GMail发送,我几乎会立刻收到一封电子邮件。我以前从未与Mandrill一起工作过,因此任何帮助都将不胜感激 您是否尝试过查看以下设置。希望能有所帮助我最终与Mandrill的服务代表交谈,结果发现我使用的是实际字符

在我的rails站点上,当我尝试通过GMail发送邮件时,它工作得非常好。但是当我尝试通过MandrillApp发送它时,它会给出以下错误(RController.create是调用deliver命令的地方):


如上所述,代码不起作用-我没有收到电子邮件,也没有错误弹出。如果我改用GMail发送,我几乎会立刻收到一封电子邮件。我以前从未与Mandrill一起工作过,因此任何帮助都将不胜感激

您是否尝试过查看以下设置。希望能有所帮助

我最终与Mandrill的服务代表交谈,结果发现我使用的是实际字符串而不是环境变量,所以我只需从配置文件中删除“ENV”


最后,为了安全起见,我回去制作环境变量,但我只是想我会把它扔出去,以防其他人也有同样的问题并发现这个问题

我怀疑您的问题是由Phusion乘客(因此在生产中)引起的。乘客因不设置环境变量而臭名昭著

这建议了两种解决方案:硬编码值,或者重写Passenger使用的ruby包装器

我建议第三种选择:在部署期间扩展环境变量。这几乎是一个延迟的硬编码,但将密码从代码中删除

您应该在部署后立即执行此bash:

mv config/environments/production.rb config/environments/production.before_sed.rb
env | sed 's/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%ENV\\[\\"\1\\"\\]%\2%/' > script/expand_env_vars.sed.script
cat config/environments/production.before_sed.rb | sed -f script/expand_env_vars.sed.script > config/environments/production.rb
下面是等效的Capistrano部署任务(前面有很多转义!):

对于Capistrano,您没有在它用于部署的SSH会话中设置相同的环境变量(它不执行.bashrc、/etc/profile…)。您必须在
~/.ssh/environment
中重新导出它们,并在
/etc/ssh/sshd\u config
中附加以下选项:

PermitUserEnvironment yes
这些最后的指示被找到了。我个人在我的网站上进一步记录了我的问题


希望这可以帮助您解决一些安全问题:)

您还可以首先检查是否设置了环境变量。

如果您使用的是Heroku,则需要在CLI中设置环境变量

cd到您的工作目录,然后

heroku config:set MANDRILL_USERNAME='YOUR USERNAME'
heroku config:set MANDRILL_APIKEY="YOUR API KEY"

现在可以访问环境变量。我知道您正在使用development.rb,但这可能会让您在进入production.rb时省去一点头痛。我的application.yml文件让我头痛了几个小时

感谢您的帮助(我错过了身份验证行),但这并不能消除错误。当我尝试发送电子邮件时,我仍然收到Net::SMTPServerBusy错误。谢谢,这对我来说很有效。你应该接受你自己的答案。我必须摆脱
ENV
[]
之类的
“EMAIL”
。你能澄清一下你的解决方案吗?我目前在smtp_设置中有这一行-:password=>ENV['MANDRILL_API_KEY']。根据您的解决方案,这一行应该如何读取?如果您将MANDRILL\u API\u KEY定义为一个程序变量,而不是一个环境变量,那么您只需要:
password=>MANDRILL\u API\u KEY
,而不是
password=>ENV['MANDRILL\u API\u KEY']
。环境变量更安全,因为您的API密钥将存储在您的计算机/服务器上,而不是存储在您的站点上(基本上,有人可以获取您的代码,但仍然无法获取您的密钥),但普通变量更容易实现-取决于您对安全性的关注程度(虽然,正确地说,你应该做一个环境变量)。经过大量的研究,我终于找到了你的解决方案
desc "Replace environment variables with hardcoded values in config files"
task :replace_env_vars, roles: :app do
    run "mv #{release_path}/config/environments/production.rb #{release_path}/config/environments/production.before_sed.rb"
    run 'env | sed \'s/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%ENV\\\[\\\"\1\\\"\\\]%\\\"\2\\\"%/\' > ' + "#{release_path}/script/expand_env_vars.sed.script"
    run "cat #{release_path}/config/environments/production.before_sed.rb | sed -f #{release_path}/script/expand_env_vars.sed.script > #{release_path}/config/environments/production.rb"
end

after "deploy:update_code", "deploy:replace_env_vars"
PermitUserEnvironment yes
heroku config:set MANDRILL_USERNAME='YOUR USERNAME'
heroku config:set MANDRILL_APIKEY="YOUR API KEY"