Rails Mailer" Net::OpenTimeout: execution expired " Excepción solo en el servidor de producción


Estoy usando Ruby MRI 2.0.0 y Rails 3.2.12 en un Ubuntu 12.04 TLS VPS e intentando configurar notificaciones por correo electrónico en mi aplicación. Estaba funcionando bien hace unos días, pero ya no. Mi proveedor de alojamiento web es OVH.

Mis ajustes de 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
}

Usando 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

La salida:

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/ruby-2.0.0-p0@mygemset/gems/mail-2.4.4/lib/mail/network/delivery_methods/smtp.rb:144:in `deliver!'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/mail-2.4.4/lib/mail/message.rb:2034:in `do_delivery'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/mail-2.4.4/lib/mail/message.rb:229:in `block in deliver'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:415:in `block in deliver_mail'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `block in instrument'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `instrument'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:413:in `deliver_mail'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/mail-2.4.4/lib/mail/message.rb:229:in `deliver'
    from (irb):28
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
    from ~/.rvm/gems/ruby-2.0.0-p0@mygemset/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 >

He intentado lo siguiente:

  • La gema exception_notification se añadió a la configuración hace unos días. Traté de comentar su línea en Gemfile así como su correspondiente configuración y ejecutar bundle install. Después de reiniciar el servidor, el problema sigue presente, incluso si elimino y recreo el conjunto de gemas.
  • Pruébelo en una máquina virtual (exactamente la misma configuración que el VPS, incluidas las reglas de iptables): funciona
  • Desactivar las reglas de iptables: no funciona
  • Conectarse manualmente a Gmail desde el VPS usando openssl: funciona (así que esto no es un problema de firewall-ver aquí: Conectarse a smtp.gmail.com a través del comando línea);
  • Habilitar IMAP en las opciones de la cuenta de Gmail (se deshabilitó): no funciona
  • Usar una cuenta de Gmail diferente: no funciona
  • Reemplace Ruby 2.0.0 por Ruby 1.9.3
  • Actualizar a Rails 3.2.13

¿Alguien tiene alguna pista sobre cómo resolver este problema?

Gracias!

Author: Community, 2013-04-16

8 answers

Probablemente tuve el mismo problema, mi aplicación de producción no enviaba correos aunque todo en desarrollo estaba funcionando bien. También recibí el error "Net:: OpenTimeout".

Mi problema era que estaba usando un servidor de Google en producción, y bloquea los puertos 25, 465 y 587 en las conexiones salientes.

Dado que estaba usando Mandrill para enviar correos, pude cambiar el puerto de conexión de 587 a 2525 y todo está bien ahora.

 16
Author: Zippie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-24 08:02:11

Aquí también hay una solución temporal que puede ser útil mientras espera a que su proveedor de alojamiento solucione el problema:

Añádanse las siguientes líneas a /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

Ahora las aplicaciones son capaces de enviar correos electrónicos de nuevo.

Siempre puede saber si IPv6 está habilitado llamando a

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

Desde la terminal. Dos posibles respuestas: 0 = > IPv6 está habilitado; 1 = > IPv6 desactivado.

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

 13
Author: Darme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:13:48

Primero, haga una conexión directa con Telnet:

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

Esta es la solución básica de problemas de conexión, y funciona con cualquier proveedor o puerto. Reemplace SendBlue y el puerto 587 con su nombre de host/puerto real.

Si obtiene este error:

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

Entonces, el problema no está en Rails.

En el ejemplo anterior, el problema está en el número de puerto . Servicios como sendinblue o mandrill (creo que gmail también) ya no admiten el puerto 587. "2525" es el nuevo " 587 " .


Si obtiene un tiempo de espera en telnet, marque esto:

  1. hostname : es habitual que la gente use "smtp.sendinblue.com" en lugar de "stmp-relay.sendinblue.com", "smtp.mandrill.com" en lugar de "smtp.mandrillapp.com", y así sucesivamente.
  2. port : 587 es obsoleto. Los principales proveedores ahora están utilizando 2525 en su lugar. Los principales servicios en la nube como DigitalOcean, también bloquean las conexiones salientes a 587. Es por eso que funcionará en su pc, pero no en su servidor. Ni siquiera mencionaré el puerto" 25", que es aún más obsoleto que el 587. Además, algunos proveedores utilizan los no predeterminados específicos en su lugar o imap.
  3. ipv6 vs ipv4: compruebe si el nombre de host se está traduciendo como IPv4. Si no es así, intente deshabilitar IPv6 (consulte otras respuestas).
  4. hostname resolution: ejecute el mismo comando telnet en una máquina que sepa que el envío de correo electrónico está funcionando. Compruebe si la ip traducida (la parte xxx de "Tratando xxx...") es lo mismo. Si no, vuelva a su servidor y reemplace el nombre de host con esta ip. Si funciona, cambie su/etc / hosts y fuerce el nombre de host a usar esta ip.
 13
Author: Daniel Loureiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 05:07:31

El problema se debió a un error de configuración de IPv6 en el servidor de producción y ahora se ha solucionado.

 5
Author: mavenastic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-22 08:34:41

Puede configurar Ubuntu para que prefiera IPv4 sobre IPv6. De esta manera podrá enviar correos electrónicos y acceder a sitios solo IPv6. Edita /etc/gai.conf y descomenta la siguiente línea:

precedence ::ffff:0:0/96 100
 4
Author: Sagar Ranglani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 09:34:47

Si usted (o Internet en este caso, ya que esta pregunta es el primer resultado de este problema) está probando Mailgun, puede obtener este error si está utilizando port 25. Cambiar el puerto a 587 funcionó, a pesar de que sus documentos/enlaces rápidos dicen 25 está bien usarlo.

 0
Author: pjammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-18 10:51:52

He añadido esto a /etc/gai.conf en CentOS7 y funcionó.

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
Author: pebble8888,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-01 09:23:20

Prueba esto, si todo lo anterior falla

Lo resolví agregando esto en la aplicación.rb under config

 require 'net/http'

 require 'openssl'

 require 'resolv-replace'
 0
Author: Uma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 08:19:41