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.
- Iniciando
- Instalando dependências
- Criando servidor HTTP
- Rodando servidor HTTP
- Enviando e-mail
- Conclusão
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
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"}
Agora, voltamos ao terminal e vamos instalar de fato as dependências, para isso no terminal rode o comando:
mix deps.get
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])
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
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
Agora basta acessar o endereço: http://localhost:8085/ e vamos ver nosso servidor rodando:
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`.
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
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
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
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:
tuliocll / email-elixir
Servidor HTTP que envia e-mail
Servidor HTTP Envio de E-mail com Elixir 🔮
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
Configure o SMTP em config/config.exs
(recomendo mailtrap para teste).
Instale as dependências:
mix deps.get
Rode o projeto
iex -S mix
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)