ruby-on-rails smtp actionmailer exception-notification

ruby on rails - Rails Mailer "Net:: OpenTimeout: ejecución expiró" Excepción en el servidor de producción solamente



ruby-on-rails smtp (8)

Estoy usando Ruby MRI 2.0.0 y Rails 3.2.12 en Ubuntu 12.04 TLS VPS e intento configurar las notificaciones por correo electrónico en mi aplicación. Funcionaba bien hace unos días, pero ya no funciona. Mi servidor web es OVH.

Mi configuración 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 >

Intenté lo siguiente:

  • La gema exception_notification se agregó a la configuración hace unos días. Traté de comentar su línea en Gemfile , así como su configuración coincidente, y ejecutar la bundle install . Después de reiniciar el servidor, el problema sigue presente, incluso si elimino y vuelvo a crear el gemset.
  • Pruébelo en una máquina virtual (exactamente la misma configuración que el VPS, incluidas las reglas de iptables): funciona
  • Deshabilitar reglas de iptables: no funciona
  • Conéctese manualmente a Gmail desde el VPS utilizando openssl: funciona (por lo que este no es un problema de firewall, consulte aquí: Conexión a smtp.gmail.com a través de la línea de comandos );
  • Habilitar IMAP en las opciones de cuenta de Gmail (estaba deshabilitado): no funciona
  • Usa una cuenta de Gmail diferente: no funciona
  • Reemplazar Ruby 2.0.0 por Ruby 1.9.3
  • Actualizar a Rails 3.2.13

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

¡Gracias!


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



Puede configurar Ubuntu para que prefiera IPv4 sobre IPv6. De esta forma, podrá enviar correos electrónicos y acceder a sitios exclusivos de IPv6. Edite /etc/gai.conf y /etc/gai.conf comentario de la siguiente línea:

precedence ::ffff:0:0/96 100


Primero, haga una conexión directa con Telnet:

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

Esta es la resolución de problemas de conexión básica, 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 también gmail) ya no son compatibles con el puerto 587. "2525" es el nuevo "587" .

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

  1. nombre de host : es habitual que las personas usen "smtp.sendinblue.com" en lugar de "stmp-relay.sendinblue.com", "smtp.mandrill.com" en lugar de "smtp.mandrillapp.com", y así sucesivamente.
  2. puerto : 587 es obsoleto. Los principales proveedores ahora están usando 2525 en su lugar. Los principales servicios en la nube como Digital Ocean, bloquean las conexiones salientes a 587 también. Es por eso que funcionará en su PC, pero no en su servidor. Ni siquiera mencionaré el puerto "25", que es incluso más obsoleto que el 587. Además, algunos proveedores utilizan en su lugar no específicos predeterminados o imap.
  3. ipv6 vs ipv4 : compruebe si el nombre de host se está traduciendo como IPv4. Si no, intente deshabilitar IPv6 (vea otras respuestas).
  4. resolución de nombre de host : ejecute el mismo comando de 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 "Probar xxx ...") es la misma. Si no, regrese a su servidor y reemplace el nombre de host con esta ip. Si funciona, cambie su / etc / hosts y fuerce el nombre de host para usar esta ip.

Si usted (o Internet, en este caso, ya que esta pregunta es el primer resultado de este problema) están probando Mailgun, puede obtener este error si está utilizando el puerto 25 . Cambia el puerto a 587 trabajado, aunque sus documentos / enlaces rápidos dicen que 25 está bien para usar.



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

Agregue 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 pueden enviar correos electrónicos nuevamente.

Siempre puedes saber si IPv6 está habilitado para llamar

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

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

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


Pruebe esto, si todo lo anterior falla

Lo solucioné agregando esto en application.rb bajo config

require ''net/http'' require ''openssl'' require ''resolv-replace''