2011-12-20 55 views
12

Tôi có ứng dụng Rails được định cấu hình để sử dụng Amazon SES qua SMTP. Tuy nhiên, khi tôi thử và gửi email, nó dường như hết thời gian chờ sau một phút và tôi nhận được một EOFError. Nó có mùi giống như một vấn đề cấu hình - email có vẻ được xây dựng tốt, và tôi có thể gửi cho mình các email kiểm tra từ bảng điều khiển AWS SES. Đây là trong chế độ sandbox, và các ứng dụng đang chạy trong chế độ phát triển, nhưng cả email gửi và nhận đã được xác minh với SES, và development.rb được thiết lập với điều này:Lỗi EOFError cố gắng sử dụng Amazon SES qua SMTP với Rails 3.1.3

config.action_mailer.raise_delivery_errors = true 
config.action_mailer.delivery_method = :smtp 

Tôi đã thử một triệu cấu hình biến thể; điều này đang bắt đầu thúc đẩy tôi chuối. Bất kỳ trợ giúp hoặc hướng dẫn nào sẽ rất, rất được đánh giá cao. Thông tin chi tiết:

Các smtp cấu hình, mà tôi có trong một initializer:

ActionMailer::Base.smtp_settings = { 
    :address  => "email-smtp.us-east-1.amazonaws.com", 
    :port   => "465", 
    :authentication => :plain, 
    :enable_starttls_auto => true, 
    :user_name  => "1234", 
    :password  => "abcde" 
} 

Các bản ghi với lỗi, một chút cắt ngắn cho ngắn gọn:

Sent mail to [email protected] (59929ms) 
Date: Tue, 20 Dec 2011 03:08:37 -0800 
From: [email protected] 
To: [email protected] 
Message-ID: <[email protected]> 
Subject: Your invitation to Phu 
Mime-Version: 1.0 
Content-Type: text/html; 
charset=UTF-8 
Content-Transfer-Encoding: 7bit 

<!DOCTYPE html> 
.... 

Completed 500 Internal Server Error in 60564ms 

EOFError (end of file reached): 
    app/controllers/admin_controller.rb:61:in `block in send_invite' 
    app/controllers/admin_controller.rb:46:in `send_invite' 
+0

Liệu ISP của bạn cho phép kết nối ra ngoài trên cổng 465? Bạn có thể sử dụng thông tin đăng nhập amazon smtp của mình với ứng dụng thư bình thường không? –

+0

Bạn có làm việc này không? Bởi vì tôi có cùng một vấn đề ... – Morten

+0

Chưa làm việc - kết thúc bằng Gmail qua smpt, điều này đã đủ tốt trong thời gian này. Tôi sẽ thử giải pháp của Mihir dưới đây và báo cáo lại (và chấp nhận câu trả lời nếu nó hoạt động). Frederick, tôi đã có thể sử dụng smtp bên ngoài Rails - đó là trường hợp máy chủ của riêng tôi, các cổng đang mở. –

Trả lời

1

SES đòi hỏi một phiên SSL trước lệnh EHLO được gửi.

Tôi biết System.Net.Mail không hoạt động với SES, vì System.Net.Mail khởi tạo TLS sau khi phiên SMTP đã bắt đầu.

+1

