Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
May 17, 2021 12:40 am GMT

Criando servio de envio de e-mail com ELIXIR!

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:
Elixir http

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

Mailtrap:
Mailtrap

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:

GitHub logo tuliocll / email-elixir

Servidor HTTP que envia e-mail | Tutorial: dev.to/tuliocalil

Servidor HTTP Envio de E-mail com Elixir

DEV to

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!

Ko-Fi

Made with in Bahia, Brasil.







Original Link: https://dev.to/tuliocalil/criando-servico-de-envio-de-e-mail-com-elixir-2l1g

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To