Heroku/devise - Missing host to link to! Please provide :host parameter or set default_url_options[:host]

Ruby on-RailsHerokuDeviseActionmailer

Ruby on-Rails Problem Overview


I am trying to push my app on heroku. I am still in dev. I use devise with the confirmable module.

When I try to add a user with the heroku console I got this error:

Missing host to link to! Please provide :host parameter or set default_url_options[:host]

in test and dev environment i have the following line:

environments/development.rb and environments/test.rb

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

I don't have set up something in the production environment.

I've tried to push with

config.action_mailer.default_url_options = { :host => 'mywebsitename.com' }
config.action_mailer.default_url_options = { :host => 'heroku.mywebsitename.com' }

but it doesn't work too..

I see on the web that it could be related to ActionMailer but I don't know what I have to configure. Many thanks for your idea!

EDITED:

Hi,

In order to not make my app crashes when I push on heroku I put this in my env/test.rb and my env/dev.rb (not in env.rb I think it is because it's a rails 3 app)

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

But when I tried to create a user in the heroku console:

User.create(:username => "test", :email => "[email protected]", :password => "test1234", :password_confirmation => "test1234", :confirmed_at => "2010-11-03 14:11:15.520128")

here are errors I got:

ActionView::Template::Error: Missing host to link to! Please provide :host parameter or set default_url_options[:host]
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:473:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/url_for.rb:132:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_view/helpers/url_helper.rb:99:in `url_for'
/home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:195:in `user_confirmation_url'

EDITED (2)

When I type heroku logs on console I got this ==> production.log <== So I think when one deploys on heroku it's already in production.

I configure the env/prod.rb like this:

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

and now I have this as error when I try to create a User:

Errno::EAFNOSUPPORT: Address family not supported by protocol - socket(2)
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `initialize'
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `open'
/usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `do_start'
/usr/ruby1.8.7/lib/ruby/1.8/timeout.rb:62:in `timeout'

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

You need to add this to your environment.rb

  config.action_mailer.default_url_options = { :host => 'localhost' }

Make sure you change host to your production url and keep it localhost for development. This is for the mailer, it needs a default email to send out notices such as confirmations etc...


You should check the logs on the heroku server heroku logs run that from the console and it will tell you the exact error.

When you push to heroku you need to configure the environment.rb file with the heroku subdomain:

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

Depending upon version, this should go in production.rb, not environment.rb.

Solution 2 - Ruby on-Rails

Ok,

First you have to install the sendgrid gem with this command line:

heroku addons:add sendgrid:free

Then you just have to configure your env/dev.rb and env/prod.rb like this:

env/dev.rb

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

env/prod.rb

config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' }

Push on git and heroku. It should work..

Solution 3 - Ruby on-Rails

Codeglot's anwser above does the job, but we wanted something a bit more flexible, so we did this:

On Heroku, we run multiple Production environments for staging and testing, so we need a flexible solution for the production.rb environment file.

In production.rb

config.action_mailer.default_url_options = { :host => ENV['MAILER_URL'] }

Then set the MAILER_URL environment variable for your app like so

heroku config:set MAILER_URL=my-awesome-app.herokuapp.com --app my-awesome-app

Solution 4 - Ruby on-Rails

If you're running on Cedar:

  1. run heroku addons:add sendgrid:free from your console.

  2. Add the following lines to config/environments/production.rb in your app.

.

  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com'
  }

  ActionMailer::Base.delivery_method = :smtp

  config.action_mailer.default_url_options = { :host => 'YOUR-DOMAIN-HERE.COM' }

Solution 5 - Ruby on-Rails

I had to do a number of things to get it to work in the production environment: Inside of my production.rb file (/config/environments/production.rb) I added the following:

Rails.application.routes.default_url_options[:host] = 'myappsname.herokuapp.com'
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
config.action_mailer.default :charset => "utf-8"

This is with Rails 4 and Devise 3

Solution 6 - Ruby on-Rails

The working one after so many research,

  1. Don't forget to add default from: mail address in your ApplicationMailer (application_mailer.rb) as,

     class ApplicationMailer < ActionMailer::Base
       default from: '[email protected]'
       layout 'mailer'
     end
    
  2. Add the below configuration in your production.rb.

     config.action_mailer.default_url_options = 
       { :host => 'yourapp.herokuapp.com' }
     config.action_mailer.delivery_method = :smtp
     config.action_mailer.smtp_settings = {
       address:              'smtp.gmail.com',
       port:                 587,
       domain:               'heroku.com',
       user_name:            '[email protected]',
       password:             'yourgmailpassword',
       authentication:       'login',
       enable_starttls_auto: true
     }
    
  3. Enable IMAP from your Gmail settings in Forwarding IMAP/POP tab.

  4. Allow less secure apps: ON from https://myaccount.google.com/lesssecureapps

You're now good to go. :)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbenoitrView Question on Stackoverflow
Solution 1 - Ruby on-RailsthenengahView Answer on Stackoverflow
Solution 2 - Ruby on-RailsbenoitrView Answer on Stackoverflow
Solution 3 - Ruby on-RailsRossView Answer on Stackoverflow
Solution 4 - Ruby on-RailsMikeView Answer on Stackoverflow
Solution 5 - Ruby on-RailsmaudulusView Answer on Stackoverflow
Solution 6 - Ruby on-RailsAnshab M KView Answer on Stackoverflow