DEV Community

Tulio Calil
Tulio Calil

Posted on • Updated on • Originally published at tuliocalil.com.br

Criando serviço de envio de e-mail com ELIXIR!🔮

Elixir
Que tal criar um mini servidor HTTP para envio de e-mail SMTP com o Elixir ?

Hey, eu atualizei esta postagem no meu blog pessoal, veja agora!

Nesse post vou demonstrar como criar um super simples, pequeno e muito leve. Também vamos ver como fazer envio de e-mail quando o usuário acessar uma determinada rota do servidor.

generated with Summaryze Forem 🌱

Iniciando

Primeiro precisamos preparar nosso ambiente, caso você ainda não tenha o Elixir no seu ambiente, basta seguir esse guia oficial que é simples e detalhado.
Com o Elixir instalado, vamos criar um novo projeto:

mix new email --sup
Enter fullscreen mode Exit fullscreen mode

Desta forma vamos criar um novo projeto utilizando o Mix, que é uma ferramenta que vem junto com o Elixir para criar, testar e compilar códigos em Elixir, além de gerenciar dependências também.
O parâmetro --sup é para que possamos gerar uma aplicação com o esqueleto no padrão OTP.

Instalando dependências

Podemos navegar até o nosso projeto e vamos agora instalar as dependências que vamos usar, são elas:

  • plug_cowboy: Uma implementação do Cowboy para o Elixir.
  • poison: Biblioteca JSON para o Elixir.
  • plug: Uma especificação para componentes e adaptadores web(uma forma de padronizar o objeto de conexão).
  • bamboo: Envio de e-mail com Elixir.
  • bamboo_smtp: Adaptador para usarmos SMTP no bamboo.

Para isso, vamos abrir o arquivo mix.esx e adicionar as seguintes linhas dentro do bloco deps:

{:plug, "~> 1.5"},
{:plug_cowboy, "~> 1.0"},
{:poison, "~> 3.1"},
{:bamboo, "~> 2.1.0"},
{:bamboo_smtp, "~> 4.0.1"}
Enter fullscreen mode Exit fullscreen mode

Agora, voltamos ao terminal e vamos instalar de fato as dependências, para isso no terminal rode o comando:

mix deps.get
Enter fullscreen mode Exit fullscreen mode

Criando servidor HTTP

Com as dependências instaladas vamos começar configurar nosso servidor HTTP, para isso vamos configurar a inicialização dele, abra o arquivo lib/email/application.ex e adicione a seguinte linha dentro da lista children:

Plug.Adapters.Cowboy.child_spec(scheme: :http, plug: Email.Router, options: [port: 8085])
Enter fullscreen mode Exit fullscreen mode

Pela ordem de parâmetros:

  • Schema é o protocolo que vamos utilizar: HTTP(tcp) ou HTTPS(ssl).
  • plug é para que possamos informar um Plug personalizado, nesse caso será o nosso router (eu recomendo essa leitura aqui para ficar mais claro).
  • Options são opções que podemos passar para o servidor, neste caso usamos apenas a porta, você pode ver outras aqui.

Como especificamos nosso modulo Email.Router, precisamos cria-lo agora, para isso, dentro da pasta lib/email crie um arquivo com o nome "email_router.ex" e dentro dele vamos declarar o nosso modulo e nossas rotas, dessa forma:

defmodule Email.Router do
  use Plug.Router
  use Plug.Debugger
  require Logger

plug(Plug.Logger, log: :debug)
plug(:match)
plug(:dispatch)

get "/" do
  send_resp(conn, 200, "Server rodando...")
end

match _ do
  send_resp(conn, 404, "Pagina não encontrada")
end

end
Enter fullscreen mode Exit fullscreen mode

Explicando:
Após definir nosso modulo, utilizamos o use para injetar dois módulos no contexto do nosso router.
Com require Logger vamos importar alguns recursos do logger (exceto funções).

Temos algumas chamadas plug, que basicamente vão configurar os modulos de log, match(para fazer o match das rotas com a requisição) e dispatch (processar a requisição após o match).

Na ultima parte do arquivo, temos as nossas rotas: uma GET na raiz que responde com status code 200 e uma mensagem e a segunda, que serve como um "caso não encontre a rota", renderizando um "Pagina não encontrada".

Rodando servidor HTTP

