alnafie
alnafie

Reputation: 10788

Rails email with gmail smtp error "Errno::ECONNREFUSED - No connection could be made because the target machine actively refused it."

When attempting to send email from within my Rails 3 app in development mode on my local machine, I received the following error:

Errno::ECONNREFUSED in RemindersController#create

No connection could be made because the target machine actively refused it. - connect(2)

Upvotes: 2

Views: 1507

Answers (2)

GoBusto
GoBusto

Reputation: 4778

I encountered this issue whilst reading through Agile Web Development with Rails 4 chapter 13, and it turned out that any email config stuff added to config/environment.rb was being ignored, despite the book indicating that "shared" email settings for all environments could be added there.

Moving the settings into config/environments/development.rb (and restarting the Rails server) fixed the issue, allowing emails to be sent on either port 25 or port 587 without any problems:

# development.rb
Rails.application.configure do

  # ...blah blah blah...

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: '[email protected]',
    password: 'yourpassword',
    authentication: 'plain',
    enable_starttls_auto: true
  }
end

NOTE: development.rb didn't contain any email-related settings originally, so I don't think that the values in environment.rb were being superseded - it's more like they simply had no effect. The I18n.default_locale = 'en-GB' line in environment.rb was working, though, so it's not like the file was being completely disregarded...

Upvotes: 0

alnafie
alnafie

Reputation: 10788

After spending several hours sifting through similar questions on SO and blog posts with none of the proposed solutions working, here is the solution I finally arrived at:

tl;dr

Change your smtp port setting to 25, instead of 587 which is in all the tutorials & docs.

Detailed answer (for humans):

Step 1. Go watch railscast #206 then come back. I'll wait.

Step 2. Get extra aggravated at how easy he makes it seem even though you're getting ridiculous errors.

Step 3. Go to app/config/environments/development.rb and change line 17 from false to true. This will show you where things are getting messed up.

# config.action_mailer.raise_delivery_errors = false
config.action_mailer.raise_delivery_errors = true

Step 4. Still in app/config/environments/development.rb add the following code before the last end statement. (You no longer need the app/config/initializers/setup_mail.rb file created in the screencast when you are in development mode and can safely delete it.)

  config.action_mailer.delivery_method = :smtp

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

Notes:

  • Notice we did not specify the :domain setting like in the tutorials and it works fine.

  • Notice also that we used your_username @gmail.com as the :user_name setting.

  • If you use 2-step authentication for your gmail account you will have to generate a special app-specific
    password
    . disclaimer: I did not try this.

  • AND THE BIG FAT ELEPHANT IN THE ROOM, is that we used :port => 25 NOT 587 despite the fact that nearly every single tutorial, SO question, and the rails guide only suggest 587. Granted, this could possibly be because my work blocks port 587? I have no idea. But this was my key problem no one solved for me. The way to find out if this is your problem is to use telnet. If you are on windows you have to first enable telnet by following these instructions. Then go to your command prompt and type telnet smtp.gmail.com 587 if it works you will get a response like 220 mx.google.com ESMTP pi6sm33274849wic.3 - gsmtp. Otherwise it will tell you it could not connect, in which case you can try it on a different port eg. telnet smtp.gmail.com 25.

I hope this helps some lost soul.

Upvotes: 2

Related Questions