DEV Community

Cover image for Criando um Sistema de Envio de Emails com Rails e Sidekiq: Um Guia Prático
Fernanda
Fernanda

Posted on

Criando um Sistema de Envio de Emails com Rails e Sidekiq: Um Guia Prático

Introdução
Neste artigo, vou mostrar como criar um sistema de envio de emails em uma aplicação Ruby on Rails utilizando Sidekiq para processamento de background jobs. Vou detalhar o processo passo a passo, desde a configuração inicial até a implementação e testes. Também discutirei possíveis casos de uso para este sistema.

Objetivos do Projeto
Nosso objetivo é construir uma funcionalidade que permita ao usuário enviar emails a partir da nossa aplicação Rails. Utilizaremos Sidekiq para processar o envio de emails em segundo plano e Letter Opener ou MailCatcher para visualizar os emails enviados durante o desenvolvimento.

Repositório: github

Configuração do Ambiente

  1. Instalação do Sidekiq:
    Primeiro, adicionamos a gem sidekiq ao nosso Gemfile e configuramos o Redis como nosso backend para o Sidekiq.

  2. Configuração do Mailer:
    Configuramos o ActionMailer para usar SMTP com MailCatcher, uma ferramenta para visualizar emails enviados em ambiente de desenvolvimento.

  3. Criação do Job:
    Implementamos um job de background que envia o email usando o Sidekiq.

  4. Criação do Formulário de Envio:
    Implementamos um formulário simples para enviar emails.

Passos Detalhados

  • Instalação e Configuração do Sidekiq Adicione a gem sidekiq ao seu Gemfile e execute bundle install.

Configure o Sidekiq e Redis em config/application.rb:

config.active_job.queue_adapter = :sidekiq
Enter fullscreen mode Exit fullscreen mode
  • Configuração do Mailer No config/environments/development.rb, configure o ActionMailer para usar MailCatcher:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: 'localhost',
  port: 1025
}
Enter fullscreen mode Exit fullscreen mode
  • Criando o Job Crie um job para enviar o email:
class SendReportJob < ApplicationJob
  queue_as :default

  def perform(user, subject, body)
    ReportMailer.send_report(user, subject, body).deliver_now
  end
end
Enter fullscreen mode Exit fullscreen mode
  • Implementação do Mailer Crie um mailer para enviar o email:
class ReportMailer < ApplicationMailer
  def send_report(user, subject, body)
    @user = user
    @body = body

    mail(
      to: @user.email,
      subject: subject
    ) do |format|
      format.text { render plain: @body }
    end
  end
end

Enter fullscreen mode Exit fullscreen mode
  • Criando o Formulário No arquivo app/views/emails/new.html.erb, adicione o formulário para enviar o email:
<div class="container mt-5">
  <h1 class="mb-4">Enviar E-mail</h1>
  <div class="form-group">

  <%= form_with url: send_email_path, local: true, class: "needs-validation" do |form| %>
    <div class="mb-3">
      <%= form.label :user_id, "Selecione um usuário:", class: "form-label" %>
      <%= form.collection_select :user_id, User.all, :id, :name, { prompt: "Escolha um usuário" }, { class: "form-select" } %>
    </div>

    <div class="mb-3">
      <%= form.label :subject, "Assunto:", class: "form-label" %>
      <%= form.text_field :subject, class: "form-control", placeholder: "Digite o assunto" %>
    </div>

    <div class="mb-3">
      <%= form.label :body, "Corpo do e-mail:", class: "form-label" %>
      <%= form.text_area :body, rows: 10, class: "form-control", placeholder: "Escreva a mensagem do e-mail" %>
    </div>

    <div class="mb-3">
      <%= form.submit "Enviar E-mail", class: "btn btn-primary" %>
    </div>
  <% end %>

  <% if notice %>
    <div class="alert alert-<%= notice['class'] %> mt-4"><%= notice['message'] %></div>
  <% end %>
</div>

  <%= link_to "Add user", new_user_path, class: "btn btn-secondary mt-3" %>
</div>

Enter fullscreen mode Exit fullscreen mode

Casos de Uso
Envio de Relatórios Periódicos: Enviar relatórios de desempenho ou de vendas para os usuários em horários programados.
Notificações de Sistema: Enviar notificações importantes sobre o sistema ou atualizações para os usuários.
Recuperação de Senha: Enviar emails para recuperação de senha e outros processos de autenticação.
Conclusão
Neste artigo, cobrimos como criar um sistema de envio de emails em Rails usando Sidekiq para processamento assíncrono. Implementamos a configuração necessária, criamos um job para enviar emails, e testamos a funcionalidade usando ferramentas como MailCatcher. Agora, você pode expandir esse sistema para atender a diferentes necessidades da sua aplicação.

Referências
Documentação do Sidekiq

Documentação do ActionMailer

MailCatcher

Top comments (0)