2012-12-20 17 views
7

Mit meiner Rails Site, wenn ich versuche, Mail über GMail zu senden, funktioniert es perfekt. Aber wenn ich versuche, es durch MandrillApp zu schicken, gibt es die folgende Fehlermeldung (RController.create ist, wo der Befehl liefern genannt wird):Rails Mailer Net :: SMTPServerBusy

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

Hier ist meine config/Umgebungen/development.rb Datei:

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

Wie oben erwähnt, funktioniert der Code nicht - ich bekomme keine E-Mail und keine Fehler. Wenn ich von GMail zum Senden wechsle, erhalte ich fast sofort eine E-Mail. Ich habe noch nie zuvor mit Mandrill gearbeitet, daher wäre jede Hilfe hilfreich.

Antwort

5

Ich endete im Gespräch mit einem Service-Rep von Mandrill, und es stellt sich heraus, dass ich die tatsächlichen Zeichenfolgen anstelle der Umgebungsvariablen verwendet, so dass ich nur "ENV" aus der Konfigurationsdatei entfernen musste.

Ich ging zurück und mache Umweltvariablen aus Sicherheitsgründen, aber ich dachte nur, ich würde das da rauswerfen, falls jemand anderes das gleiche Problem hat und diese Frage findet.

+0

Danke das hat für mich funktioniert. Sie sollten Ihre eigene Antwort akzeptieren. Ich musste die 'ENV' und die' '' 'wie' 'EMAIL'' loswerden. – LearningRoR

+0

Können Sie Ihre Lösung klären? Ich habe gerade diese Zeile in meinem smtp_settings -: password => ENV ['MANDRILL_API_KEY']. Wie soll diese Zeile laut Ihrer Lösung lauten? – ajporterfield

+0

Wenn Sie MANDRILL_API_KEY nicht als Umgebungsvariable, sondern als Programmvariable definieren, brauchen Sie nur: 'password => MANDRILL_API_KEY' anstelle von' password => ENV ['MANDRILL_API_KEY'] '. Eine Umgebungsvariable ist sicherer, da Ihr API-Schlüssel auf Ihrem Computer/Server statt auf Ihrer Site gespeichert wird (im Prinzip könnte jemand Ihren Code bekommen und Ihren Schlüssel immer noch nicht bekommen), aber eine normale Variable ist einfacher zu implementieren - hängt davon ab, wie besorgt Sie mit Sicherheit sind (obwohl Sie eigentlich eine Umgebungsvariable machen sollten). – camdroid

2

Haben Sie versucht, die folgende Einrichtung zu betrachten Mandrill SMTP Integration. Ich hoffe, es hilft

+0

Danke für die Hilfe (Ich fehlte die Authentifizierungslinie), aber es wird nicht den Fehler los. Wenn ich versuche, eine E-Mail zu senden, erhalte ich immer noch den Net :: SMTPServerBusy-Fehler. – camdroid

0

Ich habe den Verdacht, dass Ihr Problem von Phusion Passenger (daher in der Produktion) verursacht wird. Der Passagier ist berüchtigt dafür, keine Umgebungsvariablen zu setzen.

Diese SO issue schlägt 2 Lösungen vor: Hardcoding-Werte oder Überschreiben der von Passenger verwendeten Ruby-Wrapper.

Ich würde eine dritte Option vorschlagen: Erweiterung der Umgebungsvariablen während der Bereitstellung. Es ist eine verzögerte Hardcoding, aber hinterlässt Ihre Passwörter aus Ihrem Code.

Sie sollten diese wenig bash ausführen direkt nach dem deploy:

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 

Hier entspricht Capistrano ist Aufgabe einsetzen (viele Flucht vor!):

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" 

immer noch nach Capistrano, Sie In der SSH-Sitzung, die für die Bereitstellung verwendet wird, sind nicht dieselben Umgebungsvariablen festgelegt (es wird nicht .bashrc,/etc/profile ... ausgeführt). Sie müssen sie in ~/.ssh/environment erneut exportieren und fügen Sie die folgende Option in /etc/ssh/sshd_config:

PermitUserEnvironment yes 

Diese letzten Anweisungen there gefunden wurden. Ich habe persönlich etwas weiter mein Problem auf meiner new blog dokumentiert.

Hope this helfen kann, einige Sicherheitsprobleme zu beheben für Sie

1

:) können Sie auch prüfen, ob die ENV Variablen in erster Linie festgelegt werden.

1

Wenn Sie Heroku verwenden, müssen Sie die Umgebungsvariablen in der CLI festlegen.

CD in Ihr Arbeitsverzeichnis und ...

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

Sie können nun auf die Umgebungsvariablen zugreifen. Ich weiß, dass du mit development.rb arbeitest, aber das könnte dir Kopfschmerzen bereiten, wenn du zu production.rb kommst. Verursachte mir einige Stunden Kopfschmerzen mit meiner application.yml Datei.

Verwandte Themen