Agora vamos compilar e rodar nosso servidor, para isso rode no seu terminal o seguinte comando:

 iex -S mix
Enter fullscreen mode Exit fullscreen mode

Agora basta acessar o endereço: http://localhost:8085/ e vamos ver nosso servidor rodando:
Elixir http

Como podemos ver, nosso servidor está funcionando perfeitamente!
Vamos agora para o próximo passo!

Enviando e-mail

Para fazermos o envio do e-mail, vamos começar configurando nosso servidor SMTP, para esse tutorial, vou utilizar o Mailtrap.
Na raiz do nosso projeto vamos criar uma pasta config e um arquivo config.exs, o module Config é utilizado para definirmos varias configurações do nosso aplicativo, além de configurações do iex também.
Nele vamos colocar nossa configuração de SMTP, o conteúdo ficará dessa forma:

use Mix.Config

config :email, Email.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: "SERVER",
  hostname: "SERVER",
  port: 2525,
  username: "USER", # or {:system, "SMTP_USERNAME"}
  password: "PASS", # or {:system, "SMTP_PASSWORD"}
  tls: :always, # can be `:always` or `:never`
  allowed_tls_versions: [:"tlsv1", :"tlsv1.1", :"tlsv1.2"], # or {:system, "ALLOWED_TLS_VERSIONS"} w/ comma seprated values (e.g. "tlsv1.1,tlsv1.2")
  ssl: false, # can be `true`
  retries: 1,
  no_mx_lookups: false, # can be `true`
  auth: :if_available # can be `:always`. If your smtp relay requires authentication set it to `:always`.
Enter fullscreen mode Exit fullscreen mode

Basta preencher com suas informações e pronto.
Vamos precisar criar um modulo mailer passando o nome da nossa aplicação, para isso, crie um arquivo chamado mailer.exs dentro de lib/email e dentro dele vamos por:

defmodule Email.Mailer do
  use Bamboo.Mailer, otp_app: :servidor_email
end
Enter fullscreen mode Exit fullscreen mode

Agora abra o arquivo email_router.ex e na rota de GET vamos adicionar o seguinte:

 import Bamboo.Email
 ...
 new_email()
 |> to("meu@email.com")
 |> from("meu@email.com")
 |> subject("Teste")
 |> text_body("Testando envio de email")
 |> Email.Mailer.deliver_now
Enter fullscreen mode Exit fullscreen mode

Aqui o código começa a ficar um pouco "estranho" pra quem não tem contato com Elixir, mas vou explicar: Primeiro fazemos o import do modulo "Email" dentro de "Bamboo", dessa forma temos acesso as funções contidas no modulo.
Em seguida fazemos uma chamada a função new_email() que vem do modulo que importamos e começamos uma sequencia de pipe. Utilizamos o pipe para pegar o resultado de uma expressão e lançar como primeiro argumento de uma outra. Esteticamente lembra o fluent pattern.

Agora, basta rodar nosso servidor novamente e acessarmos nossa rota GET e verificar o e-mail do Mail trap:

 iex -S mix
Enter fullscreen mode Exit fullscreen mode

Mailtrap:
Mailtrap

Conclusão

Podemos melhorar ainda mais esse código, podemos por exemplo pegar os parâmetros de e-mail(destinatário, mensagem e assunto) via GET ou POST, podemos também utilizar um .env para carregar as informações do SMTP de forma mais segura.
Espero que tenha gostado, já faz algum tempo que queria escrever sobre Elixir e foi super legal.
Aqui está o projeto finalizado:

GitHub logo tuliocll / email-elixir

Servidor HTTP que envia e-mail

Servidor HTTP Envio de E-mail com Elixir 🔮

DEV to

Sobre📖

Projeto de exemplo utilizado para escrever o post: Criando serviço de envio de e-mail com ELIXIR!🔮

Como usar ❓

Clone o projeto:

git clone https://github.com/tuliocll/email-elixir.git
Enter fullscreen mode Exit fullscreen mode

Configure o SMTP em config/config.exs (recomendo mailtrap para teste).

Instale as dependências:

mix deps.get
Enter fullscreen mode Exit fullscreen mode

Rode o projeto

iex -S mix
Enter fullscreen mode Exit fullscreen mode

Acesse a url: http:localhost:8085.

Buy me a coffe! ☕






Veja esse episodio super legal do Coffe Zone onde falamos de Elixir:

Top comments (0)