Rails и Mailgun: электронные письма не отправляются

#ruby-on-rails #mailgun

#ruby-on-rails #mailgun

Вопрос:

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

NotificationMailer.rb:

   def send_daily_digest(user_id)
      @user = User.find(user_id)
      mail(to: @user.email, subject: "#{@jobs.count} new jobs yesterday")
      mail(to: "myadminemail@gmail.com", subject: "TEST #{@jobs.count} new jobs yesterday for #{@user.email}")
  end
  

Моя электронная почта myadminemail@gmail.com и я получаю электронное письмо. Я проверил журналы Mailgun, и другое (не административное) электронное письмо не отправляется.

Что может быть причиной этого?

РЕДАКТИРОВАТЬ: я только что внес следующие изменения:

 def send_daily_digest(user_id)
          @user = User.find(user_id)
          @recipients = []
          @recipients << @user.email
          @recipients << myadminemail@gmail.com
          mail(to: @recipients, subject: "#{@jobs.count} new jobs yesterday")
      end
  

Внесение этого изменения правильно отправило электронное письмо обоим получателям. Так что, может быть, это как-то связано с тем, что не разрешено иметь два отдельных действия mail_to?

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

Комментарии:

1. Вы проверили, не был ли заблокирован другой адрес электронной почты? Если вы отправляете электронные письма на тестовый адрес, отклоненный адрес может быть заблокирован Railgun.

2. Привет @Lomefin смотрите мои правки. Другой адрес не был заблокирован. Я только что подтвердил это.

Ответ №1:

/config/environments/development.rb

  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :authentication => :plain,
      :address => "smtp.mailgun.org",
      :port => 587,
      :domain => "you domain  in https://mailgun.com/app/",
      :user_name => "you user_name in https://mailgun.com/app/",
      :password => "you password in https://mailgun.com/app/"
  }
  

Комментарии:

1. Хммм .. да, у меня все правильно настроено, потому что мои электронные письма отлично отправляются на мой первый адрес

2. Возможно, вместо того, чтобы устанавливать для raise_delivery_errors значение false, вы могли бы установить для них значение true, чтобы мы могли проверить, есть ли какие-либо проблемы в rails, отправляющих первое электронное письмо.

Ответ №2:

Согласно документам Rails о ActionMailer, метод mail является основным методом, который создает сообщение и отображает шаблоны электронной почты.

Это означает, что эквивалентно ActionController #render, поэтому, возможно, он просто отправляет почту последнему получателю, вызванному методом mail.

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

Например, я называю эти объекты диспетчерами.

 class ClientDispatcher
  def self.dispatch_digests
    Clients.all.each do |client|
      DigestMailer.send_daily_digest(client).deliver_later
      DigestMailer.send_daily_digest("admin@gmail.com").deliver_later
    end
  end
end
  

Комментарии:

1. Я вернулся сюда, чтобы похвалить. Метод mail добавляет некоторую информацию в сообщение, но она отправляется не сразу, поэтому информация добавляется, а не отправляется отдельно. Вы можете прочитать исходный код метода mail