Rail Mailer "Net:: OpenTimeout: execution expired" Exception sur le serveur de production seulement
j'utilise Ruby MRI 2.0.0 et Rails 3.2.12 sur un VPS Ubuntu 12.04 TLS et j'essaie de configurer des notifications de courrier électronique dans mon application. ça marchait bien il y a quelques jours, mais plus maintenant. Mon Hébergeur Web est OVH.
mes paramètres 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 => 'sender@gmail.com',
:password => 'secret',
:authentication => 'plain',
:enable_starttls_auto => true
}
utilisant RAILS_ENV=production rails console
:
class MyMailer < ActionMailer::Base
def test_email
sender = "sender@gmail.com"
receiver = "receiver@example.com"
mail from: sender, to: receiver, subject: "Hello!", body: "World!!"
end
end
=> nil
MyMailer.test_email.deliver
La sortie:
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 >
j'ai essayé le suivant:
- le
exception_notification
gem a été ajouté à la configuration il y a quelques jours. J'ai essayé de commenter sa ligne dansGemfile
ainsi que sa configuration correspondante, et exécuterbundle install
. Après avoir redémarré le serveur, le problème est toujours présent, même si je supprime et recrée le gemset. - Tester sur une machine virtuelle (exactement la même configuration que le VPS, y compris des règles iptables): œuvres
- Désactiver des règles iptables: n' pas de travail
- se connecter manuellement à Gmail depuis le VPS en utilisant openssl: fonctionne (donc ce n'est pas un problème de pare - feu-voir ici: Se connecter à smtp.gmail.com via la ligne de commande );
- Active IMAP dans Gmail account options (it was disabled): ne fonctionne pas
- utiliser un compte Gmail différent: ne fonctionne pas
- remplacer Ruby 2.0.0 par Ruby 1.9.3
- surclassement en Rails 3.2.13
est-ce que quelqu'un a une idée possible sur la façon de résoudre ce problème?
Merci!
8 réponses
j'ai probablement eu le même problème, mon application de production n'a pas envoyé de mails bien que tout dans le développement fonctionnait bien. J'ai aussi eu l'erreur "Net::OpenTimeout".
mon problème était que J'utilisais un serveur Google en production, et il bloque les ports 25, 465 et 587 sur les connexions sortantes .
puisque J'utilisais Mandrill pour envoyer des mails, j'ai pu passer le port de connexion de 587 à 2525 et tout va bien maintenant.
voici aussi un correctif temporaire qui peut s'avérer pratique en attendant que votre hébergeur règle le problème:
ajouter les lignes suivantes à /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
Maintenant, les applications sont capables d'envoyer des e-mails.
vous pouvez toujours savoir si IPv6 est activé en appelant
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
du terminal. Deux réponses possibles: 0 => IPv6 est activé; 1 = > IPv6 désactivé.
de: https://serverfault.com/questions/512744/timeout-error-in-all-my-apps-for-every-call-to-smtp-servers
tout d'abord, faire une connexion directe avec Telnet:
telnet smtp-relay.sendinblue.com 587
Trying 94.143.17.4...
c'est le dépannage de connexion de base, et fonctionne avec n'importe quel fournisseur ou port. Remplacez SendBlue et le port 587 par votre nom d'hôte/port.
si vous obtenez cette erreur:
telnet: Unable to connect to remote host: Connection timed out
alors, le problème n'est pas dans les Rails.
Dans l'exemple ci-dessus, le problème est dans le numéro de port . Service comme sendinblue ou mandrill (je crois gmail aussi) ne supporte plus le port 587. "2525" est le nouveau "587" .
si vous obtenez un temps d'arrêt sur telnet, vérifiez ceci:
- nom d'hôte : c'est habituel pour les gens d'utiliser "smtp.sendinblue.com" au lieu de "stmp-relay.sendinblue.com", "smtp.mandrill.com" au lieu de "smtp.mandrillapp.com", et ainsi de suite.
- port : 587 est obsolète. Les principaux fournisseurs utilisent maintenant 2525. Principaux services cloud comme DigitalOcean, bloquent les connexions sortantes à 587 ainsi. C'est pourquoi il fonctionne sur votre pc, mais pas sur votre serveur. Je ne mentionnerai même pas le port" 25", qui est encore plus obsolète que le 587. De plus, certains fournisseurs utilisent plutôt des options spécifiques sans défaut ou imap.
- ipv6 vs ipv4 : vérifiez si le nom d'hôte est traduit en IPv4. Si ce n'est pas le cas, essayez de désactiver IPv6 (voir les autres réponses).
- hostname resolution : exécutez la même commande telnet sur une machine que vous savez que l'envoi d'e-mail fonctionne. Vérifiez si l'ip traduite (la partie xxx De " essayer xxx...") est la même. Sinon, retournez sur votre serveur et remplacez le nom d'hôte par cette adresse ip. Si cela fonctionne, changez votre/etc / hosts et forcez le nom d'hôte à utiliser cette adresse ip.
le problème était dû à une mauvaise configuration IPv6 sur le serveur de production et a maintenant été corrigé.
vous pouvez configurer Ubuntu pour qu'il préfère IPv4 à IPv6. Vous pourrez ainsi envoyer des e-mails et accéder à des sites IPv6 uniquement. Modifier /etc/gai.conf
et décommenter la ligne suivante:
precedence ::ffff:0:0/96 100
si vous (ou l'internet dans ce cas car cette question Est le premier résultat pour ce problème) testez Mailgun, vous pouvez obtenir cette erreur si vous utilisez le port 25
. Changer le port à 587
a fonctionné, même si leur docs/liens rapides dit 25
est ok à utiliser.
je les ai ajoutés à /etc/gai.conf in CentOS7 et ça a marché.
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
Essayez, si tous les ci-dessus échoue
Je l'ai résolu en ajoutant ceci dans l'application.rb sous config
require 'net/http' require 'openssl' require 'resolv-replace'