Подтвердить что ты не робот

Ошибка EOFError при попытке использования SAS через Amazon через SMTP с Rails 3.1.3

У меня есть приложение Rails, настроенное для использования SAS через Amazon через 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 [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'
4b9b3361

Ответ 1

Существует также решение без решения 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
}

Ответ 2

Вот решение, если вы хотите использовать SMTP (а не жемчужину AWS-SES)

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

Заметки

AWS SMTP работает только на TLS AWS SMTP НЕ поддерживает STARTTLS В конфигурации ActionMailers нет простого переключателя TLS. Шаги, чтобы следовать

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

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

Ответ 3

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

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

Ответ 4

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

Я работал над этим, добавив в неофициальный aws-ses gem. Вставьте его в свой 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. Я также не нашел ничего, что явно отрицает это, кроме вашего и моего опыта.

Сообщите нам, если вы найдете решение!

Ответ 5

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

require 'net/smtp'

  module Net
    class SMTP
      def tls?
        true
      end
    end
 end