Cảm ơn bạn đã gợi ý, nhưng nếu tôi đọc [cam kết này] (https://github.com/rails/rails/commit/732c724df61bc8b780dc42817625b25a321908e4) một cách chính xác, ActionMailer (Rails tương đương của System.Net.Mail) sẽ khởi tạo TLS trước khi bắt đầu phiên. –

1

Tôi đã gặp vấn đề tương tự khi sử dụng Rails 2.3, với Ruby 1.8.7, ở chế độ nhà phát có tài khoản SES hộp cát, gửi đến/từ người gửi được xác minh.

Tôi đã làm việc xung quanh nó bằng cách thêm vào số unofficial aws-ses gem. Dán nó vào Gemfile của bạn, và sau đó thay thế các thiết lập smtp với 5 dòng:

# Configure mail sending options: Use AWS-SES for all environments 
    config.after_initialize do 
    ActionMailer::Base.delivery_method = :amazon_ses 
    ActionMailer::Base.custom_amazon_ses_mailer = AWS::SES::Base.new(:secret_access_key => 'asfd/1234', :access_key_id => 'ABCD') 
    end 

Gửi sau đó làm việc như mong đợi ... cho tôi biết chính các email đã được thiết lập chính xác.

Tôi đã thực hiện rất nhiều googling và chưa thấy bất kỳ xác nhận nào rằng SES-SMTP tương thích với Rails 2.3 + Ruby 1.8.7. Tôi cũng không tìm thấy bất kỳ điều gì từ chối rõ ràng điều đó, ngoài trải nghiệm của bạn là &.

Hãy cho chúng tôi biết nếu bạn tìm thấy giải pháp!

+0

Cảm ơn đá quý aws-ses đã làm việc cho tôi! –

6

Dưới đây là một giải pháp trong trường hợp bạn muốn sử dụng SMTP (và không phải là đá quý AWS-SES)

http://blog.readypulse.com/2012/01/06/amazon-ses-smtp-emails-using-rails-3-1-in-three-easy-steps/

Những điều cần lưu ý

AWS SMTP chỉ hoạt động trên TLS AWS SMTP không KHÔNG hỗ trợ STARTTLS Cấu hình của ActionMailer không có công tắc TLS dễ dàng. Các bước để theo dõi

Bật hỗ trợ SMTP trên Bảng điều khiển AWS - Xem hướng dẫn tại đây. Tạo bộ khởi tạo trong thư mục config/initializers của bạn. Tôi gọi nó là amazon_ses.rb và thêm mã sau đây để vá tiền cài đặt SMTP của ActionMailer.

module Net 
    class SMTP 
     def tls? 
      true 
     end 
    end 
end 

Thêm mã sau vào tệp development.rb và production.rb của bạn. Sửa đổi cài đặt để phù hợp với môi trường của bạn.

config.action_mailer.default_url_options = { host: “<example.com>” } 
config.action_mailer.raise_delivery_errors = true 
config.action_mailer.delivery_method = :smtp 
config.action_mailer.smtp_settings = { 
    address: “email-smtp.us-east-1.amazonaws.com”, 
    port: 465, 
    domain: “<example.com>”, 
    authentication: :login, 
    user_name: “<your aws smtp username>”, 
    password: “<your aws smtp password>” 
} 
+0

Tôi đã làm việc này khi tôi đặt các thay đổi mô-đun trong cùng một tệp như cài đặt thư. – Morten

+0

Không may mắn cho tôi. – mixonic

+3

(Trên Rails 3.2) Tôi phải thêm 'require 'net/smtp'' vào đầu tập tin khởi tạo (ở trên' mô-đun Net'). Tôi nghĩ rằng nó đã được tải initializer, và sau đó tải thư viện thực tế sau đó, trọng các miếng vá khỉ. –

10

Ngoài ra còn có một giải pháp mà không có giải pháp khỉ vá từ Mihir (trong đó, theo tài liệu hướng dẫn AWS SES, http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.Connecting.html, là giải pháp wrapper TLS), bằng cách sử dụng cổng 587 và: Tùy chọn enable_starttls_auto (giải pháp STARTTLS). Vì vậy, các cấu hình sửa đổi là như vậy:

config.action_mailer.default_url_options = { host: “<example.com>” } 
config.action_mailer.raise_delivery_errors = true 
config.action_mailer.delivery_method = :smtp 
config.action_mailer.smtp_settings = { 
    :address: “email-smtp.us-east-1.amazonaws.com”, 
    :port: 587, 
    :domain: “<example.com>”, 
    :authentication: :login, 
    :user_name: “<your aws smtp username>”, 
    :password: “<your aws smtp password>”, 
    :enable_starttls_auto => true 
} 
+2

Vì bất kỳ lý do gì khi sử dụng cổng '587' là một mẹo. Cảm ơn! –

+0

Theo [tài liệu] (http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-connect.html), cổng 465 là dành cho ssmtp (smtp qua SSL). Đối với SMTP với STARTTLS, bạn cần sử dụng cổng 25 hoặc 587 khi bạn phát hiện ra. – AlexT

+0

Cảm ơn) Hoạt động tốt – rusllonrails

0

tôi đã làm việc này on Rails 3.2.12 thêm require 'net/smtp' vào file khởi tạo với sự thay đổi mô-đun như:

require 'net/smtp' 

    module Net 
    class SMTP 
     def tls? 
     true 
     end 
    end 
end 
Các vấn đề liên quan