Nano Hash - криптовалюты, майнинг, программирование

Исключение Net::OpenTimeout при отправке почты с помощью Sendgrid из приложения Rails 4 в Google Compute Engine

Я развернул приложение Rails 4 с помощью Capistrano в экземпляре Google Compute Engine под управлением Debian 7. Я использую Nginx в качестве веб-сервера и Passenger в качестве сервера приложений. Для отправки электронных писем я использую Sendgrid, и в моем файле staging.rb есть следующее:

config.action_mailer.default_url_options = { host: 'smtp.sendgrid.net', port: 2525 }
config.action_mailer.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
    :user_name => '<my_sendgrid_username>',
    :password => '<my_sengrid_password>',
    :domain => '<ip address of my instance>',
    :address => 'smtp.sendgrid.net',
    :port => '2525',
    :authentication => 'plain',
    :enable_starttls_auto => true
  }

Я также открыл порт 2525 в брандмауэре моего экземпляра с помощью облачной консоли Google. Однако я получаю исключение Net::OpenTimeout, когда мое приложение rails пытается отправить электронное письмо. Ниже приведена часть трассировки исключения

Net::OpenTimeout (execution expired):
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:541:in `initialize'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:541:in `open'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:541:in `tcp_socket'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:551:in `block in do_start'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:89:in `block in timeout'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:99:in `call'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:99:in `timeout'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:550:in `do_start'
  /home/jimcgh/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/smtp.rb:520:in `start'
  mail (2.6.3) lib/mail/network/delivery_methods/smtp.rb:112:in `deliver!'
  mail (2.6.3) lib/mail/message.rb:2141:in `do_delivery'
  mail (2.6.3) lib/mail/message.rb:236:in `block in deliver'
  actionmailer (4.2.1) lib/action_mailer/base.rb:543:in `block in deliver_mail'
  activesupport (4.2.1) lib/active_support/notifications.rb:164:in `block in instrument'
  activesupport (4.2.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.2.1) lib/active_support/notifications.rb:164:in `instrument'
  actionmailer (4.2.1) lib/action_mailer/base.rb:541:in `deliver_mail'
  mail (2.6.3) lib/mail/message.rb:236:in `deliver'
  actionmailer (4.2.1) lib/action_mailer/message_delivery.rb:85:in `deliver_now'
  devise (3.5.1) lib/devise/models/authenticatable.rb:170:in `send_devise_notification'
  devise (3.5.1) lib/devise/models/confirmable.rb:114:in `send_confirmation_instructions'
  devise (3.5.1) lib/devise/models/confirmable.rb:170:in `send_on_create_confirmation_instructions'
  activesupport (4.2.1) lib/active_support/callbacks.rb:432:in `block in make_lambda'
  activesupport (4.2.1) lib/active_support/callbacks.rb:228:in `call'
  activesupport (4.2.1) lib/active_support/callbacks.rb:228:in `block in halting_and_conditional'
  activesupport (4.2.1) lib/active_support/callbacks.rb:506:in `call'
  activesupport (4.2.1) lib/active_support/callbacks.rb:506:in `block in call'
  activesupport (4.2.1) lib/active_support/callbacks.rb:506:in `each'
  activesupport (4.2.1) lib/active_support/callbacks.rb:506:in `call'
  activesupport (4.2.1) lib/active_support/callbacks.rb:92:in `_run_callbacks'
  activesupport (4.2.1) lib/active_support/callbacks.rb:776:in `_run_create_callbacks'
  activerecord (4.2.1) lib/active_record/callbacks.rb:306:in `_create_record'
  activerecord (4.2.1) lib/active_record/timestamp.rb:57:in `_create_record'
  activerecord (4.2.1) lib/active_record/persistence.rb:502:in `create_or_update'

Я прочитал документацию на веб-сайте Google Compute Engine об отправке электронных писем и видите, что исходящий порт 25 заблокирован, поэтому я использую 2525. Я также пытался использовать: 2525 и: Plain вместо «2525» и «plain» в моих настройках ActionMailer в staging.rb. В чем здесь может быть проблема?

Пожалуйста, помогите Спасибо


  • Была ли у вас возможность посмотреть на брандмауэр экземпляра (iptables..), чтобы проверить, не заблокирован ли порт? 18.11.2016

Ответы:


1

Вы даете плохую конфигурацию.

config.action_mailer.default_url_options = { host: (it must be your host ie: 'localhost or www.domain.com', port: 3000(in production usually port is not needed')}

ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => 587, #port used by smtp not yours
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :enable_starttls_auto => true,
    :authentication => :plain
    :domain => 'domain.com' #your domain
  }
15.06.2015
  • Спасибо за ответ ppascualv. Я внес изменения, которые вы указали, но все еще получаю сообщение об ошибке Net::OpenTimeout (срок выполнения истек). 15.06.2015

  • 2

    Существует драгоценный камень, который решает проблему, предоставляя метод доставки ActionMailer, который использует веб-API SendGrid, а не API SMTP.

    25.01.2017

    3

    добавьте это в свою конфигурацию, база здесь https://github.com/mikel/mail/issues/639 tls: true

    15.03.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..