【问题标题】:Rails Mailer Net::SMTPServerBusyRails Mailer Net::SMTPServerBusy
【发布时间】:2012-12-20 01:07:07
【问题描述】:

在我的 rails 网站上,当我尝试通过 GMail 发送邮件时,它运行良好。但是当我尝试通过 MandrillApp 发送它时,它会给出以下错误(RController.create 是调用交付命令的位置):

Net::SMTPServerBusy in RController#create 
454 4.7.1 <recipient@gmail.com>: 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 合作过,因此将不胜感激。

【问题讨论】:

    标签: ruby-on-rails gmail


    【解决方案1】:

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

    为了安全起见,我最终返回并创建了环境变量,但我只是想我会把它扔在那里,以防其他人遇到同样的问题并找到这个问题。

    【讨论】:

    • 感谢这对我有用。你应该接受你自己的答案。我必须摆脱ENV[] 之类的"EMAIL"
    • 你能澄清你的解决方案吗?我目前在我的 smtp_settings 中有这一行 - :password => ENV['MANDRILL_API_KEY']。根据你的解决方案,这行应该怎么读?
    • 如果您将 MANDRILL_API_KEY 定义为程序变量,而不是环境变量,那么您只需要:password =&gt; MANDRILL_API_KEY,而不是 password =&gt; ENV['MANDRILL_API_KEY']。环境变量更安全,因为您的 API 密钥将存储在您的计算机/服务器而不是您的站点中(基本上,有人可以掌握您的代码,但仍然无法获取您的密钥),但是一个普通变量更容易实现 - 取决于您对安全性的关注程度(尽管正确地,您应该做一个环境变量)。
    • 经过大量研究,我终于找到了您的解决方案
    【解决方案2】:

    您是否尝试过查看以下设置Mandrill SMTP Integration。希望对你有帮助

    【讨论】:

    • 感谢您的帮助(我错过了身份验证行),但它并没有消除错误。当我尝试发送电子邮件时,我仍然收到 Net::SMTPServerBusy 错误。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      cd 到你的工作目录,然后...

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

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

      【讨论】:

        【解决方案5】:

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

        SO issue 提出了 2 个解决方案:硬编码值,或覆盖乘客使用的 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
        

        这些最后的说明是在there 中找到的。我个人在new blog 上进一步记录了我的问题。

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

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 1970-01-01
          • 2019-10-29
          • 2012-02-11
          • 2012-02-06
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多