2013-04-16 16 views
29

Używam Ruby MRI 2.0.0 i Rails 3.2.12 na Ubuntu 12.04 TLS VPS i próbuję skonfigurować powiadomienia e-mail w mojej aplikacji. To działało dobrze kilka dni temu, ale już nie. Mój usługodawca internetowy to OVH.Rails Mailer "Net :: OpenTimeout: wykonanie wygasło" Wyjątek na serwerze produkcyjnym

Moje ustawienia 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 
} 

Korzystanie 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 

Wyjście:

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/[email protected]/gems/mail-2.4.4/lib/mail/network/delivery_methods/smtp.rb:144:in `deliver!' 
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:2034:in `do_delivery' 
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:229:in `block in deliver' 
    from ~/.rvm/gems/[email protected]/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:415:in `block in deliver_mail' 
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `block in instrument' 
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    from ~/.rvm/gems/[email protected]/gems/activesupport-3.2.12/lib/active_support/notifications.rb:123:in `instrument' 
    from ~/.rvm/gems/[email protected]/gems/actionmailer-3.2.12/lib/action_mailer/base.rb:413:in `deliver_mail' 
    from ~/.rvm/gems/[email protected]/gems/mail-2.4.4/lib/mail/message.rb:229:in `deliver' 
    from (irb):28 
    from ~/.rvm/gems/[email protected]/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start' 
    from ~/.rvm/gems/[email protected]/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start' 
    from ~/.rvm/gems/[email protected]/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 > 

Próbowałem następujące:

  • Klejnot exception_notification został dodany do instalacji kilka dni temu. Próbowałem skomentować jego linię w Gemfile, a także jej zgodną konfigurację i uruchomić bundle install. Po ponownym uruchomieniu serwera problem nadal występuje, nawet jeśli usunę go i ponownie utworzy go.
  • przetestować go na maszynie wirtualnej (dokładnie to samo ustawienie jak VPS tym regułami iptables): pracuje
  • Wyłącz iptables zasady: nie działa
  • Ręczne łączenie Gmail z VPS wykorzystaniem OpenSSL: działa (więc nie jest to problem z zaporą ogniową - patrz tutaj: Connecting to smtp.gmail.com via command line);
  • Włącz IMAP w opcji konta Gmail (było wyłączone): nie działa
  • użyć innego konta Gmail: nie działa
  • Wymień Ruby 2.0.0 Ruby 1.9.3 przez
  • Uaktualnij do szyn 3.2.13

Czy ktoś ma możliwą wskazówkę, jak rozwiązać ten problem?

Dzięki!

+0

Oto kolejny przejaw: wykonanie upłynął /ree-187/lib/ruby/1.8/timeout.rb:64:in 'open ' .../vendor/plugins/action_mailer_optional_tls/lib/sm tp_tls.rb: 40: in 'do_tls_start ' /.../vendor/plugins/action_mailer_optional_tls/lib/smtp_tls.rb:40:in' do_tls_start' ... – rogerdpack

Odpowiedz

4

Problem został spowodowany błędną konfiguracją protokołu IPv6 na serwerze produkcyjnym i została naprawiona.

+0

Ten sam problem tutaj, czy wiesz, jak rozpoznać tę błędną konfigurację ? Czy istnieje jakiś plik dziennika do sprawdzenia lub coś takiego? – Darme

+1

Coś, co zauważyłem: kiedy próbuję połączyć się z smpt.gmail.co przez linię poleceń, działa, ale najpierw próbuje z adresem IPv6 i czeka na kilka sekund, dopiero po tym długim okresie próbuje z prostym IP i łączy! Możliwe, że po raz pierwszy moja aplikacja przestaje działać ... teraz pytanie brzmi: czy to może być objaw zauważenia tego rodzaju błędnej konfiguracji? – Darme

+0

Nie jestem pewien, czy to jest problem, ale mam te same objawy ... jak to naprawić? – wulftone

13

Oto również tymczasowym rozwiązaniem, które mogą się przydać podczas oczekiwania na dostawcę usług hostingowych, aby rozwiązać ten problem:

Dodaj poniższe linie do /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 

Teraz aplikacje są w stanie wyślij ponownie e-maile.

Zawsze można wiedzieć, czy IPv6 jest włączony nazywając

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

od terminalu. Dwie możliwe odpowiedzi: 0 => IPv6 jest włączone; 1 => IPv6 wyłączony.

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

+0

Należy pamiętać, że [odpowiedzi dotyczące tylko łącza] (http://meta.stackoverflow.com/tags/link-only-answers/info) są odradzane, odpowiedzi na pytania powinny być punktem końcowym wyszukiwania rozwiązania (w porównaniu do odpowiedzi). jeszcze jeden przystanek referencji, które z czasem zanikają). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

+0

Ten nie działał dla mnie nawet po ponownym uruchomieniu sysctl.conf, aby ponownie załadować –

12

pewnie miał ten sam problem, moja aplikacja produkcja nie wysyłać e-maile, chociaż wszystko było w porządku w rozwoju pracy. Dostałem również błąd "Net :: OpenTimeout".

Mój problem polegał na tym, że korzystałem z serwera Google w produkcji, and it blocks ports 25, 465 and 587 on outbound connections.

Ponieważ używałem Mandrill do wysyłania maili, I was able to switch the connecting port from 587 to 2525 and everything is okay now.

+2

Używam również chmury Google i zmieniłem mój port smtp z 587 na 2525 i działa dobrze! Dzięki! – lucianosousa

+0

Posiadałem zestaw reguł iptables, który nie zezwalał na połączenia wyjściowe do portu 465 (serwer zarządzany samodzielnie) – Tyron

+1

@lucianosousa, dziękuję, musiałem użyć 2587, opisałem tutaj http://docs.aws.amazon.com/ses/latest /DeveloperGuide/smtp-connect.html – juanpastas

4

Można skonfigurować Ubuntu wolą IPv4 na IPv6. W ten sposób będziesz mógł wysyłać wiadomości e-mail i uzyskiwać dostęp tylko do witryn opartych na IPv6. Edytować /etc/gai.conf i usuń następujący wiersz:

precedence ::ffff:0:0/96 100 
+1

to mi się udało, dzięki! – mbajur

0

Jeśli (lub internet w tym przypadku kwestia ta jest pierwszym rezultatem tego problemu) testują Mailgun, można dostać ten błąd, jeśli używasz portu 25.Zmień port na 587, nawet jeśli ich dokumenty/szybkie linki mówią, że 25 można używać.

+0

Co zabawne, port 587 nie działał dla mnie, a port 25 go naprawił. –

1

Spróbuj tego, jeśli wszystkie powyższe nie

mam go rozwiązać dodając ten w environment.rb pod config

 
require 'net/http' 

require 'openssl' 

require 'resolv-replace' 
Powiązane problemy