Rails Mailer “Net::OpenTimeout: execution expired” Exception on production server only

。_饼干妹妹 提交于 2019-11-28 06:14:27

I probably had the same issue, my production application didn't send mails although everything in development was working fine. I also got the "Net::OpenTimeout" error.

My problem was that i was using a Google server in production, and it blocks ports 25, 465 and 587 on outbound connections.

Since I was using Mandrill for sending mails, I was able to switch the connecting port from 587 to 2525 and everything is okay now.

First, do a direct connection with Telnet:

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

This is the basic connection troubleshooting, and works with any provider or port. Replace SendBlue and the 587 port with your actual hostname/port.

If you get this error:

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

then, the problem isn't in Rails.

In the above example, the problem is in the port number. Services like sendinblue or mandrill (I believe gmail too) don't support the 587 port anymore. "2525" is the new "587".


If you get a timeout on telnet, check this:

  1. hostname: it's usual to people use "smtp.sendinblue.com" instead of "stmp-relay.sendinblue.com", "smtp.mandrill.com" instead of "smtp.mandrillapp.com", and so on.
  2. port: 587 is obsolete. Major providers are now using 2525 instead. Major cloud services like DigitalOcean, block outgoing connections to 587 as well. That's why it will work on your pc, but not on your server. I won't even mention the "25" port, which is even more obsolete than 587. Also, some providers use specific non-default ones instead or imap.
  3. ipv6 vs ipv4: check if the hostname is being translated as a IPv4. If not, try to disable IPv6 (see others answers).
  4. hostname resolution: run the same telnet command on a machine that you know the email sending is working. Check if the translated ip (the xxx part of "Trying xxx...") is the same. If not, go back to your server and replace the hostname with this ip. If works, change your /etc/hosts and force the hostname to use this ip.
Darme

Here is also a temporary fix that may come in handy while waiting for your hosting provider to fix the issue:

Add the following lines to /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

Now the apps are able to send emails again.

You can always know if IPv6 is enabled calling

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

from terminal. Two possible answers: 0 => IPv6 is enabled; 1 => IPv6 disabled.

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

The issue was due to an IPv6 misconfiguration on the production server and has now been fixed.

You can configure Ubuntu to prefer IPv4 over IPv6. This way you will be able to send emails and access IPv6-only sites. Edit /etc/gai.conf and uncomment the following line:

precedence ::ffff:0:0/96 100

If you (or the internet in this case as this question is the first result for this problem) are testing Mailgun, you may get this error if you're using port 25. Change the port to 587 worked, even though their docs/quick links says 25 is ok to use.

I added these to /etc/gai.conf in CentOS7 and it worked.

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

Try this, if all above fails

I got it solved by adding this in application.rb under config

 require 'net/http'

 require 'openssl'

 require 'resolv-replace'
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!