ruby-on-rails - sendgrid - rails devise confirmation email




Heroku/legenda-anfitrião ausente para vincular a! Por favor, forneça: parâmetro host ou defina default_url_options (5)

Eu estou tentando empurrar meu aplicativo no heroku. Eu ainda estou no dev. Eu uso o legado com o módulo confirmable.

Quando tento adicionar um usuário com o console heroku, recebo este erro:

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

no teste e no ambiente de desenvolvimento eu tenho a seguinte linha:

ambientes / development.rb e ambientes / test.rb

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

Eu não configurei algo no ambiente de produção.

Eu tentei empurrar com

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

mas também não funciona

Eu vejo na web que poderia estar relacionado ao ActionMailer, mas não sei o que tenho para configurar. Muito obrigado pela sua ideia!

EDITADO:

Oi,

A fim de não fazer o meu aplicativo trava quando eu empurrar heroku eu coloquei isso no meu env / test.rb e meu env / dev.rb (não em env.rb eu acho que é porque é um aplicativo 3 rails)

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

Mas quando tentei criar um usuário no console do heroku:

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

aqui estão os erros que recebi:

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'

EDITADO (2)

Quando eu digito logs heroku no console eu tenho isso ==> production.log <== Então eu acho que quando um implanta no heroku já está em produção.

Eu configurei o env / prod.rb assim:

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

e agora eu tenho isso como erro quando tento criar um usuário:

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'

A pesquisa de Codeglot acima faz o trabalho, mas nós queríamos algo um pouco mais flexível, então fizemos isso:

Na Heroku, executamos vários ambientes de produção para teste e teste, portanto, precisamos de uma solução flexível para o arquivo de ambiente production.rb.

Na produção.rb

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

Em seguida, defina a variável de ambiente MAILER_URL para seu aplicativo como

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

Aqui está um truque a considerar. Isso facilitará a troca de servidor e ambiente e a alteração de domínio como em um domínio personalizado no heroku.

Em vez de codificar o nome do host, leia-o na solicitação. Aqui está um exemplo de um aplicativo simples que eu tenho.

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

  ....   

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

No exemplo simples, tenho apenas uma ação, criar, que resulta em emails sendo enviados. Você pode adicionar o before_filter em application_controller.rb sem os excluir para que ele sempre armazene o nome do host.

PRÓ:

  • sempre obter o nome do host correto no URL dos e-mails que você envia
  • Ter as default_url_options no nosso servidor de temporariedade configurado para produção resultou em emails sendo enviados para testar usuários com links para produção (eles clicam neles, é claro). Nenhum dano, mas muito demorado.

VIGARISTA:

sem as default_url_options que você não pode enviar manualmente no console

#config.action_mailer.default_url_options = { :host => 'mydomain.com' }
$rails console
  User.invite!(email: "[email protected]")
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
...stacktrace

Se você pode ver as desvantagens que eu não posso, por favor, compartilhe! obrigado


Eu tive que fazer uma série de coisas para fazê-lo funcionar no ambiente de produção : Dentro do meu arquivo production.rb (/config/environments/production.rb) eu adicionei o seguinte:

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"

Isso é com o Rails 4 e o Devise 3


O trabalho depois de tantas pesquisas,

  1. Não se esqueça de adicionar o padrão de: endereço de email em seu ApplicationMailer (application_mailer.rb) como,

    class ApplicationMailer < ActionMailer::Base
      default from: '[email protected]'
      layout 'mailer'
    end
  2. Adicione a configuração abaixo em sua produção.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. Ative o IMAP nas configurações do Gmail na guia Encaminhamento IMAP / POP .

  4. Permitir aplicações menos seguras: ON a partir de https://myaccount.google.com/lesssecureapps

Você está pronto para ir. :)


Se você está correndo no Cedar :

  1. run heroku addons:add sendgrid:free do seu console.

  2. Adicione as seguintes linhas ao config/environments/production.rb no seu aplicativo.

.

  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' }




actionmailer