web-dev-qa-db-fra.com

rails, action mailer n'envoie pas

Je suis un débutant complet dans Rails et j'essaie d'envoyer un courrier électronique après que quelqu'un se soit inscrit à l'aide de actionmailer.

Mes journaux indiquent que l'e-mail envoie, mais que Gmail ne l'obtient jamais

config/initializers/setup_mail.rb

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :domain               => "asciicasts.com",
  :user_name            => "asciicasts",
  :password             => "secret",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  default :from => "[email protected]"

  def registration_confirmation(user)
    mail(:to => user.email, :subject => "Registered")
  end
end

controllers/users_controller.rb

...
def create
    @user = User.new(params[:user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end
...

Merci!

15
Pavel Babin

Assurez-vous que cette option est définie dans votre config/environments/development.rb:

config.action_mailer.delivery_method = :smtp

De plus, dans ActionMailer::Base.smtp_settings, vous devez spécifier un compte gmail valide. Copier-coller (asciicasts) ne va pas le couper ici.

Voir cette question pour référence: Envoi de courrier avec Rails 3 dans un environnement de développement

16
mihai

Au lieu de 'smtp', vous pouvez utiliser 'sendmail'

ActionMailer::Base.delivery_method = :sendmail

ActionMailer::Base.sendmail_settings = { :address => "smtp.gmail.com",
     :port => "587", :domain => "gmail.com", :user_name => "[email protected]", 
    :password => "yyy", :authentication => "plain", :enable_starttls_auto => true }
4
pinku

J'ai rencontré ce même problème pour un nouveau courrier que j'avais configuré. Je n'arrivais pas à comprendre pourquoi ce nouveau mailer ne pouvait pas envoyer d'e-mails, ni même accéder à la méthode dans le mailer quand je l'ai parcouru. 

Solution

En fin de compte, si vous mettez le code deliver_now ou deliver* dans l'expéditeur, il n'envoie pas le courrier électronique.

Exemple cassé

  def email_message()
    message = mail(to: User.first, subject: 'test', body: "body text for mail")
    message.deliver_now
  end

Corrigée

  #Different class; in my case a service
  def caller
    message = MyMailer.email_message
    message.deliver_now
  end

  def email_message()
    mail(to: User.first, subject: 'test', body: "body text for mail")
  end

Cela a résolu le problème pour moi, j'espère que cela le résoudra pour quelqu'un d'autre.

0
gwnp