48

Why is this mailer not sending any mail? (Or any ideas for debugging?)

In my_app/config/environments/development.rb I have this code:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              'smtp.gmail.com',
    port:                 587,
    domain:               'my_app.com',
    user_name:            ENV['GMAIL_USERNAME'],
    password:             ENV['GMAIL_PASSWORD'],
    authentication:       'plain',
    enable_starttls_auto: true  }

Then on my local computer in ~/.bash_profile I have this code:

export GMAIL_USERNAME='blah@my_app.com'
export GMAIL_PASSWORD='***'

When I run $ env in my terminal, I see that both environment variables are correctly set.

I have also restarted my rails server.

Don P
  • 60,113
  • 114
  • 300
  • 432
  • Does it work as expected in `:test` or `:file` delivery mode? That would isolate the problem to your smtp settings. – jb_314 Dec 25 '13 at 07:10
  • 6
    Maybe a stupid question: did you change config.action_mailer.perform_deliveries = true, as by default this is on false, preventing mails to be sent from your development environment... – Danny Dec 25 '13 at 07:10
  • 2
    Not stupid at all @DannyVanHoof cause that was it! Thank you. – Don P Dec 25 '13 at 07:14

5 Answers5

119

You should add

config.action_mailer.perform_deliveries = true

as by default this is on false, preventing mails to be sent from your development environment...

Unixmonkey
  • 18,485
  • 7
  • 55
  • 78
Danny
  • 5,945
  • 4
  • 32
  • 52
13

For anyone not using smtp, switching the delivery method to sendmail helped me in addition to explicitly setting deliveries to be performed:

config.action_mailer.delivery_method = :sendmail
Aaron Krauss
  • 7,494
  • 1
  • 17
  • 19
  • sendmail is quicker to configure on many servers. Particularly useful for development mode. – Jerome Jan 11 '16 at 13:46
  • i just wanted to add that for me in Rails 5, switching to :sendmail was the only thing that would work – Dog Nov 11 '17 at 06:02
9

If you're having issues sending email from console, you have to call the deliver method on your mail.

MyMailer.create_email.deliver
Michael Brawn
  • 303
  • 2
  • 9
  • that statement doesn't make sense to me. you can make that call in the console. – dtc Jul 09 '17 at 16:12
  • Simply calling your method does not actually deliver mail while in rails console. You need to call the `deliver` method on the mail object that your Mailer method returns. – Michael Brawn Aug 10 '17 at 18:31
  • 1
    my mistake, i didnt know there was a create_email method but in the latest rails (and for a while now, i assumed), `MyMailer.deliver` should be enough. and you can do that either in console or the application – dtc Aug 11 '17 at 17:39
3

All of these answers are great, but there is another place where you can get burned, especially in the context of debugging.

In development.rb make sure you set config.action_mailer.raise_delivery_errors = true

If your .deliver method seems to be working without issue, but you never actually receive the email across the wire, your delivery method may be throwing an exception and rails is swallowing the error. This is very true if you simply have something as simple as a misconfigured credentials, or an aws access denied API error. Save ripping your hair out and make sure you have raise_delivery_errors turned on. It wants to tell you something but can't.

Ryan Romanchuk
  • 10,819
  • 6
  • 37
  • 41
0

So I've figured it out. Having the line ActionMailer::Base.delivery_method = :smtp in config/environment.rb overrides ActionMailer::Base.delivery_method = :test in config/environments/test.rb.

So, delete that line, ActionMailer::Base.delivery_method = :smtp from config/environment.rb and place it in config/environments/production.rb. That allows you to place ActionMailer::Base.delivery_method = :test in config/environments/test.rb and the version you want in config/environments/development.rb. I made development.rb :test as I populated my database using Faker and changed it to :smtp so I was sure that real emails were sent as an additional check.

Note: You must restart your server for these changes to take effect.

Another note: Heroku's current SendGrid Instructions (https://devcenter.heroku.com/articles/sendgrid) put the SendGrid Heroku configuration code in a new config/initializers/mail.rb file which will likely require removing its last line and placing the desired version in each config/environments/[production.rb, development.rb, test.rb]

henrebotha
  • 1,244
  • 2
  • 14
  • 36
DJSampat
  • 309
  • 2
  • 8