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 enGemfile
, así como su configuración coincidente, y ejecutar labundle 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.
Probablemente tuve el mismo problema, mi aplicación de producción no envió correos, aunque todo en desarrollo funcionaba 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 de salida .
Como estaba usando Mandrill para enviar correos, pude cambiar el puerto de conexión de 587 a 2525 y todo está bien ahora.
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:
- 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.
- 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.
- ipv6 vs ipv4 : compruebe si el nombre de host se está traduciendo como IPv4. Si no, intente deshabilitar IPv6 (vea otras respuestas).
- 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.
Los agregué 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
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''