it-swarm.com.ru

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

Я использую Ruby MRI 2.0.0 и Rails 3.2.12 на VLS Ubuntu 12.04 TLS и пытаюсь настроить уведомления по электронной почте в своем приложении. Несколько дней назад все работало нормально, но не больше. Мой веб-хостинг 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): works
  • Отключить правила iptables: не работает
  • Вручную подключитесь к Gmail из VPS с помощью openssl: works (так что это не проблема брандмауэра - см. Здесь: Подключение к smtp.gmail.com через командную строку );
  • Включить IMAP в настройках учетной записи Gmail (было отключено): не работает
  • Используйте другую учетную запись Gmail: не работает
  • Замените Ruby 2.0.0 на Ruby 1.9.3
  • Обновление до Rails 3.2.13

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

Спасибо!

33
mavenastic

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

5
mavenastic

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

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

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

16
Zippie

Сначала создайте прямое соединение с 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, проверьте это:

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

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

Добавьте следующие строки в /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

13
Darme

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

precedence ::ffff:0:0/96 100
5
Sagar Ranglani

Я добавил их в /etc/gai.conf в CentOS7, и это сработало.

label       ::1/128        0
label       ::/0           1
label       2002::/16      2
label       ::/96          3
label       ::ffff:0:0/96  4
precedence  ::1/128        50
precedence  ::/0           40
precedence  2002::/16      30
precedence  ::/96          20
precedence  ::ffff:0:0/96  100

http://blog.asiantuntijakaveri.fi/2014/12/prefer-ipv4-over-ipv6-on-centos-6.html:title

0
pebble8888

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

Я получил это, решив, добавив это в application.rb под конфиг

 требует 'net/http' 

 требуют 'openssl' 

 требует 'resolv-replace' 
0
Uma

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

0
pjammer