2012-12-20 2 views
7

내 레일 사이트에서 Gmail을 통해 메일을 보내려고하면 완벽하게 작동합니다.Rails Mailer Net :: SMTPServerBusy

# 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"] 
} 
:

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

가 여기 내 설정/환경/development.rb 파일이다 : 나는 MandrillApp를 통해 보내려고 할 때, 그것은합니다 (명령이 호출 제공하는 곳 RController.create는) 다음과 같은 오류를 제공합니다

위와 같이 코드가 작동하지 않습니다. 전자 메일을받지 못하고 오류 팝업이 표시되지 않습니다. Gmail에서 보내는 것으로 전환하면 즉시 이메일이 전송됩니다. 나는 전에 Mandrill에서 일한 적이 없기 때문에 어떤 도움을 주시면 감사하겠습니다.

답변

5

Mandrill의 서비스 담당자와 이야기를 나누었습니다. 환경 변수 대신 실제 문자열을 사용했기 때문에 구성 파일에서 "ENV"를 제거해야했습니다.

돌아가서 보안을 위해 환경 변수를 만들었지 만 다른 사람이 같은 문제를 가지고이 질문을 발견하는 경우에 대비해서 그 내용을 버릴 것이라고 생각했습니다.

+0

고마워요. 저에게 도움이되었습니다. 당신은 당신 자신의 대답을 받아 들여야합니다. 나는 ENV와 EMAIL 같은'[]'을 제거해야만했다. – LearningRoR

+0

솔루션을 명확히 할 수 있습니까? 현재 내 smtp_settings - : password => ENV [ 'MANDRILL_API_KEY']에이 줄이 있습니다. 당신의 해결책에 따르면, 어떻게이 줄을 읽어야합니까? – ajporterfield

+0

MANDRILL_API_KEY를 환경 변수가 아닌 프로그램 변수로 정의하는 경우'password => ENV [ 'MANDRILL_API_KEY']'대신'password => MANDRILL_API_KEY' 만 필요합니다. 환경 변수는 더 안전합니다. API 키가 사이트가 아닌 컴퓨터/서버에 저장되므로 (기본적으로 누군가 코드를 보유 할 수 있지만 여전히 키를 가져올 수 없음) 일반적인 변수 구현하기가 더 쉽습니다 - 보안에 얼마나 관심이 있는지에 달려 있습니다 (환경 변수를 올바르게 작성해야하지만). – camdroid

2

다음 설정을 시도해 보셨습니까? Mandrill SMTP Integration. 희망이 있습니다.

+0

도움을 주셔서 감사합니다 (인증 회선이 누락되었습니다). 그러나 오류를 제거하지는 않습니다. 전자 메일을 보내려고해도 Net :: SMTPServerBusy 오류가 발생합니다. – camdroid

0

귀하의 문제는 Phusion Passenger (프로덕션 환경에서 발생)가 의심됩니다. 승객은 환경 변수를 설정하지 않은 것으로 유명합니다.

SO issue은 값을 하드 코딩하거나 승객이 사용하는 루비 래퍼를 재정의하는 두 가지 해결책을 제시합니다.

세 번째 옵션은 배포 중에 환경 변수를 확장하는 것입니다. 꽤 많이 지연된 하드 코딩이지만 암호를 코드에서 제외시킵니다.

당신은 바로 배포 한 후 배쉬의이 비트를 실행한다 : 여기

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 

은 해당 카피 스트라 노 태스크 배포입니다 (앞서 탈출을 많이!) : 아직도

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" 

을 카피 스트라 노를 들어, 당신을 배포에 사용하는 SSH 세션에서 동일한 환경 변수를 설정하지 마십시오 (.bashrc,/etc/profile ...을 실행하지 않습니다). 당신은 /etc/ssh/sshd_config에 다음 옵션을 ~/.ssh/environment에서 그들을 다시 수출하고 추가 할 수 있습니다

PermitUserEnvironment yes 

이 마지막 지침 there을 발견했다. 개인적으로 내 new blog에 대한 문제를 조금 더 문서화했습니다. 이 당신이 ENV 변수가 처음에 설정되어있는 경우 또한 확인할 수 있습니다

1

을 :)위한 몇 가지 보안 문제를 해결하는 데 도움을 줄 수 있습니다

희망.

1

Heroku를 사용하는 경우 CLI에서 환경 변수를 설정해야합니다.

작업 디렉토리로 cd ...

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

이제 환경 변수에 액세스 할 수 있습니다. 나는 당신이 개발에 종사하고 있다는 것을 알고 있습니다. 그러나 이것은 생산에 들어갈 때 두통을 덜어 줄 수 있습니다. 내 application.yml 파일로 몇 시간 동안 두통을 일으켰습니다.

관련 문제