web-dev-qa-db-fra.com

ActionMailer n'envoie pas de courrier en développement Rails 4

Pourquoi cet expéditeur n'envoie-t-il aucun courrier? (Ou des idées pour le débogage?)

Dans my_app/config/environment/development.rb, j'ai ce code:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              'smtp.gmail.com',
    port:                 587,
    domain:               'my_app.com',
    user_name:            ENV['GMAIL_USERNAME'],
    password:             ENV['GMAIL_PASSWORD'],
    authentication:       'plain',
    enable_starttls_auto: true  }

Puis sur mon ordinateur local dans ~/.bash_profile, j'ai ce code:

export GMAIL_USERNAME='blah@my_app.com'
export GMAIL_PASSWORD='***'

Lorsque j'exécute $ env sur mon terminal, je constate que les deux variables d'environnement sont correctement définies.

J'ai également redémarré mon serveur Rails.

43
Don P

Vous devriez ajouter

config.action_mailer.perform_deliveries = true

comme par défaut c'est false, ce qui empêche l'envoi de mails depuis votre environnement de développement ...

103
Danny

Pour ceux qui n'utilisent pas smtp, le changement de méthode de livraison en sendmail m'a aidé, en plus de configurer explicitement les livraisons à effectuer:

config.action_mailer.delivery_method = :sendmail
10
Aaron Krauss

Si vous rencontrez des problèmes pour envoyer un courrier électronique à partir de la console, vous devez appeler la méthode de livraison sur votre courrier.

MyMailer.create_email.deliver
9
Michael Brawn

Toutes ces réponses sont excellentes, mais il existe un autre endroit où vous pouvez être brûlé, en particulier dans le contexte du débogage. 

Dans development.rb, assurez-vous de définir config.action_mailer.raise_delivery_errors = true

Si votre méthode .deliver semble fonctionner sans problème, mais que vous ne recevez jamais le courrier électronique, il se peut que votre méthode de livraison génère une exception et que Rails avale l'erreur. Cela est tout à fait vrai si vous avez simplement quelque chose d'aussi simple qu'une erreur d'identification mal configurée ou une erreur d'API avec un accès refusé à aws. Sauvegardez vos cheveux et assurez-vous que raise_delivery_errors est activé. Il veut vous dire quelque chose mais ne peut pas. 

0
Ryan Romanchuk

Alors je l'ai compris. Le fait d'avoir la ligne ActionMailer::Base.delivery_method = :smtp dans config/environment.rb remplace ActionMailer::Base.delivery_method = :test dans config/environments/test.rb.

Supprimez donc cette ligne, ActionMailer::Base.delivery_method = :smtp de config/environment.rb et placez-la dans config/environments/production.rb. Cela vous permet de placer ActionMailer::Base.delivery_method = :test dans config/environments/test.rb et la version souhaitée dans config/environments/development.rb. J'ai créé development.rb:test au fur et à mesure que je remplissais ma base de données à l'aide de Faker et le changeais en :smtp, donc j'étais sûr que les vrais courriels avaient été envoyés comme vérification supplémentaire.

Remarque: vous devez redémarrer votre serveur pour que ces modifications prennent effet.

Autre remarque: les instructions SendGrid actuelles de Heroku ( https://devcenter.heroku.com/articles/sendgrid ) placent le code de configuration SendGrid Heroku dans un nouveau fichier config/initializers/mail.rb qui nécessitera probablement de supprimer sa dernière ligne et de placer la version souhaitée. dans chaque config/environments/[production.rb, development.rb, test.rb]

0
DJSampat