web-dev-qa-db-fra.com

Envoi de courrier avec Rails 3 dans un environnement de développement

Je suis sûr que cela a déjà été demandé un million de fois, mais je ne trouve rien qui me convienne, alors je le redemande!

J'ai juste besoin d'un moyen d'envoyer des courriels en utilisant ActionMailer dans Rails 3. J'ai suivi de nombreux tutoriels, y compris le tutoriel Railscasts sur le nouveau ActionMailer et je peux voir les courriers générés mais je ne les reçois pas.

J'ai essayé différentes méthodes, mais elles consistent généralement à configurer les paramètres suivants

ActionMailer::Base.delivery_method = :smtp

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

J'ai essayé le code ci-dessus (avec des détails valides de gmail bien sûr) dans mon config/environment.rb, config/environnements/development.rb et l'ai actuellement dans son propre initialiseur config/initialisers/setup_mail.rb

J'ai également essayé avec quelques serveurs smtp différents, notamment Gmail et Sendgrid, en ajustant les paramètres smtp en conséquence, mais toujours rien. Je peux voir le courrier dans le terminal et le journal de développement et le tour est joué.

Est-ce que quelqu'un connaît d'autres pièges que j'ai peut-être manqués et qui doivent être configurés pour qu'ActionMailer fonctionne? Sinon, y a-t-il moyen d'obtenir plus d'informations sur les raisons pour lesquelles les courriers ne sont pas envoyés? j'ai 

config.action_mailer.raise_delivery_errors = true

défini dans mon config/development.rb mais le journal de développement ne montre toujours que ce que je vois dans le terminal.

Pour ce que cela vaut, je développe sur un ordinateur portable Ubuntu 10.04 au cas où une configuration spécifique serait nécessaire.

Merci beaucoup

53
Addsy

Eh bien, j'ai résolu le problème, mais je ne sais pas pourquoi cela fonctionne et les autres méthodes qui ne fonctionnent pas.

La solution consistait à créer un initialiseur dans config/initialisers/setup_mail.rb contenant les éléments suivants:

if Rails.env != 'test'
  email_settings = YAML::load(File.open("#{Rails.root.to_s}/config/email.yml"))
  ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil?
end

J'ai ensuite ajouté config/email.yml contenant les détails des comptes de messagerie de développement et de production.

development:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true
production:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true

Comme je le dis, je ne sais pas pourquoi, mais cela a semblé faire l'affaire. Merci à tous pour les pointeurs

55
Addsy

J'ai les éléments suivants dans config/environments/development.rb

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

La configuration de messagerie actuelle, config.actionmailer.* que j'ai placée dans config\application.rb.

J'espère que cela t'aides :)

27
nathanvda

Essayez d'utiliser "sendmail" au lieu de "smtp".

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
}
6
Anubhaw

Trois choses.

Tout d'abord, le port est un entier et n'a pas besoin de guillemets, comme dans votre premier exemple. (Mais je pense qu'une chaîne devrait toujours fonctionner.)

Deuxièmement, n'oubliez pas de redémarrer votre serveur chaque fois que vous modifiez ce fichier d'initialisation (ou un autre). Cela pourrait expliquer pourquoi vous n'avez pas vu d'erreur après avoir ajouté:

config.action_mailer.raise_delivery_errors = true

Sans ce message d'erreur, il est difficile de déterminer pourquoi le courrier n'allait pas, mais le reste. Une possibilité consiste à utiliser des guillemets doubles autour du mot de passe. Si vous utilisiez un mot de passe fort et que votre mot de passe ne contenait aucun jeton, il aurait pu être réinterprété. (i.e. "P@ssw\0rd" deviendrait P@ssrd). Pour cette raison, j'utilise toujours des guillemets simples dans mon code, sauf si j'ai spécifiquement besoin du sucre syntaxique.

Enfin, enable_starttls_auto: true est la valeur par défaut et inutile.

3
IAmNaN

ActionMailer::Base.delivery_method = :sendmail
et
config.action_mailer.perform_deliveries = true

étaient les deux étapes nécessaires qui m'a permis de surmonter cette question

1
Jerome

Il suffit de mettre toute la configuration dans: Config/environment/development.rb

Je veux dire 

ActionMailer::Base.delivery_method = :smtp

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

et 

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

Cela a fonctionné pour moi. 

1
Nickle

Mes deux sous vaut la peine:

J'avais ces mêmes symptômes avec Rails 5.1: rien ne s'est passé, les paramètres de mon fichier development.rb ont été complètement ignorés ...

Puis je me suis rappelé de redémarrer la machine! (qui a résolu le problème comme par magie)

Cela avait été souligné par quelques commentaires précédents. 

Le problème est toutefois délicat, car vous ne vous attendez pas à ce comportement. À mon avis, les commentaires par défaut dans development.rb sont, à cet égard, trompeurs:

# 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 web server when you make code changes*.
0
Varus Septimus

De plus, votre nom d'utilisateur gmail ne correspond pas à un alias.

Réf.: https://support.google.com/mail/answer/12096?hl=fr

0
seyyah