Rails 5 application deployed on heroku does not send sendgrid emails to production

It was yesterday and this morning, trying to understand what was happening. I have a simple Rails 5 application that successfully sends emails using sendgrid from a rails console for development, but trying to do the same thing in a rails deployable server console for a hask server does not send an email, but it generates the following error:

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

More details:

  • ruby 2.3.3
  • rails 5.1.3
  • gem 'sendgrid-ruby', '~> 5.0'

config /environment.rb

 # Load the Rails application. require_relative 'application' # Initialize the Rails application. Rails.application.initialize! Invoicer::Application.configure do # Setup the mailer config config.action_mailer.delivery_method = :smtp config.action_mailer.perform_deliveries = true config.action_mailer.smtp_settings = { :user_name => ENV['SENDGRID_USERNAME'], :password => ENV['SENDGRID_PASSWORD'], :domain => '[myapp].herokuapp.com', :address => 'smtp.sendgrid.net', :port => 587, :authentication => :plain, :enable_starttls_auto => true } end 

configurations / environment / development.rb

The only email related code:

 # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false config.action_mailer.perform_caching = false 

configurations / environment / production.rb

The only email-related line is not commented out:

 config.action_mailer.perform_caching = false 

In development, an email is created on my local machine.

Rails Development Console:

 >> ActionMailer::Base.delivery_method => :smtp >> InvoiceMailer.invoice_email(Customer.first).delivery_method Customer Load (0.6ms) SELECT "customers".* FROM "customers" ORDER BY "customers"."id" ASC LIMIT $1 [["LIMIT", 1]] Rendering invoice_mailer/invoice_email.html.erb within layouts/mailer Rendered invoice_mailer/invoice_email.html.erb within layouts/mailer (0.0ms) Rendering invoice_mailer/invoice_email.text.erb within layouts/mailer Rendered invoice_mailer/invoice_email.text.erb within layouts/mailer (0.0ms) InvoiceMailer#invoice_email: processed outbound mail in 17.6ms => #<Mail::SMTP:0x007f939b607b48 @settings= {:address=>"smtp.sendgrid.net", :port=>587, :domain=>"fm- invoicer.herokuapp.com", :user_name=>" app75430225@heroku.com ", :password=>"ms9nps8r7677", :authentication=>:plain, :enable_starttls_auto=>true, :openssl_verify_mode=>nil, :ssl=>nil, :tls=>nil}> 

Heroku production does not ship and I get an error.

In the console of the heroine rails

 $ heroku run rails c Loading production environment (Rails 5.1.3) irb(main):001:0> InvoiceMailer.invoice_email(Customer.first).deliver D, [2017-09-03T14:59:53.803069 #4] DEBUG -- :Customer Load (7.2ms) SELECT "customers".* FROM "customers" ORDER BY "customers"."id" ASC LIMIT $1 [["LIMIT", 1]] I, [2017-09-03T14:59:53.863967 #4] INFO -- :Rendering invoice_mailer/invoice_email.html.erb within layouts/mailer I, [2017-09-03T14:59:53.864680 #4] INFO -- :Rendered invoice_mailer/invoice_email.html.erb within layouts/mailer (0.6ms) I, [2017-09-03T14:59:53.865742 #4] INFO -- :Rendering invoice_mailer/invoice_email.text.erb within layouts/mailer I, [2017-09-03T14:59:53.866329 #4] INFO -- :Rendered invoice_mailer/invoice_email.text.erb within layouts/mailer (0.4ms) D, [2017-09-03T14:59:54.087932 #4] DEBUG -- : InvoiceMailer#invoice_email: processed outbound mail in 232.7ms I, [2017-09-03T14:59:54.101584 #4] INFO -- : Sent mail to XXX@gmail.com (13.4ms) D, [2017-09-03T14:59:54.102047 #4] DEBUG -- : Date: Sun, 03 Sep 2017 14:59:54 +0000 From: XXX@gmail.com To: XXX@gmail.com Message-ID: < 59ac18ea16bd6_451d0d888799@f74404ed-7ea9-41ff-9b05-715d2a185bf4. mail> Subject: XXXXX Website Monthly Invoice - August-2017 Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_59ac18ea151a7_451d0d8886dd"; charset=UTF-8 Content-Transfer-Encoding: 7bit ----==_mimepart_59ac18ea151a7_451d0d8886dd Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Dear XXX Attached please find your monthly invoice. Best, XXX CrazyJ Media ;-) ----==_mimepart_59ac18ea151a7_451d0d8886dd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> /* Email styles need to be inline */ </style> </head> <body> <!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <p>Dear XXX,</p> <p>Attached please find the latest monthly invoice.</p> <p>Best,<br>XXX<br>Crazy J Media</p> </body> </html> </body> </html> ----==_mimepart_59ac18ea151a7_451d0d8886dd-- Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 25 from (irb):1 

Also in the Heroku Rails console:

 irb(main):001:0> ActionMailer::Base.delivery_method => :smtp irb(main):002:0> InvoiceMailer.invoice_email(Customer.first).delivery_method D, [2017-09-13T22:42:58.951166 #4] DEBUG -- : Customer Load (2.8ms) SELECT "customers".* FROM "customers" ORDER BY "customers"."id" ASC LIMIT $1 [["LIMIT", 1]] I, [2017-09-13T22:42:59.037206 #4] INFO -- : Rendering invoice_mailer/invoice_email.html.erb within layouts/mailer I, [2017-09-13T22:42:59.038316 #4] INFO -- : Rendered invoice_mailer/invoice_email.html.erb within layouts/mailer (0.9ms) I, [2017-09-13T22:42:59.039720 #4] INFO -- : Rendering invoice_mailer/invoice_email.text.erb within layouts/mailer I, [2017-09-13T22:42:59.040359 #4] INFO -- : Rendered invoice_mailer/invoice_email.text.erb within layouts/mailer (0.5ms) D, [2017-09-13T22:42:59.413839 #4] DEBUG -- : InvoiceMailer#invoice_email: processed outbound mail in 405.7ms => #<Mail::SMTP:0x0000000575c678 @settings={:address=>"localhost", :port=>25, :domain=>"localhost.localdomain", :user_name=>nil, :password=>nil, :authentication=>nil, :enable_starttls_auto=>true, :openssl_verify_mode=>nil, :ssl=>nil, :tls=>nil}> 

Does anyone have any ideas? I studied Heroku sendgrid ruby โ€‹โ€‹docs , as well as several SO questions and answers like this one , but to no avail. I restarted the heroku server and my sendgrid account associated with this application is up and recording email sent from development.

A lot of positive karma, which is sent in advance to anyone who has any understanding!

+5
source share
2 answers

The error indicates that it is configured to send email using the SMTP server to localhost port 25, which indicates that your configuration is not in use!

When Rails.application.initialize! launched into production, ActionMailer is loaded and configured with the settings that it gave at that moment. In your case, it looks like it uses the default values, since your own configuration is not installed until a later time.

You can solve this problem by simply setting the configuration before initializing the application; either reorder the environment.rb environment to complete the configuration first, or move the ActionMailer configuration to application.rb or the environment configuration (for example, environment / production.rb).

+2
source

Perhaps you need to move the Action Mailer configuration to config / environment / production.rb and / or check to see if it cancels any settings inside this file.

+1
source

Source: https://habr.com/ru/post/1271474/


All Articles