使用Rails邮件程序的Net :: OpenTimeout(执行过期)异常

Mic*_*Rum 7 smtp ruby-on-rails actionmailer

我在生产服务器上发送电子邮件时遇到问题.当邮件程序处理新邮件时,调用异常Net::OpenTimeout (execution expired)

我的smtp设置:

#settings.yml
production:
  smtp:
    address:        smtp.gmail.com
    port:           587
    domain:         mydomain.net
    user_name:      username@gmail.com
    password:       password
    authentication: plain
    enable_starttls_auto: true
Run Code Online (Sandbox Code Playgroud)

我的环境设置:

  #production.rb
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = Settings.smtp.symbolize_keys
Run Code Online (Sandbox Code Playgroud)

来自日志:

Sent mail to username@gmail.com (30010.1ms)
I, [2014-10-15T12:59:22.371563 #19779]  INFO -- : Completed 500 Internal Server Error in 30051ms
F, [2014-10-15T12:59:22.373984 #19779] FATAL -- :.
Net::OpenTimeout (execution expired):
app/controllers/subscribers_controller.rb:9:in `create'
Run Code Online (Sandbox Code Playgroud)

Mic*_*Rum 8

我的VPS提供商(DigitalOcean)默认阻止了IPv6上的SMTP :(

我必须在服务器上使用下一个配置禁用IPv6:

# /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1 
net.ipv6.conf.default.disable_ipv6 = 1 
net.ipv6.conf.lo.disable_ipv6 = 1 
Run Code Online (Sandbox Code Playgroud)

应用设置:

$ sysctl -p
Run Code Online (Sandbox Code Playgroud)

取消注释下一行/etc/gai.conf以更喜欢IPv4:

precedence ::ffff:0:0/96 100
Run Code Online (Sandbox Code Playgroud)

并从/etc/resolv.conf以下位置删除IPv6 DNS :

nameserver 2001:4860:4860::8844 # remove lines like this 
nameserver 8.8.8.8 #don't remove
Run Code Online (Sandbox Code Playgroud)

然后重启应用程序和Nginx(可选)