52

I have been working with rails since a long. Now I am facing a small issue in the ActionMailer. I want to send an email when user gets registered to confirm his registration. I am able to send email in the development mode but where as not in the production mode.
the exception Errno::ECONNREFUSED: Connection refused - connect(2) is coming everytime when deliver method is called.
I have written the following code.
My SMTP config looks:
config.action_mailer.default_url_options = { :host => "localhost:3000" }

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.smtp_settings = {   
    :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE,      
    :ssl => true,
    :enable_starttls_auto => true,  #this is the important stuff!
    :address        => 'smtp.xxxx.xxx',
    :port           => xxx,
    :domain         => 'xxxxxx',
    :authentication => :plain,
    :user_name      => 'xxxxxxx@xxx.xxx',
    :password       => 'xxxxxxxxx'
  }

In the controller, I have written the following:

def confirm_registration_in_c       
 @user = User.find_by_email(asdf123@gmail.com)
 if @user
      UserMailer.confirm_registration(@user).deliver            
 end
end

In my user_mailer.rb :

class UserMailer < ActionMailer::Base
  default from: "from@example.com"

  def confirm_registration(user)
   @user = user
   @user_name = @user.name       
   email = @user.email 
   mail(:to => email, :subject => "Reset your password")
  end
end

I am able to send email in the development mode in my local host, but I am not able to send the email in the dedicated server.
Can anybody help me please?

VenkatK
  • 1,295
  • 1
  • 9
  • 21
  • See this: http://ramblinglabs.com/blog/2011/10/rails-3-1-smtp-gmail-errnoeconnrefused-connection-refuse – zeantsoi Jun 17 '13 at 05:58

8 Answers8

26

In my situation, I encountered similar problems when I was trying to making through a sending-email Rails app tutorial, the Heroku logs kept telling my that

......

Errno::ECONNREFUSED (Connection refused - connect(2) for "localhost" port 25):

......

After I compared my code with author's code, I got to find out that I had not setup my ActionMailer configurations in the config/environments/production.rb file.

Then I came to realized that I just had my config/environments/development.rb configured for sending-email, but I had not done it for my config/environments/production.rb.

So you may check it when your app's behavior difers between development and production.

oppih
  • 860
  • 8
  • 14
  • I made the same silly mistake. I had added the line `config.action_mailer.smtp_settings = { address: "xxxxxxx.xxxxxxx.com" }` in app/config/environments/development.rb but forgot to add it to app/config/environments/production.rb. – wetjosh Nov 30 '15 at 19:34
8

Be sure you have configured your port correctly. I switched from gmail in development (port 587) to sending from my local server in production and was getting this error till I corrected the port to the one my server uses (port 25).

Sorry-Im-a-N00b
  • 1,151
  • 2
  • 12
  • 20
6

My problem is not identical to this question, but I feel many would found this thread via google.

If you use external SMTP service like sendgrid and has set up ActionMailer accordingly, yet it still gives this error:

Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 25

You may be passing config hash with String key, which are ignored. Keys must be symbols!

This may happen if it is de-serialized, what I did is to ensure keys are symbols:

config.action_mailer.smtp_settings = get_smtp_setting.symbolize_keys
lulalala
  • 17,572
  • 15
  • 110
  • 169
  • 1
    Even if this was not my problem it put me in the right direction: my configuration was not being loaded, a console execution of this `ActionMailer::Base.smtp_settings` was showing me that the values were the default ones – fguillen Dec 21 '18 at 19:11
  • @fguillen how did you fix it? Code? – Roger Perez Apr 10 '19 at 04:00
  • This helped me go in the right direction. My issue was I had set `address: 'localhost'` instead of `address: '127.0.0.1'`. – Francisco Quintero Nov 30 '21 at 16:24
5

for production you cant write

config.action_mailer.default_url_options = { :host => "localhost:3000" }

add production url for host, like,

config.action_mailer.default_url_options = { :host => "http://www.yourdomain.com" }
Pandurang Waghulde
  • 995
  • 1
  • 6
  • 19
2

There is another reason for this error:

Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 25

It should be looked at SENDMAIL service on your server:

  • Is SENDMAIL installed?
  • Is SENDMAIL running?

I had this error due to the stopped SENDMAIL.

Good luck!

Taika
  • 49
  • 3
1

I had a similar issue with SendGrid and repeated Errno::ECONNREFUSED: Connection refused - connect(2) ) Finally I modified the way smtp settings were set by changing the definition within /config/environments/production.rb from:

    ActionMailer::Base.smtp_settings = {

to:

    config.action_mailer.smtp_settings = { 

this did the trick.

HatLess
  • 10,622
  • 5
  • 14
  • 32
0

I just tracked down a similar problem while trying to deploy wordpress with Capistrano.

cap aborted! Errno::ECONNREFUSED: Connection refused - connect(2) for "{my-ip-address}" port {my-ssh-port}

I would also get this similar error:

Tasks: TOP => git:create_release (See full trace by running task with --trace) The deploy has failed with an error: #<Errno::ECONNREFUSED: Connection refused - connect(2) for "my-ip-address" port {my-port}>

It turns out it was an issue with concurrent SSH sessions as my server runs Fail2Ban. To solve that I simply did the following:

  1. Edit the jail that contains SSH configurations

    $ sudo nano /etc/fail2ban/jail.local

  2. look for [SSH] and set enabled = false

  3. then find [ssh-ddos] and set enabled = false

  4. Remember to restart Fail2Ban after your changes and open-ssh (if thats what your using)

$ sudo service fail2ban reload

$ sudo /etc/init.d/ssh reload

Its worth noting that the connection would be refused at different steps (tasks) in the deployment. For example after a reboot and a quick bundle exec cap production deploy:check everything appeared fine. Then I tried to deploy and received the same error, but during the execution of a different task. I also use UFW which I disabled and reenabled without issues. UFW was not the cause of the above problem.

I had a similar problem after I solved this. It was an issue with the current directory permissions. That's over here.

Community
  • 1
  • 1
Ken Prince
  • 1,437
  • 1
  • 20
  • 26
0

You may see a similar error message when using turbo_stream in rails 7 (or while doing the rails 7 demo).

If you do, run this and everything should work:

redis-server

More info here.

stevec
  • 41,291
  • 27
  • 223
  • 311