2012-12-20 65 views
7

使用我的Rails站點,當我嘗試通過GMail發送郵件時,它完美地工作。但是,當我試圖通過MandrillApp發送它,它提供了以下錯誤(RController.create是在傳遞命令調用):Rails Mailer Net :: SMTPServerBusy

Net::SMTPServerBusy in RController#create 
454 4.7.1 <[email protected]>: Relay access denied 

這裏是我的配置/環境/ 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   => '[email protected]', 
# :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合作過,所以任何幫助,將不勝感激。

回答

5

我最終與Mandrill的服務代表通話,事實證明我使用的是實際的字符串而不是環境變量,所以我只需從配置文件中刪除「ENV」。

爲了安全起見,我最終返回並創建了環境變量,但是我只是認爲我會將其拋出,以防其他人遇到同樣的問題並發現此問題。

+0

謝謝你爲我工作。你應該接受你自己的答案。我不得不像''EMAIL''那樣去掉'ENV'和'[]''。 – LearningRoR

+0

你能澄清你的解決方案嗎?我目前在我的smtp_settings - :password => ENV ['MANDRILL_API_KEY']中有這一行。根據你的解決方案,這條線應該如何讀取? – ajporterfield

+0

如果你將MANDRILL_API_KEY定義爲一個程序變量而不是環境變量,那麼你只需要:'password => MANDRILL_API_KEY',而不是'password => ENV ['MANDRILL_API_KEY']'。環境變量更安全,因爲您的API密鑰將存儲在您的計算機/服務器上,而不是存儲在您的站點中(基本上,有人可以獲取您的代碼,仍然無法獲取您的密鑰),但是一個普通變量更容易實現 - 取決於你對安全性的擔心(儘管正確地說,你應該做一個環境變量)。 – camdroid

2

你有沒有試過看下面的設置Mandrill SMTP Integration。希望它有幫助

+0

感謝您的幫助(我錯過了驗證行),但它沒有擺脫錯誤。當我嘗試發送電子郵件時,仍然收到Net :: SMTPServerBusy錯誤。 – camdroid

0

我懷疑你的問題是由Phusion Passenger引起的(因此在生產中)。乘客因不設置環境變量而臭名昭着。

SO issue建議2解決方案:硬編碼值,或覆蓋乘客使用的紅寶石包裝。

我會建議第三個選項:在部署期間擴展環境變量。這幾乎是一個延遲的硬編碼,但將密碼從代碼中移出。

您應該在部署後立即執行的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 ...)。你必須在/etc/ssh/sshd_config~/.ssh/environment再出口,並將其附加下列選項:

PermitUserEnvironment yes 

最後這說明被發現there。我個人在我的new blog上進一步記錄了我的問題。

希望這可以幫助解決一些安全問題你:)

1

您還可以檢查ENV變量在第一位置設置。

1

如果您使用的是Heroku,則需要在CLI中設置環境變量。

cd到您的工作目錄和...

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

您現在可以訪問環境變量。我知道你正在使用development.rb,但當你訪問production.rb時,這可能會讓你頭疼。使用我的application.yml文件導致我頭痛幾個小時。