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:

facebook        

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

É isso!

A gente se vê na próxima. ;)

Até lá!

\o/

Bons estudos. ;)