Rails Mailer Net :: SMTPServerBusy

有了我的rails网站,当我尝试通过GMail发送邮件时,它完美无缺。 但是当我尝试通过MandrillApp发送它时,它会产生以下错误(RController.create是调用deliver命令的地方):

Net::SMTPServerBusy in RController#create 454 4.7.1 : Relay access denied 

这是我的config / environments / development.rb文件:

  # ActionMailer Config config.action_mailer.default_url_options = { :host => 'localhost:3000' } config.action_mailer.delivery_method = :smtp config.action_mailer.default :charset => "utf-8" config.action_mailer.perform_deliveries = true 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 => 'gmail.com', # :user_name => 'sender@gmail.com', # :password => 'password', # :authentication => 'plain', # :enable_starttls_auto => true } config.action_mailer.smtp_settings = { :address => "smtp.mandrillapp.com", :port => 587, :user_name => ENV["EMAIL"], :password => ENV["PASSWORD"] } 

如上所述,代码不起作用 – 我没有收到电子邮件,也没有弹出错误。 如果我切换到从GMail发送它,我几乎立即收到一封电子邮件。 我以前从未与Mandrill合作过,所以任何帮助都会受到赞赏。

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

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

您是否尝试过查看以下设置的Mandrill SMTP集成 。 希望能帮助到你

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

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

cd到你的工作目录和……

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

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

我怀疑你的问题是由Phusion Passenger引起的(因此在制作中)。 乘客因未设置环境变量而臭名昭着。

这个SO问题提出了两个解决方案:硬编码值,或覆盖乘客使用的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的部署任务(很多都是逃避!):

 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" 

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

 PermitUserEnvironment yes 

这些最后的指示在那里找到。 我个人在我的新博客上进一步记录了我的问题。

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