Take the 2-minute tour ×

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:


in test and dev environment i have the following line:

environments/development.rb and environments/test.rb


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!



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 => "test@test.com", :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_view/helpers/url_helper.rb:99:in `url_for'


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'
share|improve this question

6 Answers 6

up vote 137 down vote accepted

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.

share|improve this answer
Hi sam! I am sorry but i didn't get it. I just add the line config.action_mailer.default_url_options = { :host => 'localhost' } in my env.rb but my rails 3 app crashes on heroku. Did I have to put something on the env/prod.rb too? (sorry my english is so so-so..) –  benoitr Nov 6 '10 at 20:37
Also ,did I have to put my rails app in production mode? Thanks! –  benoitr Nov 6 '10 at 20:56
see update, i added more –  Dark Passenger Nov 7 '10 at 0:13
:host => 'yourapp.heroku.com' this should be your domain. For example, if your domain is yahoo.com, then it should be yahoo.heroku.com or if you already setup custom domains it will just be your url yahoo.com –  Dark Passenger Nov 7 '10 at 16:07
Isn't it going to be config.action_mailer.default_url_options = { :host => 'yourapp.herokuapp.com', as opposed to just config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' ? –  maudulus Apr 22 at 0:32


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:




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

Push on git and heroku. It should work..

share|improve this answer
I get this error when I reference config.action_mailer in production.rb: /app/.bundle/gems/ruby/1.9.1/gems/railties-3.0.7/lib/ rails/railtie/configuration.rb:77:in method_missing': undefined method action_mailer' for #<Rails: :Application::Configuration:0x0000000241f760> (NoMethodError) –  Laran Evans May 12 '11 at 5:39
I am not sure I can help here... Did you reference it inside the block? (Website::Application.configure do ... config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' } ... end) –  benoitr May 15 '11 at 2:52
now the sendgrid command is heroku addons:add sendgrid:starter (view usage details at devcenter.heroku.com/articles/sendgrid) –  Danny Oct 27 '11 at 14:33

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
share|improve this answer

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' }
share|improve this answer

Here's a trick to consider. It will make it easier to switch server and environment, and changing domain as in a custom domain at heroku.

Instead of hard-coding the host name, read it from the request. Here's an example of a simple app I have.

class MyMailController < ApplicationController
  before_filter :set_host_from_request, only: [:create]


  def set_host_from_request
    ActionMailer::Base.default_url_options = { host: request.host_with_port }

in the simple example I have only one action, create, that results in emails being sent. You can add the before_filter in application_controller.rb without the excludes to make it always store the host name.


  • always get the correct host name in the URL of emails you send
  • Having the default_url_options at our staging server configured for production, resulted in emails being sent to test users with links to production (they click them of course). No damage, but very time consuming.


without the default_url_options you cannot send manually in console

#config.action_mailer.default_url_options = { :host => 'mydomain.com' }
$rails console
  User.invite!(email: "ceo@example.com")

If you can see drawbacks that I can't, please share! Thanks

share|improve this answer
nice hack, but the problem is that one should not have more than one production environment... production is for real users, the others are staging, development, demo or call it "santa_claus" if you want. –  Nicolas Garnil Mar 16 '13 at 22:55
@NicolasGarnil I agree. I don't like my solution at all anymore. Better set this up in the environment file as proposed by benoitr. –  oma Mar 23 '13 at 14:56

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

share|improve this answer

Your Answer


