An Interest In:
Web News this Week
- April 1, 2024
- March 31, 2024
- March 30, 2024
- March 29, 2024
- March 28, 2024
- March 27, 2024
- March 26, 2024
Criando servio de envio de e-mail com ELIXIR!
Que tal criar um mini servidor HTTP para envio de e-mail SMTP com o Elixir ?
Nesse post vou demonstrar como criar um super simples, pequeno e muito leve. Tambm vamos ver como fazer envio de e-mail quando o usurio acessar uma determinada rota do servidor.
generated with Summaryze Forem
Iniciando
Primeiro precisamos preparar nosso ambiente, caso voc ainda no 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 cdigos em Elixir, alm de gerenciar dependncias tambm.
O parmetro --sup
para que possamos gerar uma aplicao com o esqueleto no padro OTP.
Instalando dependncias
Podemos navegar at o nosso projeto e vamos agora instalar as dependncias que vamos usar, so elas:
- plug_cowboy: Uma implementao do Cowboy para o Elixir.
- poison: Biblioteca JSON para o Elixir.
- plug: Uma especificao para componentes e adaptadores web(uma forma de padronizar o objeto de conexo).
- 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 dependncias, para isso no terminal rode o comando:
mix deps.get
Criando servidor HTTP
Com as dependncias instaladas vamos comear configurar nosso servidor HTTP, para isso vamos configurar a inicializao 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 parmetros:
- 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 so opes 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 Loggerplug(Plug.Logger, log: :debug)plug(:match)plug(:dispatch)get "/" do send_resp(conn, 200, "Server rodando...")endmatch _ do send_resp(conn, 404, "Pagina no encontrada")endend
Explicando:
Aps definir nosso modulo, utilizamos o use
para injetar dois mdulos no contexto do nosso router.
Com require Logger
vamos importar alguns recursos do logger (exceto funes).
Temos algumas chamadas plug
, que basicamente vo configurar os modulos de log, match
(para fazer o match das rotas com a requisio) e dispatch
(processar a requisio aps 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 no encontre a rota", renderizando um "Pagina no 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 endereo: http://localhost:8085/ e vamos ver nosso servidor rodando:
Como podemos ver, nosso servidor est funcionando perfeitamente!
Vamos agora para o prximo passo!
Enviando e-mail
Para fazermos o envio do e-mail, vamos comear 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 configuraes do nosso aplicativo, alm de configuraes do iex
tambm.
Nele vamos colocar nossa configurao de SMTP, o contedo ficar dessa forma:
use Mix.Configconfig :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 informaes e pronto.
Vamos precisar criar um modulo mailer
passando o nome da nossa aplicao, 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_emailend
Agora abra o arquivo email_router.ex
e na rota de GET
vamos adicionar o seguinte:
import Bamboo.Email ... new_email() |> to("[email protected]") |> from("[email protected]") |> subject("Teste") |> text_body("Testando envio de email") |> Email.Mailer.deliver_now
Aqui o cdigo comea a ficar um pouco "estranho" pra quem no tem contato com Elixir, mas vou explicar: Primeiro fazemos o import
do modulo "Email" dentro de "Bamboo", dessa forma temos acesso as funes contidas no modulo.
Em seguida fazemos uma chamada a funo new_email()
que vem do modulo que importamos e comeamos uma sequencia de pipe. Utilizamos o pipe para pegar o resultado de uma expresso e lanar 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
Concluso
Podemos melhorar ainda mais esse cdigo, podemos por exemplo pegar os parmetros de e-mail(destinatrio, mensagem e assunto) via GET
ou POST
, podemos tambm utilizar um .env
para carregar as informaes 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 | Tutorial: dev.to/tuliocalil
Servidor HTTP Envio de E-mail com Elixir
Sobre
Projeto de exemplo utilizado para escrever o post: Criando servio 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 dependncias:
mix deps.get
Rode o projeto
iex -S mix
Acesse a url: http:localhost:8085.
Buy me a coffe!
Original Link: https://dev.to/tuliocalil/criando-servico-de-envio-de-e-mail-com-elixir-2l1g
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To