2010-08-02 15 views
15

Sto provando a creare un'applicazione, che invia un'email quando l'utente si registra.Actionmailer non recapita posta, con binari 3

ho messo nelle impostazioni SMTP per gmail nel file di configurazione/application.rb e la funzione di stampa sembra

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

ora quando vedo i log, vedo che si dice mail è stata inviata, ma non ho mai ricevuto alcuna posta a tutti ...

anche, quando chiamo la funzione mail, Emails.signed(@user).deliver consegnare, la pagina del modulo non reindirizza, ma funziona se io commento il codice di invio e-mail che è o

Emails.signed(@user).deliver 

o

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

Grazie :)

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

Si sta tentando di inviarlo su sviluppo o produzione? incollare il file 'development.rb' o' production.rb'. – jpemberthy

+0

sono in modalità sviluppo ... ho aggiunto lo sviluppo.rb – Amit

+0

Ehi, per favore controlla il seguente messaggio e facci sapere se continui ad avere problemi. http://asciicasts.com/episodes/206-action-mailer-in-rails-3 Dovrebbe funzionare se hai configurato correttamente le impostazioni smtp di gmail. – jpemberthy

risposta

35

Un po 'in ritardo, ma comunque forse questo farà risparmiare qualcuno qualche ora di battere la testa. Questo probabilmente è rilevante solo per l'invio di e-mail da Gmail. In primo luogo, al fine di aiutare il debug la situazione, impostare la seguente riga nel development.rb true (supponendo che si è in modalità di sviluppo):

config.action_mailer.raise_delivery_errors = true 

Questo renderà ActionMailer non ignorare silenziosamente errori. Quando l'ho fatto, mi sono reso conto che gmail sta rifiutando il mio nome utente e la mia password. Poi sono andato al mio file di configurazione dove ho inserito tutte le direttive di configurazione di Action Mailer (per me era in sviluppo.rb, probabilmente c'è un posto migliore per metterlo), e ho notato che: user_name era impostato su "admin" di "[email protected]". Cambiarlo ha risolto il problema. Qui è la mia parte corretta della 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 } 

Riferimenti:

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

7

Un'altra cosa da non dimenticare: è necessario riavviare l'applicazione dopo aver apportato le modifiche nei file di configurazione dell'ambiente . quando si utilizza passeggero questo può rapidamente perdere :)

questo è quello che ha risolto il mio "problema" quando ActionMailer non ha voglia di inviare messaggi di posta elettronica senza mostrare eventuali errori ..

+0

Mi sono sentito un pazzo per aver capito che non avevo riavviato il mio server. Ha funzionato perfettamente dopo aver riavviato il mio server. Tuttavia, il mio file di registro creava registri con le stesse identiche informazioni prima e dopo aver modificato il mio codice, il che mi ha fatto pensare che riconoscessi le mie modifiche. Credo fosse perché avevo bisogno di riavviare il server prima che effettivamente iniziasse ad aumentare gli errori di consegna, che era la mia modifica al file di configurazione. Quindi, se gli hai detto di iniziare ad aumentare gli errori di consegna ma non si è riavviato, il problema non sarà visibile fino a quando non riavvierai il server. – Matt

6

Le cose scritte qui non mi ha aiutato.

Sto usando Rails 3.2.8 e ho passato diverse ore a cercare di capirlo ed è stato molto semplice alla fine. Ho dimenticato di chiamare .deliver() sull'oggetto Mail::Message restituito dalla chiamata al metodo mail(:to => @user.email, :subject => 'Welcome to the Site').

Lasciare tutto come specificato in official RoR tutorial.

Cioè, nei file di ambiente di sviluppo/produzione, fanno una sezione come:

# 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 
    } 

E poi si sottoclasse ActionMailer :: Base, per esempio come questo:

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 

Dopo di che , si può semplicemente utilizzare questo metodo InfoMailer dal codice come un metodo di una classe:

InfoMailer.welcome_user_and_send_password(user, password) 
0

Se si utilizza l'ambiente di test, assicurarsi di commentare questa riga di codice in ambienti/test.rb:

config.action_mailer.delivery_method = :test 
Problemi correlati