Sendgrid через Devise: попытка отправить электронное письмо для аутентификации приводит к ошибке OpenTimeout при использовании среды разработки Cloud 9

Я относительно новичок в программировании и очень новичок в веб-разработке, и последние несколько недель я прошел курс обучения Ruby on Rails. Текущий шаг, который я выполняю, включает добавление аутентификации пользователя на мой сайт с помощью Devise, но я получаю "тихую ошибку", когда аутентификационное электронное письмо не отправляется.

В соответствии с руководством, которому я следую в рамках учебного курса, я выполнил следующие шаги:

  1. Установлен гем Devise
  2. Настроил его, добавив в мой файл development.rb следующее:

    ...
        config.action_mailer.default_url_options = { host: 'localhost:3000' }
        config.action_mailer.delivery_method = :smtp
        config.action_mailer.perform_deliveries = true
        config.action_mailer.raise_delivery_errors = true
    end
    
  3. Создал модель пользователя с помощью devise перед обновлением файла [timestamp] _devise_create_users.rb для включения параметра подтверждения.

  4. Ran rake db: migrate

  5. Добавлен аддон Sendgrid (подтвержден с помощью «аддона heroku»)

  6. Создал инициализатор setup_mail.rb со следующим кодом:

    if Rails.env.development?
        ActionMailer::Base.delivery_method = :smtp
        ActionMailer::Base.smtp_settings = {
            address:        'smtp.sendgrid.net',
            port:           '587',
            authentication: :plain,
            user_name:      ENV['SENDGRID_USERNAME'],
            password:       ENV['SENDGRID_PASSWORD'],
            domain:         'heroku.com',
            enable_starttls_auto: true
        }
    end
    
  7. Установлен камень Фигаро

  8. В application.yml добавлены SENDGRID_USERNAME и SENDGRID_PASSWORD.
  9. Установите production: SECRET_KEY_BASE на случайно сгенерированный токен в файле secrets.yml

В режиме разработки приложение теперь успешно загружает форму регистрации пользователя, но после регистрации электронное письмо для аутентификации не отправляется. Вместо этого генерируется следующая ошибка:

Net::OpenTimeout in Devise::RegistrationsController#create

Я огляделся и кажется, что несколько других людей сообщили о той же ошибке при использовании Cloud 9., но никто не дал предложений, как решить эту проблему. Моя (несколько необразованная) теория заключается в том, что настройка хоста в development.rb должна быть другой или порт в setup_mail.rb должен быть другим, поскольку я использую службу C9 вместо локальной машины, но я не уверен как узнать, на что они должны быть установлены (если действительно проблема).

Пока я пробовал

  • Изменение localhost на 8080 в development.rb (это порт, который, похоже, использует c9 на основе текста в терминале)
  • Изменение домена setup_mail.rb на sendgrid.com
  • Убедитесь, что учетная запись Sendgrid не была заблокирована по какой-либо причине

Мой файл User.rb в настоящее время выглядит так

class User < ActiveRecord::Base
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable, :confirmable
end

Может ли кто-нибудь дать мне понять, что происходит?


person EmmaO91    schedule 26.05.2015    source источник
comment
Вы пытались добавить config.action_mailer.default_url_options = { host: '$IP', port: $PORT } в свой development.rb, как это было предложено кем-то в вашей ссылке < / а>?   -  person Luis Menjivar    schedule 27.05.2015


Ответы (1)


Измените свой порт на что-то вроде 2525, у меня такая же ошибка, похоже, cloud9 блокирует порт 587.

примеры настроек для мандрила и cloud9 (должны работать одинаково и для send-grid)

config.action_mailer.default_url_options = { host: '0.0.0.0:8080' }

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'smtp.mandrillapp.com',
    port: 2525,
    enable_starttls_auto: true,
    user_name: '<your-username>',
    password: '<your-password>',
    authentication: 'login'
  }

Также при любых внесенных вами изменениях вы должны каждый раз перезагружать сервер.

person Petros Kyriakou    schedule 03.06.2015
comment
Спасибо, это легко упускается из виду, поскольку cloud9 не выдает предупреждения при попытке использовать заблокированный порт. Поскольку я был частью обсуждения, упомянутого OP, я обновил свой ответ там, предоставив полную информацию о рабочей настройке для использования SendGrid в Cloud9. - person chikamichi; 24.08.2015