web-dev-qa-db-fra.com

Rails Mailer "Exception sur le serveur de production uniquement"

J'utilise Ruby MRI 2.0.0 et Rails 3.2.12 sur un VPS Ubuntu 12.04 TLS et j'essaie de configurer les notifications par courrier électronique dans mon application. Cela fonctionnait bien il y a quelques jours, mais plus maintenant. Mon hébergeur 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            => '[email protected]',
  :password             => 'secret',
  :authentication       => 'plain',
  :enable_starttls_auto => true
}

Utiliser 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

Le résultat:

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é ce qui suit:

  • La gemme exception_notification a été ajoutée à la configuration il y a quelques jours. J'ai essayé de commenter sa ligne dans Gemfile ainsi que sa configuration correspondante et d'exécuter bundle install. Après le redémarrage du serveur, le problème persiste, même si je supprime et recrée le gemset.
  • Testez-le sur une machine virtuelle (exactement la même configuration que le VPS, y compris les règles iptables): fonctionne
  • Désactiver les règles iptables: ne fonctionne pas
  • Connectez-vous manuellement à Gmail à partir du SMV à l'aide de openssl: works (ce n'est donc pas un problème de pare-feu - voir ici: Connexion à smtp.gmail.com via la ligne de commande );
  • Activer IMAP dans les options du compte Gmail (il était désactivé): ne fonctionne pas
  • Utilisez un autre compte Gmail: ne fonctionne pas
  • Remplacer Ruby 2.0.0 par Ruby 1.9.3
  • Mise à niveau vers Rails 3.2.13

Quelqu'un at-il une idée possible sur la façon de résoudre ce problème?

Merci!

33
mavenastic

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

5
mavenastic

J'avais probablement le même problème, mon application de production n'envoyait pas de courrier alors que tout était en cours de développement. J'ai aussi eu l'erreur "Net :: OpenTimeout".

Mon problème était que j'utilisais un serveur de Google en production, et qu'il bloquait les ports 25, 465 et 587 sur les connexions sortantes .

Depuis que j'utilisais Mandrill pour envoyer des mails, J'ai pu changer le port de connexion de 587 à 2525 et tout va bien maintenant.

16
Zippie

Commencez par établir une connexion directe avec Telnet:

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

Il s'agit du 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 actuel.

Si vous obtenez cette erreur:

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

alors, le problème n'est pas dans Rails.

Dans l'exemple ci-dessus, le problème réside dans le numéro de port. Des services comme sendinblue ou mandrill (je crois aussi en gmail) ne prennent plus en charge le port 587. "2525" est le nouveau "587".


Si vous obtenez un délai d'attente sur telnet, vérifiez ceci:

  1. hostname: il est habituel que les gens utilisent "smtp.sendinblue.com" au lieu de "stmp-relay.sendinblue.com", "smtp.mandrill.com" au lieu de "smtp.mandrillapp.com", etc. .
  2. port: 587 est obsolète. Les principaux fournisseurs utilisent maintenant 2525 à la place. Les principaux services cloud, comme DigitalOcean, bloquent également les connexions sortantes vers 587. C'est pourquoi cela fonctionnera sur votre ordinateur, mais pas sur votre serveur. Je ne mentionnerai même pas le port "25", qui est encore plus obsolète que le 587. En outre, certains fournisseurs utilisent des fournisseurs spécifiques autres que ceux par défaut ou imap.
  3. ipv6 vs ipv4: vérifie si le nom d'hôte est en train d'être traduit en IPv4. Sinon, essayez de désactiver IPv6 (voir les réponses des autres).
  4. hostname resolution: exécutez la même commande telnet sur une machine sur laquelle vous savez que l'envoi d'e-mails fonctionne. Vérifiez si l'adresse IP traduite (la partie xxx de "Trying xxx ...") est la même. Sinon, retournez sur votre serveur et remplacez le nom d'hôte par cette adresse IP. Si cela fonctionne, modifiez votre/etc/hosts et forcez le nom d'hôte à utiliser cette adresse IP.
14
Daniel Loureiro

Voici également une solution temporaire qui pourrait s'avérer utile en attendant que votre fournisseur d'hébergement résolve le problème:

Ajoutez 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 peuvent à nouveau envoyer des courriels.

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-tall-smtp-servers

13
Darme

Vous pouvez configurer Ubuntu pour préférer IPv4 à IPv6. De cette manière, vous pourrez envoyer des emails et accéder à des sites exclusivement IPv6. Éditez /etc/gai.conf et décommentez la ligne suivante:

precedence ::ffff:0:0/96 100
5
Sagar Ranglani

J'ai ajouté ces éléments à /etc/gai.conf dans CentOS7 et cela a fonctionné.

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
pebble8888

Essayez ceci, si tout ce qui précède échoue

Je l'ai résolu en ajoutant ceci dans application.rb sous config

 nécessite 'net/http' 

 nécessite 'openssl' 

 nécessite 'resolv-replace' 
0
Uma

Si vous (ou Internet dans ce cas car cette question est le premier résultat de ce problème) testez Mailgun, vous pouvez obtenir cette erreur si vous utilisez le port 25. Changez le port en 587 travaillé, même si leurs documents/liens rapides indiquent que 25 est correct à utiliser.

0
pjammer