39

I am using Ruby MRI 2.0.0 and Rails 3.2.12 on a Ubuntu 12.04 TLS VPS and attempting to setup email notifications in my app. It was working fine a few days ago, but not anymore. My web host is OVH.

My SMTP settings:

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
}

Using 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

The output:

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 >

I tried the following:

  • The exception_notification gem was added to the setup a few days ago. I tried to comment its line in Gemfile as well as its matching configuration, and run bundle install. After restarting the server, the issue is still present, even if I delete and recreate the gemset.
  • Test it out on a virtual machine (exact same setup as the VPS including iptables rules): works
  • Disable iptables rules: does not work
  • openssl を使用して VPS から手動で Gmail に接続します:動作します(したがって、これはファイアウォールの問題ではありません - ここを参照してください:コマンドライン経由で smtp.gmail.com に接続する)。
  • Gmail アカウント オプションで IMAP を有効にする (無効になっていました):動作しません
  • 別の Gmail アカウントを使用する:機能しません
  • Ruby 2.0.0 を Ruby 1.9.3 に置き換えます
  • Rails 3.2.13 へのアップグレード

誰かがこの問題を解決する方法について手がかりを持っていますか?

ありがとう!

4

8 に答える 8

20

まず、Telnet で直接接続します。

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

これは基本的な接続のトラブルシューティングであり、任意のプロバイダーまたはポートで機能します。SendBlue と 587 ポートを実際のホスト名/ポートに置き換えます。

このエラーが発生した場合:

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

ならば、問題は Rails にはありません。

上記の例では、問題はポート番号にあります。sendinblue や mandrill (gmail もそうだと思います) などのサービスは、587 ポートをサポートしなくなりました。「2525」は新しい「587」です。


telnet でタイムアウトが発生した場合は、次のことを確認してください。

  1. hostname : 「stmp-relay.sendinblue.com」の代わりに「smtp.sendinblue.com」、「smtp.mandrillapp.com」の代わりに「smtp.mandrill.com」などを使用するのが普通です。
  2. port : 587 は廃止されました。主要なプロバイダーは現在、代わりに 2525 を使用しています。DigitalOcean などの主要なクラウド サービスも、587 への発信接続をブロックします。そのため、PC では動作しますが、サーバーでは動作しません。「25」ポートについては言及しません。これは 587 よりもさらに時代遅れです。また、プロバイダーによっては、代わりに特定のデフォルト以外のポートや imap を使用しています。
  3. ipv6 vs ipv4 : ホスト名が IPv4 として変換されているかどうかを確認します。そうでない場合は、IPv6 を無効にしてみてください (他の回答を参照)。
  4. ホスト名の解決: メール送信が機能していることがわかっているマシンで同じ telnet コマンドを実行します。変換された IP (「Trying xxx...」の xxx 部分) が同じかどうかを確認します。そうでない場合は、サーバーに戻り、ホスト名をこの IP に置き換えます。機能する場合は、/etc/hosts を変更し、ホスト名にこの IP を使用するよう強制します。
于 2016-04-27T05:01:14.003 に答える
17

私はおそらく同じ問題を抱えていました。開発中のすべてが正常に機能していたにもかかわらず、本番アプリケーションはメールを送信しませんでした。「Net::OpenTimeout」エラーも発生しました。

私の問題は、本番環境で Google サーバーを使用していて、アウトバウンド接続でポート 25、465、および 587 をブロックしていたことです。

メールの送信に Mandrill を使用していたため、接続ポートを 587 から 2525 に切り替えることができ、現在はすべて問題ありません。

于 2014-06-24T08:02:11.637 に答える
14

ホスティングプロバイダーが問題を修正するのを待っている間に役立つ一時的な修正もここにあります:

次の行を に追加します/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

次のコマンドを使用して、sysctl サービスをリロードします。

sudo sysctl -p

これで、アプリは再びメールを送信できるようになりました。

IPv6 が有効になっているかどうかを常に知ることができます。

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

ターミナルから。考えられる答えは 2 つあります。0 => IPv6 が有効です。1 => IPv6 無効。

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

于 2013-10-15T09:18:10.147 に答える
5

IPv6 よりも IPv4 を優先するように Ubuntu を構成できます。このようにして、メールを送信したり、IPv6 専用サイトにアクセスしたりできます。/etc/gai.conf次の行を編集してコメントを外します。

precedence ::ffff:0:0/96 100
于 2015-04-29T09:34:47.987 に答える
5

この問題は、運用サーバーでの IPv6 の構成ミスが原因であり、現在は修正されています。

于 2013-04-22T08:34:41.587 に答える
0

これらを CentOS7 の /etc/gai.conf に追加したところ、機能しました。

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:タイトル

于 2016-10-01T09:23:20.690 に答える