DEV Community

Alexandre
Alexandre

Posted on

Uma introdução sobre Action Mailer em Rails 7

Nessa introdução, eu vou ensinar a usar action mailer.

O que é Action Mailer?

O Action Mailer é um recurso de Rails que permite enviar email da sua aplicação.

Uma característica bem interessante do Action Mailer é que ele é bem similar ao Controller, ou seja, tudo que você aprendeu sobre Controller, pode ser aplicado em Mailer.

Vamos ver quais são as semelhanças entre Controller e Mailer:

  • Actions e views.
  • Variáveis ​​de instância que é acessível no views.
  • A capacidade de usar layouts e partials.
  • A capacidade de acessar um hash de parâmetros.

Agora que você sabe o que é Mailer, vamos pôr em prática.

Pondo em prática

Vamos criar uma aplicação simples de autenticação de usuário.

Se quiser acompanhar, basta executar os comandos abaixo.

Primeiro, vamos criar um projeto.

rails new mailer_introducao
cd mailer_introducao
Enter fullscreen mode Exit fullscreen mode

Com projeto criado, vamos usar o scaffold para criar o model e controller de uma vez.

rails g scaffold Usuario nome email senha
Enter fullscreen mode Exit fullscreen mode

Com isso, nós temos um projeto para ação.

Como nós podemos criar o mailer?

Bem, o jeito mais rápido seria usar o generator.

Então vamos usar o generator.

Criando mailer

Eu quero que a aplicação envie um email de saudação para o usuário que cadastrou na aplicação.

Então vamos criar o mailer.

rails g mailer Usuario bem_vindo
Enter fullscreen mode Exit fullscreen mode

O mailer foi criado com nome Usuario e o bem_vindo é a action dele.

Vamos ver o arquivo app/mailers/usuario_mailer.rb para ver o que o generator gerou.

# app/mailers/usuario_mailer.rb
class UsuarioMailer < ApplicationMailer
  def bem_vindo
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end
Enter fullscreen mode Exit fullscreen mode

O método bem_vindo que é a action que nós colocamos no generator e você pode notar que ele também criou um view para essa action, veja no app/views/usuario_mailer/.

O método mail cria uma mensagem de email atual. O to: "to@example.org" é o email para quem a aplicação vai enviar.

Agora vamos tirar o código gerado do método e colocar o que queremos para que possa enviar o email.

# app/mailers/usuario_mailer.rb
class UsuarioMailer < ApplicationMailer
  def bem_vindo
    @usuario = params[:usuario]

    mail(to: @usuario.email, subject: 'Bem vindo ao meu site')
  end
end
Enter fullscreen mode Exit fullscreen mode

Podemos percebe que no método mail, existe outra argumento além do to. O subject é o assunto do email.

Agora, Vamos editar a view, pois nós queremos fazer uma mensagem de saudação.

Abra o arquivo app/views/usuario_mailer/bem_vindo.html.erb.

<!-- app/views/usuario_mailer/bem_vindo.html.erb -->
<p><%= @usuario.nome %>, bem vindo ao meu site.</p>

<p>Espero que goste do conteúdo do site.</p>
Enter fullscreen mode Exit fullscreen mode

Agora vamos editar o controller, para que envie o email ao criar o usuário.

Abra o arquivo app/controllers/usuarios_controller.rb.

# app/controllers/usuarios_controller.rb
class UsuariosController < ApplicationController
  ...
  def create
    @usuario = Usuario.new(usuario_params)

    respond_to do |format|
      if @usuario.save
        UsuarioMailer.with(usuario: @usuario).bem_vindo.deliver_later
        format.html { redirect_to usuario_url(@usuario), notice: "Usuario was successfully created." }
        format.json { render :show, status: :created, location: @usuario }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @usuario.errors, status: :unprocessable_entity }
      end
    end
  end
...
end
Enter fullscreen mode Exit fullscreen mode

Vamos focar nesse comando UsuarioMailer.with(usuario: @usuario).bem_vindo.deliver_later.

O UsuarioMailer é classe que nós criamos.

O método with é usado para que você possa passar alguma variável para mailer, no nosso caso, nós estamos passando a variável @usuario e para acessar no mailer, basta usar o params[:nome_que_voce_passou_no_metodo].

O método bem_vindo está, obviamente, chamando o método que nós criamos.

E por último, temos o método deliver_later, o que ele faz é basicamente enviar o email assincronamente, ou seja, a aplicação não vai ficar esperando a execução de envio de email para poder executar os próximos comandos.

E se você não queira enviar o email depois, basta usar o deliver_now que ele vai enviar imediatamente.

Agora vamos rodar o servidor, para ver em ação.

Antes de rodar o servidor, migre o banco de dados.

rails db:migrate
rails server
Enter fullscreen mode Exit fullscreen mode

Vá no navegador e acesse no http://127.0.0.1:3000/usuarios e crie um novo usuário, saiba que agora, a aplicação não vai enviar o email.

Assim que você criar o usuário, vá no terminal e você vai ver o html do view que nós editamos no app/views/usuario_mailer/bem_vindo.html.erb.

Isso significa que até aqui está funcionando.

Mas nós não queremos que aplicação mostre no terminal, queremos que a aplicação envie para Gmail do usuário.

Aqui, eu vou usar o Gmail para enviar, se você quer usar outros serviços, vai ter que pesquisar.

Enviando email usando Gmail

Vá no config/environments/development.rb e adicione o código abaixo.

require "active_support/core_ext/integer/time"

Rails.application.configure do
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              'smtp.gmail.com',
    port:                 587,
    user_name:            'SEU_EMAIL',
    password:             'SUA_SENHA',
    authentication:       'plain',
    enable_starttls_auto: true,
    open_timeout:         5,
    read_timeout:         5
  }
  ...
end
Enter fullscreen mode Exit fullscreen mode

Em 15 de julho de 2014, o Google aumentou suas medidas de segurança para bloquear tentativas de aplicativos que considera menos seguros. Você pode alterar suas configurações do Gmail aqui para permitir as tentativas. Se sua conta do Gmail tiver autenticação de 2 fatores habilitada, você precisará definir uma senha de aplicativo e usá-la em vez de sua senha normal.

Com isso, você vai conseguir enviar o email, então tome cuidado para não enviar para um email de alguém aleatório.

Então é isso, nós acabamos por aqui, claro que tem muitas coisas que não citei, mas eu decidi que não era relevante assim na introdução, pois com isso, já é capaz de fazer muita coisa.

E tchau!

Top comments (0)