54 votes

Envoi de courrier avec Rails 3 dans l'environnement de développement

Je suis sûr que cette question a déjà été posée un million de fois, mais je ne trouve rien qui fonctionne pour moi, alors je la pose à nouveau !

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

J'ai essayé plusieurs méthodes différentes mais elles reviennent 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            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

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

J'ai également essayé avec plusieurs serveurs smtp différents, dont 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 c'est tout.

Quelqu'un connaît-il d'autres problèmes que j'ai pu manquer et qui doivent être réglés pour que ActionMailer fonctionne ? Sinon, existe-t-il un moyen d'obtenir plus d'informations sur la raison pour laquelle les e-mails ne sont pas envoyés ? J'ai

config.action_mailer.raise_delivery_errors = true

dans mon fichier config/development.rb mais le journal de développement affiche toujours la même chose 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.

0 votes

Pouvez-vous essayer de supprimer le domaine :des paramètres ou de le remplacer par un autre domaine ?

54voto

Addsy Points 2061

J'ai résolu le problème, mais je ne sais pas pourquoi cette méthode fonctionne et pas les autres.

La solution a été de créer un initialisateur dans config/initialisers/setup_mail.rb contenant ce qui suit

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 email de dev 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 l'ai dit, je ne sais pas pourquoi, mais ça semble faire l'affaire. Merci à tous pour les conseils

3 votes

Cela a fonctionné pour et rien d'autre n'a fonctionné. Je ne comprends pas pourquoi cela fonctionne, mais merci. Des heures de recherche sur Internet ont pris fin. J'aurais dû venir ici pour commencer.

1 votes

J'ai cherché pendant un certain temps une bonne solution à ce problème et c'est exactement ce que j'aurais dû faire en premier lieu. Merci !

27voto

nathanvda Points 25878

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 réelle du courrier, config.actionmailer.* j'ai été placé dans config\application.rb .

J'espère que cela vous aidera :)

0 votes

Merci les gars, malheureusement ils étaient tous les deux déjà là. Merci quand même pour les suggestions

0 votes

Dans ce cas, vous devriez obtenir des erreurs pour lesquelles il ne fonctionne pas. Est-ce exact ?

0 votes

Bonjour nathanvda, désolé, je viens seulement de voir votre commentaire. Le problème était en partie dû au fait que je ne recevais aucune erreur. J'ai posté ci-dessous comment j'ai résolu le problème, bien que pour être tout à fait honnête, je ne vois aucune raison pour laquelle la méthode ci-dessous devrait fonctionner et aucune des autres ne l'a fait.

6voto

Anubhaw Points 2820

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            => "xxx@gmail.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

0 votes

Merci pour cette suggestion. Malheureusement, je viens d'essayer et j'obtiens exactement le même comportement avec sendmail.

3voto

IAmNaN Points 2713

Trois choses.

Tout d'abord, le port est un nombre entier et n'a pas besoin de guillemets, comme dans votre premier exemple. (Mais je pense qu'une chaîne de caractères devrait quand même fonctionner).

Deuxièmement, n'oubliez pas de redémarrer votre serveur chaque fois que vous modifiez ce fichier initialisateur (ou tout 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'était pas envoyé mais l'est maintenant. Une possibilité est l'utilisation de guillemets autour du mot de passe. Si vous utilisiez un mot de passe fort et que vous aviez un jeton dans votre mot de passe qui n'était pas échappé, il a pu être réinterprété. (i.e. "P@ssw\0rd" deviendrait P@ssrd ). C'est précisément pour cette raison que j'utilise toujours des guillemets simples dans mon code, sauf si j'ai spécifiquement besoin de ce sucre syntaxique.

Enfin, enable_starttls_auto: true est la valeur par défaut et n'est pas nécessaire.

0voto

seyyah Points 11

De plus, votre nom d'utilisateur gmail n'a pas d'alias.

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

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:

X