2012-12-20 18 views
7

Với trang web đường ray của tôi, khi tôi cố gắng gửi thư qua Gmail, nó hoạt động hoàn hảo. Nhưng khi tôi cố gắng gửi nó qua MandrillApp, nó mang lại cho các lỗi sau (RController.create là nơi cung cấp lệnh được gọi là):Rails Mailer Net :: SMTPServerBusy

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

Dưới đây là config/môi trường/development.rb tập tin của tôi:

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

Vì nó ở trên, mã không hoạt động - Tôi không nhận được email và không có lỗi nào xuất hiện. Nếu tôi chuyển sang gửi nó từ Gmail, tôi nhận được email gần như ngay lập tức. Tôi chưa bao giờ làm việc với Mandrill trước đây, vì vậy bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

5

Tôi đã kết thúc nói chuyện với một đại diện dịch vụ từ Mandrill, và nó chỉ ra rằng tôi đã sử dụng các chuỗi thực tế thay vì các biến môi trường, vì vậy tôi chỉ cần loại bỏ "ENV" từ tập tin cấu hình.

Tôi đã kết thúc trở lại và tạo biến môi trường vì mục đích bảo mật, nhưng tôi nghĩ tôi sẽ ném nó ra ngoài trong trường hợp bất kỳ ai khác có cùng vấn đề và tìm thấy câu hỏi này.

+0

Cảm ơn điều này đã làm việc cho tôi. Bạn nên chấp nhận câu trả lời của riêng bạn. Tôi phải loại bỏ 'ENV' và' [] 'như' "EMAIL" '. – LearningRoR

+0

Bạn có thể làm rõ giải pháp của mình không? Tôi hiện có dòng này trong smtp_settings của tôi -: password => ENV ['MANDRILL_API_KEY']. Theo giải pháp của bạn, dòng này nên đọc như thế nào? – ajporterfield

+0

Nếu bạn định nghĩa MANDRILL_API_KEY là biến chương trình, thay vì biến môi trường, thì bạn chỉ cần: 'password => MANDRILL_API_KEY', thay vì' password => ENV ['MANDRILL_API_KEY'] '. Biến môi trường an toàn hơn, vì khóa API của bạn sẽ được lưu trữ trên máy tính/máy chủ thay vì trong trang web của bạn (về cơ bản, ai đó có thể giữ mã của bạn và vẫn không thể lấy khóa của bạn), nhưng biến thông thường dễ thực hiện hơn - phụ thuộc vào mức độ liên quan của bạn với bảo mật (mặc dù, đúng, bạn nên thực hiện biến môi trường). – camdroid

2

Bạn đã thử xem các thiết lập sau đây Mandrill SMTP Integration. Hy vọng nó sẽ giúp

+0

Cảm ơn sự giúp đỡ (Tôi đã thiếu dòng xác thực), nhưng nó không loại bỏ được lỗi. Khi tôi cố gửi một email, tôi vẫn gặp lỗi Net :: SMTPServerBusy. – camdroid

0

Tôi nghi ngờ rằng vấn đề của bạn là do Hành khách Phusion (do đó trong sản xuất). Hành khách không nổi tiếng vì không đặt biến môi trường.

Điều này SO issue đề xuất 2 giải pháp: giá trị hardcoding hoặc ghi đè trình bao bọc ruby ​​được sử dụng bởi Hành khách.

Tôi muốn đề xuất tùy chọn thứ ba: mở rộng các biến môi trường trong quá trình triển khai. Đó là khá nhiều phần cứng bị trì hoãn, nhưng để lại mật khẩu của bạn ra khỏi mã của bạn.

Bạn nên thực hiện điều này chút bash ngay sau khi triển khai của bạn:

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 

Đây là Capistrano tương đương triển khai nhiệm vụ (nhiều thoát trước!):

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" 

Tuy nhiên cho Capistrano, bạn không có các biến môi trường giống nhau được đặt trong phiên SSH mà nó sử dụng để triển khai (nó không thực thi .bashrc,/etc/profile ...). Bạn cần phải tái xuất chúng trong ~/.ssh/environment và thêm tùy chọn sau trong /etc/ssh/sshd_config:

PermitUserEnvironment yes 

Những giáo huấn cuối cùng đã được tìm thấy there. Tôi đã cá nhân hóa tài liệu thêm một chút về vấn đề của tôi trên new blog của tôi.

Hy vọng điều này có thể giúp khắc phục một số vấn đề bảo mật cho bạn :)

1

Bạn cũng có thể kiểm tra xem các biến ENV có được đặt ở vị trí đầu tiên không.

1

Nếu bạn đang sử dụng Heroku, bạn cần đặt các biến môi trường trong CLI.

cd vào thư mục làm việc của bạn và ...

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

Bây giờ bạn có thể truy cập vào các biến môi trường. Tôi biết bạn đang làm việc với development.rb nhưng điều này có thể giúp bạn tiết kiệm một nhức đầu khi bạn đến production.rb. Gây đau đầu cho tôi một vài giờ với tập tin application.yml của tôi.

Các vấn đề liên quan