Aula 17 - Golang - Fiber - Enviando Emails
Agora vamos enviar um email para a redefinição da senha, para isso, vamos instalar o
MailHog.
Ele é um servidor fake de email.
Acesse esse link abaixo para instalar ele de acordo com seu sistema operacional.
https://github.com/mailhog/MailHog/releases
Ele vai rodar localmente em
0.0.0.0:8025
o servidor
SMTP começa na porta
1025
o servidor
HTTP começa na porta
8025
Essa porta
SMTP 1025 iremos usar no nosso código.
No
forgotController.go iremos importar o pacote
net/smtp.
Esse é o pacote que vamos usar para enviar emails.
No código abaixo, na parte:
message := []byte("Clique <a href=\"" + url + "\">aqui</a> para redefinir sua senha!") foi usado um array de bytes (
[]byte) porque a função
smtp.SendMail() espera um parâmetro do tipo
[]byte para o corpo da mensagem de email.
A assinatura da função é a seguinte:
func SendMail(addr string, a Auth, from string, to []string, msg []byte) error
Portanto, ao compor o corpo da mensagem de email, é necessário criar um
[]byte que contenha os dados da mensagem.
Nesse caso específico, o trecho de código está criando uma mensagem de email com um link HTML.
Ao utilizar
[]byte, o texto é convertido em um array de bytes, que é o formato esperado pela função
smtp.SendMail().
Isso garante que os dados da mensagem sejam tratados corretamente durante o envio por email.
Em resumo, a escolha entre
[]byte e
string depende do contexto e dos requisitos da função ou operação que você está realizando.
No caso de interações com funções ou bibliotecas que esperam
[]byte, é necessário fazer essa conversão para garantir que os dados sejam tratados corretamente.
fiber-project/controllers/forgotController.go
package controllers
import (
"fiber-project/database"
"fiber-project/models"
"math/rand"
"net/smtp"
"github.com/gofiber/fiber/v2"
)
func Forgot(c *fiber.Ctx) error {
var data map[string]string
if err := c.BodyParser(&data); err != nil {
return err
}
token := RandStringRunes(12)
passwordReset := models.PasswordReset{
Email: data["email"],
Token: token,
}
database.DB.Create(&passwordReset)
from := "fluentcode@exemple.com"
to := []string{
data["email"],
}
url := "http://localhost:3000/reset/" + token
message := []byte("Clique <a href=\"" + url + "\">aqui</a> para redefinir sua senha!")
err := smtp.SendMail("0.0.0.0:1025", nil, from, to, message)
if err != nil {
return err
}
return c.JSON(fiber.Map{
"message": "success",
})
}
func RandStringRunes(n int) string {
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}
Para testar, faça a
request POST no postman ou qualquer outro software como esse no endpoint
forgot.
http://localhost:8000/api/forgot
Agora, no browser, acesse o servidor do
MailHog.
0.0.0.0:8025
Veja se o email foi recebido.
Código da aula: Github
Redes Sociais:
Novamente deixo meus link de afiliados:
É isso!
A gente se vê na próxima. ;)
Até lá!
\o/
Bons estudos. ;)