Actionmailer не доставляет почту, с рельсами 3

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

я вставляю параметры smtp для gmail в файле config/application.rb, а функция почты выглядит как

mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :content_type => "text/html")

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

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

Emails.signed(@user).deliver

или

mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :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 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

Ответы

Ответ 1

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

config.action_mailer.raise_delivery_errors = true

Это заставит ActionMailer молча игнорировать ошибки. Когда я это сделал, я понял, что gmail отказывается от имени пользователя и пароля. Затем я перешел в конфигурационный файл, где я поместил все директивы конфигурации Action Mailer (для меня это было в development.rb, возможно, было лучшее место для него), и заметил, что: user_name было установлено как "admin", а не "[email protected]". Его изменение решило проблему. Вот моя исправленная часть development.rb:

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

Литература:

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

Ответ 2

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

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

Ответ 3

То, что написано здесь, мне не помогло.

Я использую 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)

Ответ 4

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

config.action_mailer.delivery_method = :test