Соединение отказано - подключите (2) к порту "localhost" 25 рельсов

Во время обучения я работаю над сайтом, и мы используем Ruby on Rails. Нам нужно отправлять письма пользователям, поэтому я создал почтовую программу.

Я попытался поместить smtp в development.rb и environment.rb

config.action_mailer.default_url_options = {host: '0.0.0.0:3000'}
config.action_mailer.default charset: 'utf-8'
config.action_mailer.delivery_method = 'smtp'
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
  adress: $SMTP_SERVER,
  port: $PORT,
  from: $MAIL,

  enable_starttls_auto: true
  #authentication: 'login'
}

Это говорит мне, что ошибка исходит из этой линии метода 6

def create
  @user = User.new(user_params)

  respond_to do |format|
    if @user.save
      # Tell the UserMailer to send a welcome Email after save
      UserMailer.welcome_email(@user).deliver_now

      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.json { render :json => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" }
      format.json { render :json => @user.errors, :status => :unprocessable_entity }
    end
  end
end

Я установил порт на 587 но я продолжаю получать ошибку:

Errno :: ECONNREFUSED: соединение отклонено - подключение (2) для порта "localhost" 25

Похоже, что другой файл перезаписывал мои настройки. Я также видел, что это может быть связано с тем, что мой ssh-ключ не разрешен сервером.

Знаете, что не так?

заранее спасибо

Ответы

Ответ 1

Прежде всего, при разработке на локальном хосте, обычно не отправлять почту, а рассматривать это как деталь развертывания и придерживаться поведения по умолчанию Rails, которое должно выплевывать заголовки и содержимое почты в консоли STDOUT (где вы может проверить, что текст выглядит правильно). Есть ли конкретная причина, по которой вам нужно проверить отправку сообщений в среде dev?

Во-вторых, вы упомянули, что вы устанавливаете параметры SMTP как в development.rb, так и в environment.rb. Вам не нужно устанавливать эти настройки дважды; в общем, я бы использовал development.rb для параметров, специфичных для среды dev, и environment.rb только для параметров, которые всегда будут применяться ко всем средам (dev, tests и live-серверу). Поэтому, если вы устанавливаете одинаковые настройки в файлах development.rb и environment.rb, я бы начал с удаления одного или другого; избыточность будет только упрощать вашу работу в будущем.

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

  • Запуск rails console
  • Введите Rails.configuration.action_mailer.smtp_settings и сравните полученный хэш с вашими ожиданиями. Этот хэш должен содержать параметры порта и домена, которые используются при отправке всей почты (в текущей среде), поэтому, если ActionMailer пытается использовать неправильный порт, я бы предположил, что порт тоже ошибается.

Где вы устанавливаете $SMTP_SERVER, $PORT и $MAIL? Есть ли причина, по которой вы не используете соглашение Rails для переменных среды, ENV['SMTP_SERVER'] и т.д.?

Надеюсь, что это помогает. Удачи!

Ответ 2

замещать

config.action_mailer.delivery_method = 'smtp'

с

config.action_mailer.delivery_method = :smtp

Убедитесь, что ваши Rails.configuration.action_mailer.smtp_settings являются символами

Ответ 3

MailCatcher - лучшее решение
MailCatcher запускает супер простой SMTP-сервер, который перехватывает любое отправленное ему сообщение для отображения в веб-интерфейсе. Запустите mailcatcher, установите ваше любимое приложение для доставки по адресу smtp://127.0.0.1:1025 вместо SMTP-сервера по умолчанию, а затем проверьте http://127.0.0.1:1080, чтобы увидеть почту.

http://blog.remarkablelabs.com/2013/01/mailcatcher-making-working-with-email-in-development-mode-a-pleasure

Ответ 4

Я сталкивался с этой проблемой при запуске Sidekiq::Worker.drain_all в моих тестах RSpec, и это config.action_mailer.delivery_method = :test меня с ума, потому что у меня был config.action_mailer.delivery_method = :test в моем config/environments/test.rb

Решением было установить config.action_mailer.delivery_method = :test в моем config/environments/development.rb, что сбивает с толку, поскольку подразумевается, что мой config/environments/development.rb переопределяет мой config/environments/test.rb в мои тесты RSpec.

Независимо от этого, это может решить проблему для других.

Ответ 5

Приложение может использовать gem mailcatcher для всех исходящих писем в процессе разработки, которые вы не установили или не запустили. По крайней мере, это была моя проблема. Проверьте https://mailcatcher.me и следуйте инструкциям.

Ответ 6

Вам нужно удалить config.action_mailer.perform_deliveries = true.