Ответ 1
Проблема связана с неправильной конфигурацией IPv6 на рабочем сервере и теперь исправлена.
Я использую Ruby MRI 2.0.0 и Rails 3.2.12 на UBS Ubuntu 12.04 TLS VPS и пытаюсь настроить уведомления по электронной почте в своем приложении. Он работал нормально несколько дней назад, но не больше. Мой веб-хост - 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 => '[email protected]',
:password => 'secret',
:authentication => 'plain',
:enable_starttls_auto => true
}
Использование 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
Выход:
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 >
Я попробовал следующее:
exception_notification
был добавлен в настройку несколько дней назад. Я попытался прокомментировать его строку в Gemfile
, а также ее соответствующую конфигурацию и запустил bundle install
. После перезапуска сервера проблема все еще присутствует, даже если я удалю и заново создаю gemset.Есть ли у кого-нибудь возможность понять, как решить эту проблему?
Спасибо!
Проблема связана с неправильной конфигурацией IPv6 на рабочем сервере и теперь исправлена.
Вот также временное исправление, которое может пригодиться, ожидая, пока ваш хостинг-провайдер устранит проблему:
Добавьте следующие строки в /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
У меня, вероятно, была такая же проблема, мое приложение для производства не отправляло письма, хотя все в разработке работало нормально. Я также получил ошибку "Net:: OpenTimeout".
Моя проблема заключалась в том, что я использовал сервер Google на производстве, и блокирует порты 25, 465 и 587 для исходящих подключений.
Поскольку я использовал Mandrill для отправки писем, Мне удалось переключить соединительный порт с 587 на 2525, и теперь все в порядке.
Сначала сделайте прямое соединение с 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, проверьте следующее:
Вы можете настроить Ubuntu на предпочтение IPv4 по протоколу IPv6. Таким образом, вы сможете отправлять электронные письма и доступ к сайтам только на IPv6. Измените /etc/gai.conf
и раскомментируйте следующую строку:
precedence ::ffff:0:0/96 100
Попробуйте это, если все выше не выполнено
Я решил его решить, добавив это в application.rb в config
require 'net/http' require 'openssl' require 'resolv-replace'
Если вы (или интернет в этом случае, так как этот вопрос является первым результатом для этой проблемы), тестируют Mailgun, вы можете получить эту ошибку, если используете порт 25
. Измените порт на 587
, хотя их документы/быстрые ссылки говорят 25
в порядке.
Я добавил их в /etc/gai.conf в CentOS7 и работал.
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