Ошибка 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'
Ответы
Ответ 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