Actionmailer не доставляет почту, с рельсами 3 - PullRequest
15 голосов
/ 03 августа 2010

Я пытаюсь создать приложение, которое отправляет электронное письмо при регистрации пользователя.

Я вставил настройки SMTP для Gmail в файле config / application.rb, и функция mail выглядит как

mail(:to => "me@me.com", :subject => "Mail!", :from => "another@me.com", :content_type => "text/html")

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

также, когда я вызываю функцию доставки почты, Emails.signed(@user).deliver, страница формы не перенаправляется, но работает, если я закомментирую код отправки электронной почты, который либо

Emails.signed(@user).deliver

или

mail(:to => "me@me.com", :subject => "Mail!", :from => "another@me.com", :content_type => "text/html")

Спасибо:)

Редактировать: development.rb

App::Application.configure do
  # Settings specified here will take precedence over those in config/environment.rb

  # In the development environment your application's code is reloaded on
  # every request.  This slows down response time but is perfect for development
  # since you don't have to restart the webserver when you make code changes.
  config.cache_classes = false

  # Log error messages when you accidentally call methods on nil.
  config.whiny_nils = true

  # Show full error reports and disable caching
  config.consider_all_requests_local       = true
  config.action_view.debug_rjs             = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

end

Ответы [ 4 ]

35 голосов
/ 23 ноября 2010

Несколько поздно, но, тем не менее, возможно, это спасет кого-то от нескольких часов ударов головой. Вероятно, это относится только к отправке электронных писем из Gmail. Во-первых, чтобы помочь отладить ситуацию, установите следующую строку в файле development.rb в значение true (при условии, что вы находитесь в режиме разработки):

config.action_mailer.raise_delivery_errors = true

Это заставит ActionMailer не игнорировать ошибки. Когда я это сделал, я понял, что gmail отказывается от моего имени пользователя и пароля. Затем я пошел в свой конфигурационный файл, где я поместил все директивы конфигурации Action Mailer (для меня это было в development.rb, возможно, есть лучшее место для его размещения), и заметил, что: user_name было установлено на «admin», а не "admin@thedomain.com". Изменение этого решило проблему. Вот моя исправленная часть development.rb:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :domain               => 'thedomain.com',
  :user_name            => 'admin@thedomain.com',
  :password             => '<password>',
  :authentication       => 'plain',
  :enable_starttls_auto => true  }

Ссылки:

http://forums.pragprog.com/forums/43/topics/541 http://edgeguides.rubyonrails.org/action_mailer_basics.html

7 голосов
/ 09 февраля 2011

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

это то, что решило мою «проблему», когда ActionMailer не хотел отправлять электронные письма, не показывая никаких ошибок ..

6 голосов
/ 10 мая 2014

Вещи, написанные здесь, не помогли мне.

Я использую Rails 3.2.8, и я потратил несколько часов, пытаясь понять это, и в конце концов это было очень просто.Я забыл вызвать .deliver() для объекта Mail::Message, который возвращается при вызове метода mail(:to => @user.email, :subject => 'Welcome to the Site').

Просто оставьте все, как указано в официальном руководстве по RoR .

То есть в файлах среды разработки / производства создайте раздел, подобный следующему:

  # mailer
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp

  config.action_mailer.smtp_settings = {
      address:              'smtp.gmail.com',
      port:                 587,
      domain:               'gmail.com',
      user_name:            '<username>@gmail.com',
      password:             '<password>',
      authentication:       'plain',
      enable_starttls_auto: true
  }

И затем вы создадите подкласс ActionMailer :: Base, например, так:

class InfoMailer < ActionMailer::Base
  default from: "<username>@gmail.com"

  def welcome_user_and_send_password(user, password)
    default_url_options = self.default_url_options()


    @user = user
    @password = password
    @url = default_url_options[:host]
    mail(:to => @user.email, :subject => 'Welcome to the Site').deliver()
  end

end

После этого вы можете просто использовать этот InfoMailer метод из вашего кода как метод класса:

InfoMailer.welcome_user_and_send_password(user, password)
0 голосов
/ 15 марта 2015

Если вы используете тестовую среду, обязательно закомментируйте эту строку кода в environment / test.rb:

config.action_mailer.delivery_method = :test
...