39

我在 Ubuntu 12.04 TLS VPS 上使用 Ruby MRI 2.0.0 和 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​​. 重新启动服务器后,即使我删除并重新创建 gemset,问题仍然存在。
  • 在虚拟机上测试它(与 VPS 完全相同的设置,包括 iptables 规则):有效
  • 禁用 iptables 规则:不起作用
  • 使用 openssl 从 VPS 手动连接到 Gmail:工作(所以这不是防火墙问题 - 请参见此处:通过命令行连接到 smtp.gmail.com);
  • 在 Gmail 帐户选项中启用 IMAP(已禁用):不起作用
  • 使用其他 Gmail 帐户:不起作用
  • 用 Ruby 1.9.3 替换 Ruby 2.0.0
  • 升级到 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. 主机名:人们通常使用“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。
于 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

从终端。两个可能的答案: 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 配置错误造成的,现已修复。

于 2013-04-22T08:34:41.587 回答
5

您可以将 Ubuntu 配置为首选 IPv4 而不是 IPv6。通过这种方式,您将能够发送电子邮件并访问仅限 IPv6 的站点。编辑/etc/gai.conf并取消注释以下行:

precedence ::ffff:0:0/96 100
于 2015-04-29T09:34:47.987 回答
3

试试这个,如果以上都失败了

我通过在config下的application.rb中添加它来解决它

需要'net/http'

 需要'openssl'

 需要“解决替换”
于 2017-09-06T08:19:41.603 回答
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:title

于 2016-10-01T09:23:20.690 回答
0

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

于 2016-06-18T10:51:52.673 回答