Ошибка EOFError при попытке использовать Amazon SES через SMTP с Rails 3.1.3 - PullRequest
12 голосов
/ 20 декабря 2011

У меня есть приложение Rails, настроенное для использования Amazon SES через SMTP. Однако, когда я пытаюсь отправить электронное письмо, через минуту оно перестает работать, и я получаю EOFError. Это пахнет проблемой конфигурации - кажется, что электронная почта построена нормально, и я могу отправлять себе тестовые электронные письма с консоли AWS SES. Это в режиме песочницы, и приложение работает в режиме разработки, но отправка и получение электронной почты были проверены с помощью SES, и development.rb настроен так:

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

Я пробовал миллион вариантов конфигурации; это начинает сводить меня с ума. Любая помощь или руководство будет очень и очень признателен. Подробнее:

Конфиг smtp, который у меня есть в инициализаторе:

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

Журналы с ошибкой, немного укороченные для краткости:

Sent mail to john@phu.com (59929ms)
Date: Tue, 20 Dec 2011 03:08:37 -0800
From: contact@phu.com
To: john@phu.com
Message-ID: <4ef06cb5ed3c_d73c3fc604c34d4491943@Johns-MacBook-Pro.local.mail>
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'

Ответы [ 5 ]

10 голосов
/ 06 декабря 2012

Существует также решение без решения monkey-patch от Mihir (которое, согласно документации AWS SES, http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.Connecting.html, - решение для оболочки TLS), с использованием порта 587 и опции: enable_starttls_auto (решение STARTTLS).Таким образом, модифицированный конфиг такой:

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
}
6 голосов
/ 08 января 2012

Вот решение, если вы хотите использовать SMTP (а не драгоценный камень AWS-SES)

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

Замечания

SMTP только AWSработает на TLS AWS SMTP НЕ поддерживает STARTTLS Конфигурация ActionMailer не имеет простого переключателя TLS.Последующие действия

Включите поддержку SMTP на консоли AWS - см. Инструкции здесь.Создайте инициализатор в каталоге config / initializers.Я называю его amazon_ses.rb и добавляю следующий код в настройки SMTP ActionMailer для денежного патча.

module Net
    class SMTP
        def tls?
            true
        end
    end
end

Добавьте следующий код в свои файлы development.rb и production.rb.Измените настройки в соответствии с вашей средой.

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>”
}
1 голос
/ 23 декабря 2011

Я столкнулся с той же проблемой, используя Rails 2.3, с Ruby 1.8.7, в режиме разработки с изолированной учетной записью SES, отправляя сообщения проверенным отправителям.

Я решил эту проблему, добавив неофициальный драгоценный камень .Вставьте его в свой Gemfile, а затем замените настройки smtp следующими 5 строками:

  # 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

Отправка затем работала как ожидалось ... что говорит мне о том, что сами письма были настроены правильно.

Я много гуглил и не видел подтверждения того, что SES-SMTP совместим с Rails 2.3 + Ruby 1.8.7.Также я не нашел ничего, что явно отрицает это, кроме вашего и моего опыта.

Дайте нам знать, если вы найдете решение!

1 голос
/ 20 декабря 2011

SES требует сеанса SSL перед отправкой команды EHLO.

Я знаю, что System.Net.Mail не работает с SES, потому что System.Net.Mail инициирует TLS после начала сеанса SMTP.

0 голосов
/ 22 мая 2013

Я получил эту работу на Rails 3.2.12, добавив require 'net / smtp' в файл инициализатора с изменением модуля, например:

require 'net/smtp'

  module Net
    class SMTP
      def tls?
        true
      end
    end
 end
...