2010-08-02 5 views
15

J'essaye de faire une application, qui envoie un email quand l'utilisateur s'enregistre.Actionmailer ne pas livrer le courrier, avec des rails 3

i mis dans les paramètres de smtp pour gmail dans le fichier de configuration/application.rb et la fonction mail ressemble

mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :content_type => "text/html") 

maintenant quand je vois les journaux, je vois qu'il dit message a été envoyé, mais je ne reçois jamais de courrier du tout ...

aussi, quand j'appelle la poste livrer fonction, Emails.signed(@user).deliver, la page de formulaire ne redirige pas, mais il fonctionne si je commente l'e-mail le code d'envoi qui est soit

Emails.signed(@user).deliver 

ou

mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :content_type => "text/html") 

Merci :)

Edit: development.rb

App::Application.configure do 
    # Settings specified here will take precedence over those in config/environment.rb 

    # 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 webserver when you make code changes. 
    config.cache_classes = false 

    # Log error messages when you accidentally call methods on nil. 
    config.whiny_nils = true 

    # Show full error reports and disable caching 
    config.consider_all_requests_local  = true 
    config.action_view.debug_rjs    = true 
    config.action_controller.perform_caching = false 

    # Don't care if the mailer can't send 
    config.action_mailer.raise_delivery_errors = true 
    config.action_mailer.perform_deliveries = true 

    # Print deprecation notices to the Rails logger 
    config.active_support.deprecation = :log 

end 
+0

Essayez-vous de l'envoyer sur le développement ou la production? veuillez coller le fichier 'development.rb' ou' production.rb'. – jpemberthy

+0

je suis en mode développement ... J'ai ajouté le développement.rb – Amit

+0

Hey s'il vous plaît vérifier le poste suivant, et laissez-nous savoir si vous continuez à avoir des problèmes. http://asciicasts.com/episodes/206-action-mailer-in-rails-3 Cela devrait fonctionner si vous avez correctement configuré vos paramètres smtp gmail. – jpemberthy

Répondre

35

Un peu en retard, mais néanmoins peut-être cela permettra d'économiser quelqu'un quelques heures de se cogner la tête. Ceci n'est probablement pertinent que pour l'envoi de courriels à partir de Gmail. Tout d'abord, afin de faciliter le débogage de la situation, définir la ligne suivante dans development.rb true (en supposant que vous êtes en mode développement):

config.action_mailer.raise_delivery_errors = true 

Cela fera ActionMailer ne pas ignorer les erreurs en silence. Quand j'ai fait ça, j'ai réalisé que gmail refusait mon nom d'utilisateur et mon mot de passe. Je suis ensuite allé à mon fichier de configuration où j'ai placé toutes les directives de configuration d'Action Mailer (pour moi c'était dans development.rb, il y a probablement un meilleur endroit pour le mettre), et j'ai remarqué que: user_name était plutôt "admin" que "[email protected]". Changer cela a résolu le problème. Voici ma partie corrigée de development.rb:

config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
    :address    => "smtp.gmail.com", 
    :port     => 587, 
    :domain    => 'thedomain.com', 
    :user_name   => '[email protected]', 
    :password    => '<password>', 
    :authentication  => 'plain', 
    :enable_starttls_auto => true } 

Références:

http://forums.pragprog.com/forums/43/topics/541 http://edgeguides.rubyonrails.org/action_mailer_basics.html

7

Une autre chose à ne pas oublier: vous devez redémarrer l'application après avoir effectué des modifications dans vos fichiers de configuration de l'environnement . lors de l'utilisation passager, cela peut rapidement manquer :)

qui est ce qui a résolu mon « problème » quand ActionMailer na pas envie d'envoyer des e-mails sans montrer aucune erreur ..

+0

Je me sentais comme un imbécile de réaliser que je n'avais pas redémarré mon serveur. Cela a fonctionné parfaitement après avoir redémarré mon serveur. Cependant, mon fichier journal créait des journaux contenant exactement les mêmes informations avant et après avoir modifié mon code, ce qui m'a fait penser qu'il reconnaissait mes modifications. Je crois que c'était parce que j'avais besoin de redémarrer le serveur avant qu'il ne commence réellement à soulever des erreurs de livraison, ce qui était mon changement dans le fichier de configuration. Donc, si vous lui avez dit de commencer à augmenter les erreurs de livraison mais que vous n'avez pas redémarré, le problème ne sera pas visible tant que vous n'aurez pas redémarré le serveur. – Matt

6

Les choses écrites ici ne m'a pas aidé. J'utilise Rails 3.2.8 et j'ai passé plusieurs heures à essayer de comprendre cela et c'était très simple à la fin. J'ai oublié d'appeler .deliver() sur l'objet Mail::Message renvoyé par l'appel de méthode mail(:to => @user.email, :subject => 'Welcome to the Site').

Laissez simplement tout comme spécifié dans official RoR tutorial.

C'est, dans vos fichiers d'environnement de développement/production, faire une section comme:

# mailer 
    config.action_mailer.raise_delivery_errors = true 
    config.action_mailer.delivery_method = :smtp 

    config.action_mailer.smtp_settings = { 
     address:    'smtp.gmail.com', 
     port:     587, 
     domain:    'gmail.com', 
     user_name:   '<username>@gmail.com', 
     password:    '<password>', 
     authentication:  'plain', 
     enable_starttls_auto: true 
    } 

Et vous sous-classe ActionMailer :: Base, par exemple comme ceci:

class InfoMailer < ActionMailer::Base 
    default from: "<username>@gmail.com" 

    def welcome_user_and_send_password(user, password) 
    default_url_options = self.default_url_options() 


    @user = user 
    @password = password 
    @url = default_url_options[:host] 
    mail(:to => @user.email, :subject => 'Welcome to the Site').deliver() 
    end 

end 

Après cela , vous pouvez simplement utiliser cette méthode InfoMailer de votre code comme une méthode de classe:

InfoMailer.welcome_user_and_send_password(user, password) 
0

Si vous utilisez l'environnement de test, assurez-vous de commenter cette ligne de code dans des environnements/test.rb:

config.action_mailer.delivery_method = :test 
Questions connexes