Как отправить электронное письмо с почтой в рубине на рельсах

Я пытаюсь отправить электронное письмо, используя почту. Но, к сожалению, это не работает. Это мой контроллер.

    def create
      fn = params["firstname"]
      ln = params["lastname"]
      email = params["email"]
      file = params["file"]
      summery = params["summery"]
      email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
      mail = Mail.new do
        from 'someone@gmail.com'
        to email
        subject "Saying Hi"
        body email_body
      end
      mail.add_file(filename: file.original_filename, content: File.read(file.tempfile.path)) unless file.nil?
      mail.deliver!
      render json: {message: "A bug has been created", success: true}, status: 201
    end

Этот код вызывает эту ошибку

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

Однако, когда я устанавливаю mailcatcher и настраиваю свой контроллер для отправки почты в mailcatcher, я вижу письмо в своем интерфейсе mailcatcher.

Mail.defaults do
 delivery_method :smtp, address: "localhost", port: 1025
end

Также я добавил эти две строки в мой config/environment / development.rb

config.action_mailer.raise_delivery_errors = true 
config.action_mailer.perform_deliveries = true

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

Обновить

Как @Uzbekjon и @SimoneCarletti предложили мне изменить мой код для использования ActionMailer. Я создал файл в app/mailer/, и я вызываю его с моего контроллера.

  def create
    fn = params["firstname"]
    ln = params["lastname"]
    email = params["email"]
    file = params["file"]
    summery = params["summery"]
     email_body = "Hello\n This is Your favorite website.\nA I want to personaly say hi."
    WelcomeMailer.welcome(fn, ln, email, file, email_body).deliver_now
    render json: {message: "An Email has been send", success: true}, status: 201
  end

и это мой почтовик

class WelcomeMailer < ActionMailer::Base
  default from: "someone@yahoo.com"

  def welcome(first_name, last_name, email, file, email_body)
    attachments["#{file.original_filename}"] = File.read("#{file.tempfile.path}")
 mail(
   to: email, 
   subject: 'Welcome to My Awesome Site', 
   body: email_body
 )
  end
end

Однако я все еще получаю ту же ошибку.

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

Ответ

Итак, я нашел решение. Да, вам нужно использовать ActionMailer. После этого вам нужно перейти в config/environment / development.rb, изменить и добавить следующие строки:

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  # SMTP settings for gmail
  config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :user_name            => "YOUR EMAIL",
    :password             => "YOUR Password",
    :authentication       => "plain",
    :enable_starttls_auto => true
  }

Также если Gmail жаловался на это:

Net:: SMTPAuthenticationError - 534-5.7.9 Требуется пароль для конкретного приложения

Перейдите по этой ссылке и разрешите менее защищенному приложению доступ к Gmail.

Другие конфигурации доступны для других сервисов, таких как Yahoo. Просто Google это.

2 ответа

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

Похоже mail gem пытается подключиться к локальному серверу smtp через порт 25. Скорее всего, у вас нет службы, работающей и получающей подключения через порт 25.

Решить, установить и запустить sendmail или же postfix на твоей машине.

PS. использование ActionMailer,

У вас нет почтового сервера, работающего на порту 25. Вы можете установить postfix и запустить сервер, используя

sudo postfix start

А затем измените настройки в config/environments/development.rb

config.action_mailer.delivery_method = :sendmail

Надеюсь это поможет.

Другие вопросы по тегам