53 votes

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

Je suis sûr que cela a été demandé à un million de fois avant, mais je ne peux pas trouver quelque chose qui fonctionne pour moi si je suis en demandant de nouveau!

J'ai juste besoin d'un moyen d'envoyer des e-mails à l'aide de ActionMailer dans rails 3. J'ai suivi de nombreux tutoriels, y compris la Railscasts tutoriel sur la nouvelle ActionMailer et je peux voir les mails générés, mais je ne les recevrez pas.

J'ai essayé un tas de manières différentes, mais ils ont généralement une quantité de 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            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

J'ai essayé le code ci-dessus (en cours de validité avec gmail détails bien sûr) dans ma config/environment.rb, config/environments/développement.rb et actuellement dans sa propre initialiser config/initialisers/setup_mail.rb

J'ai aussi essayé avec un peu différents serveurs smtp, y compris Gmail et Sendgrid, en ajustant les paramètres smtp en conséquence mais toujours rien. Je peux voir les messages dans le terminal et le log de développement, et c'est tout.

Personne ne sait de toute autre gotcha que j'ai peut-être raté qui doivent être en place pour ActionMailer de travail? À défaut, est-il un moyen d'obtenir plus d'information au sujet de pourquoi les mails ne sont pas envoyés? J'ai

config.action_mailer.raise_delivery_errors = true

mis dans ma config/développement.rb mais le log de développement, toujours en montre juste la même chose que je vois dans le terminal.

Pour ce que ça vaut, je suis sur un Ubuntu 10.04 ordinateur portable, juste au cas où il n'y a aucune installation spécifique nécessaire pour cela.

Merci beaucoup

55voto

Addsy Points 2061

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

27voto

nathanvda Points 25878

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

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

La configuration de messagerie réelle, config.actionmailer.* i ont été placés dans config\application.rb .

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

6voto

Anubhaw Points 2820

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

ActionMailer :: Base.delivery_method =: sendmail

ActionMailer :: Base.sendmail_settings = {: adresse => "smtp.gmail.com",: port => "587",: domaine => "gmail.com",: nom_utilisateur => "xxx@gmail.com", : mot de passe => "yyy",: authentication => "plain",: enable_starttls_auto => true}

3voto

IAmNaN Points 2713

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 doit encore travailler.)

Deuxièmement, n'oubliez pas de redémarrer votre serveur à chaque fois que vous modifiez ce (ou tout) initializer. Cela pourrait expliquer pourquoi vous ne voyez pas un message d'erreur après l'ajout de:

config.action_mailer.raise_delivery_errors = true

Sans avoir ce message d'erreur, il est difficile de déterminer pourquoi le mail n'allait pas, mais ne l'est maintenant. Une possibilité est l'utilisation de guillemets autour du mot de passe. Si vous utilisez un mot de passe fort et avait un jeton dans votre mot de passe qui n'a pas échappé à il pourrait avoir été réinterprété. (c - "P@ssw\0rd" deviendrait P@ssrd). Pour cette raison, j'ai toujours utiliser des guillemets simples dans mon code, à moins que j'ai précisément besoin du sucre syntaxique.

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

0voto

seyyah Points 11

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: