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 dans Gemfile ainsi que sa configuration correspondante, et exécuter bundle 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!

31
demandé sur Community 2013-04-16 18:47:32

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.

16
répondu Zippie 2014-06-24 08:02:11

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

13
répondu Darme 2017-04-13 12:13:48

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:

  1. 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.
  2. 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.
  3. 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).
  4. 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.
13
répondu Daniel Loureiro 2016-04-27 05:07:31

le problème était dû à une mauvaise configuration IPv6 sur le serveur de production et a maintenant été corrigé.

5
répondu mavenastic 2013-04-22 08:34:41

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
4
répondu Sagar Ranglani 2015-04-29 09:34:47

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.

0
répondu pjammer 2016-06-18 10:51:52

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

0
répondu pebble8888 2016-10-01 09:23:20

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'
0
répondu Uma 2017-09-06 08:19:41