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

Rails Mailer "Net:: OpenTimeout: исполнение истекло" Исключение только на производственном сервере

Я использую Ruby MRI 2.0.0 и Rails 3.2.12 на UBS Ubuntu 12.04 TLS VPS и пытаюсь настроить уведомления по электронной почте в своем приложении. Он работал нормально несколько дней назад, но не больше. Мой веб-хост - OVH.

Настройки моего SMTP:

config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :user_name            => '[email protected]',
  :password             => 'secret',
  :authentication       => 'plain',
  :enable_starttls_auto => true
}

Использование RAILS_ENV=production rails console:

class MyMailer < ActionMailer::Base
  def test_email
    sender     = "[email protected]"
    receiver   = "[email protected]"
    mail from: sender, to: receiver, subject: "Hello!", body: "World!!"
  end
end
 => nil

MyMailer.test_email.deliver

Выход:

Net::OpenTimeout: execution expired
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:540:in `initialize'
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:540:in `open'
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:540:in `tcp_socket'
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:550:in `block in do_start'
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:549:in `do_start'
    from ~/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/smtp.rb:519:in `start'
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/network/delivery_methods/smtp.rb:144:in `deliver!'
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:2034:in `do_delivery'
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:229:in `block in deliver'
    from ~/.rvm/gems/[email protected]/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:415:in `block in deliver_mail'
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `block in instrument'
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `instrument'
    from ~/.rvm/gems/[email protected]/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:413:in `deliver_mail'
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:229:in `deliver'
    from (irb):28
    from ~/.rvm/gems/[email protected]/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
    from ~/.rvm/gems/[email protected]/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
    from ~/.rvm/gems/[email protected]/gems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'2.0.0p0 :029 >

Я попробовал следующее:

  • Драйвер exception_notification был добавлен в настройку несколько дней назад. Я попытался прокомментировать его строку в Gemfile, а также ее соответствующую конфигурацию и запустил bundle install. После перезапуска сервера проблема все еще присутствует, даже если я удалю и заново создаю gemset.
  • Протестируйте его на виртуальной машине (точно такая же настройка, как и VPS, включая правила iptables): работает
  • Отключить правила iptables: не работает
  • Вручную подключиться к Gmail из VPS с помощью openssl: работает (так что это не проблема брандмауэра - см. здесь: Подключение к smtp.gmail.com через командную строку);
  • Включить IMAP в настройках учетной записи Gmail (он был отключен): не работает
  • Использовать другую учетную запись Gmail: не работает
  • Замените Ruby 2.0.0 на Ruby 1.9.3.
  • Обновление до Rails 3.2.13

Есть ли у кого-нибудь возможность понять, как решить эту проблему?

Спасибо!

4b9b3361

Ответ 1

Проблема связана с неправильной конфигурацией IPv6 на рабочем сервере и теперь исправлена.

Ответ 2

Вот также временное исправление, которое может пригодиться, ожидая, пока ваш хостинг-провайдер устранит проблему:

Добавьте следующие строки в /etc/sysctl.conf:

#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Теперь приложения могут отправлять письма снова.

Вы всегда можете узнать, включен ли IPv6, вызывающий

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

от терминала. Два возможных ответа: 0 = > включен IPv6; 1 = > отключен IPv6.

От: https://serverfault.com/questions/512744/timeout-error-in-all-my-apps-for-every-call-to-smtp-servers

Ответ 3

У меня, вероятно, была такая же проблема, мое приложение для производства не отправляло письма, хотя все в разработке работало нормально. Я также получил ошибку "Net:: OpenTimeout".

Моя проблема заключалась в том, что я использовал сервер Google на производстве, и блокирует порты 25, 465 и 587 для исходящих подключений.

Поскольку я использовал Mandrill для отправки писем, Мне удалось переключить соединительный порт с 587 на 2525, и теперь все в порядке.

Ответ 4

Сначала сделайте прямое соединение с Telnet:

telnet smtp-relay.sendinblue.com 587
Trying 94.143.17.4...

Это основное устранение неполадок соединения и работает с любым поставщиком или портом. Замените SendBlue и порт 587 на фактическое имя хоста/порт.

Если вы получите эту ошибку:

telnet: Unable to connect to remote host: Connection timed out

тогда проблема не в Rails.

В приведенном выше примере проблема заключается в номере порта. Такие услуги, как sendinblue или mandrill (я считаю, gmail тоже) больше не поддерживают порт 587. "2525" - это новый "587" .


Если вы получите тайм-аут в telnet, проверьте следующее:

  • имя хоста: обычно для пользователей используется "smtp.sendinblue.com" вместо "stmp-relay.sendinblue.com", "smtp.mandrill.com" вместо "smtp.mandrillapp". com "и т.д.
  • порт: 587 устарел. В настоящее время основные поставщики используют 2525 вместо этого. Основные облачные сервисы, такие как DigitalOcean, блокируют исходящие соединения с 587. Вот почему он будет работать на вашем ПК, но не на вашем сервере. Я даже не буду упоминать порт "25", который еще более устарел, чем 587. Кроме того, некоторые поставщики используют вместо них нестандартные или imap.
  • ipv6 vs ipv4: проверьте, переводится ли имя хоста в виде IPv4. Если нет, попробуйте отключить IPv6 (см. Другие ответы).
  • разрешение хоста: выполните ту же команду telnet на компьютере, который, как известно, работает с электронной почтой. Проверьте, является ли переведенный ip (часть xxx "Trying xxx..." ) одинаковой. Если нет, вернитесь на свой сервер и замените имя хоста на этот ip. Если работает, измените ваш /etc/hosts и заставите имя хоста использовать этот ip.

Ответ 5

Вы можете настроить Ubuntu на предпочтение IPv4 по протоколу IPv6. Таким образом, вы сможете отправлять электронные письма и доступ к сайтам только на IPv6. Измените /etc/gai.conf и раскомментируйте следующую строку:

precedence ::ffff:0:0/96 100

Ответ 6

Попробуйте это, если все выше не выполнено

Я решил его решить, добавив это в application.rb в config

 require 'net/http'

 require 'openssl'

 require 'resolv-replace'

Ответ 7

Если вы (или интернет в этом случае, так как этот вопрос является первым результатом для этой проблемы), тестируют Mailgun, вы можете получить эту ошибку, если используете порт 25. Измените порт на 587, хотя их документы/быстрые ссылки говорят 25 в порядке.