Rails的梅勒“的Net :: OpenTimeout:执行过期”例外唯一的生产服务器上(Rail

2019-08-31 08:14发布

我使用Ruby 2.0.0 MRI和Ubuntu的12.04 TLS VPS的Rails 3.2.12,并试图设置电子邮件通知我的应用程序。 这是工作的罚款前几天,但现在不是了。 我的虚拟主机是OVH。

我的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
}

使用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

输出:

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 >

我试过如下:

  • exception_notification宝石加入到设置在几天前。 我试图评论它的线Gemfile以及与其相配套的配置,并运行bundle install 。 重新启动服务器后,问题仍然存在,即使我删除并重新创建宝石。
  • 测试它在虚拟机上(完全相同的设置作为VPS包括iptables规则): 作品
  • 禁用iptables规则: 不工作
  • 使用OpenSSL的从VPS手动连接到Gmail: 作品 (所以这不是一个防火墙的问题-在这里看到: 通过命令行连接到smtp.gmail.com );
  • 启用Gmail帐户的选项IMAP(它被禁用): 不工作
  • 使用不同的Gmail帐户: 不工作
  • 由红宝石1.9.3更换红宝石2.0.0
  • 升级到Rails 3.2.13

是否有人有一个可能的线索,如何解决这个问题?

谢谢!

Answer 1:

我可能有同样的问题,我的生产应用程序,虽然一切都在发展工作正常未发送邮件。 我也得到了“网:: OpenTimeout”的错误。

我的问题是,我是在生产中使用谷歌的服务器上, 并阻止端口25,出站连接465和587 。

由于我是用山魈发送电子邮件, 我是能够连接端口切换从587到2525和现在一切正常。



Answer 2:

首先,做Telnet方式直接连接:

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

这是基本的连接故障排除,并与任何供应商或端口工作正常。 更换SendBlue和587端口,您的实际主机名/端口。

如果您收到此错误:

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

那么,这个问题是不是在导轨上。

在上面的例子中,问题是在端口号 。 像sendinblue或山魈(我认为Gmail将太)服务不支持587端口了。 “2525”是新的“587”。


如果你在远程登录超时,检查:

  1. 主机名 :这是平常人用“smtp.sendinblue.com”而不是“stmp-relay.sendinblue.com”,“smtp.mandrill.com”,而不是“smtp.mandrillapp.com”,等等。
  2. 端口 :587已过时。 现在主要提供商使用2525来代替。 像DigitalOcean主要的云服务,阻止对587传出连接为好。 这就是为什么它会在你的电脑工作,但不是你的服务器上。 我甚至不会提“25”端口,比587。此外,一些供应商使用特定的非默认的替代或IMAP这更加陈旧。
  3. 命令ipv6 VS IPv4的 :检查主机名被翻译成IPv4的。 如果没有,尝试禁用IPv6(见别人的答案)。
  4. 主机名解析 :你知道的电子邮件发送工作的机器上运行相同的telnet命令。 检查转换后的IP(“尝试XXX ......”的一部分XXX)是一样的。 如果没有,回到你的服务器,并使用该IP代替主机名。 如果作品,改变你的/ etc / hosts和强制主机使用此IP。


Answer 3:

这里也是可以派上用场,同时等待你的托管服务提供商来解决这一问题的临时修复:

添加以下行到/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

现在,应用程序能够重新发送电子邮件。

您可以随时知道是否启用IPv6通话

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

从终端。 两个可能的答案:0 =>启用IPv6; 1 => IPv6的禁用。

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



Answer 4:

这个问题是由于在生产服务器上的IPv6配置错误已得到修复。



Answer 5:

您可以配置Ubuntu的喜欢IPv6上的IPv4。 这样,您将能够发送电子邮件和访问仅支持IPv6的网站。 编辑/etc/gai.conf和下面一行的注解:

precedence ::ffff:0:0/96 100


Answer 6:

如果您(或因为这问题是针对此问题的第一个结果这种情况下,互联网)正在测试Mailgun,你可以,如果你正在使用的端口得到这个错误25 。 更改端口587的工作,即使他们的文档/快速链接说25是确定使用。



Answer 7:

我说这些在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:title



Answer 8:

试试这个,如果上述所有失败

我把它通过在配置增加这个在application.rb中解决

 require 'net/http'

 require 'openssl'

 require 'resolv-replace'


文章来源: Rails Mailer “Net::OpenTimeout: execution expired” Exception on production server only