Serviço de envio de e-mail utilizando Java, Spring boot e Thymeleaf
Se você está precisando desenvolver uma aplicação back-end que faça envio de e-mails, como por exemplo, e-mail de boas vindas ao usuário ou de recuperação de senha, então, esse artigo pode ser útil pra você.
CRIANDO O PROJETO
Pra começar, vamos acessar o site do Spring Initializr no link https://start.spring.io/ pra criarmos o nosso projeto.
Nossa aplicação será um projeto Maven, utilizando a linguagem Java na versão 17 e o Spring Boot na versão 3.0.6. Fique a vontade pra alterar as informações de name, artifact e description. Nesse momento, iremos adicionar duas dependências além da Spring web ao nosso projeto, a Java Mail Sender para conseguirmos fazer o envio de e-mail e Thymeleaf para criarmos nosso template.
Após finalizar as configurações do projeto, clique no botão GENERATE, extraia o projeto e abra ele no Intellij ou na sua IDE de preferência.
INICIANDO O PROJETO
Agora é a hora de colocar a mão na massa. A começar, iremos fazer algumas configurações de propriedades do Spring Mail Sender que serão usadas para configurar a conexão com o servidor de e-mail. Para isso, iremos em resources/application.properties.
Vamos entender o que significa cada propriedade:
spring.mail.host
: define o host do servidor de e-mail a ser usado para enviar e-mails.spring.mail.port
: define a porta do servidor de e-mail a ser usada para enviar e-mails.spring.mail.username
: define o nome de usuário usado para autenticar com o servidor de e-mail.spring.mail.password
: define a senha usada para autenticar com o servidor de e-mail.spring.mail.properties.mail.transport.protocol
: é o protocolo de transporte usado para enviar e-mails (no caso, SMTP).spring.mail.properties.mail.smtp.starttls.enable
: indica se a conexão SMTP deve usar o protocolo TLS.spring.mail.properties.mail.smtp.starttls.required
: indica se a conexão SMTP deve requerer o protocolo TLS.spring.mail.properties.mail.smtp.auth
: indica se a autenticação deve ser usada para se conectar ao servidor de e-mail.spring.mail.properties.mail.smtp.from
: define o endereço de e-mail usado como remetente para e-mails enviados.spring.mail.default-encoding
: define a codificação de caracteres usada para o texto do e-mail.spring.mail.test-connection
: indica se uma conexão de teste com o servidor de e-mail deve ser feita durante a inicialização do aplicativo.mail.from.name
: define o nome do remetente usado para e-mails enviados.
Substitua as informações dos campos spring.mail.username
, spring.mail.password
, spring.mail.properties.mail.smtp.from
e mail.from.name
pelas suas credenciais.
💬 Importante!
A senha a ser colocada não é a senha que você usa pra fazer login em seu e-mail, e sim uma senha de aplicativo. Descubra como gerar essa senha através do link: https://support.google.com/accounts/answer/185833?hl=pt-BR.
CRIANDO O USUÁRIO
Feito isso, vamos criar uma pasta chamada model no package do projeto para colocar o modelo do usuário. Nosso usuário terá somente nome e e-mail.
CRIANDO A LÓGICA DE ENVIO
Pronto, chegou a hora de criar o nosso Service, ele será responsável por toda a lógica de envio de e-mail.
Vamos começar anotando a nossa classe com @Service
e declarando algumas variáveis para podermos enviar e-mails com um modelo HTML.
Vamos entender pra que serve cada coisa:
TEMPLATE_NAME
: é o nome do modelo HTML de e-mail a ser usado para enviar o e-mail.SPRING_LOGO_IMAGE
: é o caminho para a imagem de logotipo a ser incluída no modelo HTML de e-mail.PNG_MIME
: o tipo MIME da imagem PNG que está sendo incluída no e-mail.MAIL_SUBJECT
: é o assunto do e-mail a ser enviado.environment
: uma instância do objetoEnvironment
do Spring Framework. Esta variável é usada para obter informações de configuração do aplicativo.mailSender
: uma instância do objetoJavaMailSender
do Spring Framework. Este objeto é usado para enviar o e-mail.htmlTemplateEngine
: uma instância do objetoTemplateEngine
do Spring Framework. Este objeto é usado para renderizar o modelo HTML de e-mail.
Em seguida vamos criar o nosso método recebendo um usuário e definir três variáveis para começarmos nossa lógica.
confirmationUrl
: é a URL gerada para confirmar um determinado recurso no aplicativo. Esta URL pode ser incluída no corpo do e-mail de confirmação para que o usuário possa clicar e confirmar o recurso.mailFrom
: é o endereço de e-mail usado como remetente para o e-mail de confirmação. Esta propriedade foi definida no arquivo de propriedadesapplication.properties.
mailFromName
: é o nome usado como remetente para o e-mail de confirmação. Esta propriedade também foi definida no arquivo de propriedadesapplication.properties
usando a propriedademail.from.name
. Se essa propriedade não for definida, o nome padrão "Identity" será usado.
Agora chegou a hora de montarmos nosso e- mail e fazer o envio.
MimeMessage mimeMessage = this.mailSender.createMimeMessage()
: cria uma nova mensagem MIME para o e-mail.MimeMessageHelper email = new MimeMessageHelper(mimeMessage, true, "UTF-8")
: cria um objetoMimeMessageHelper
para ajudar a configurar a mensagem MIME do e-mail. O segundo parâmetrotrue
indica que a mensagem contém um conteúdo HTML.email.setTo(user.getEmail())
: define o destinatário do e-mail com o endereço de e-mail do usuário fornecido.email.setSubject(MAIL_SUBJECT)
: define o assunto do e-mail com a constanteMAIL_SUBJECT
definida anteriormente.email.setFrom(new InternetAddress(mailFrom, mailFromName))
: define o remetente do e-mail com o endereço de e-mail e nome do remetente fornecido.Context ctx = new Context(LocaleContextHolder.getLocale())
: cria um objetoContext
do Thymeleaf para processar o modelo HTML de e-mail. A localidade usada é obtida a partir doLocaleContextHolder
.ctx.setVariable("email", user.getEmail())
: define uma variável chamada "email" com o endereço de e-mail fornecido pelo usuário.ctx.setVariable("name", user.getName())
: define uma variável chamada "name" com o nome do usuário. Nós iremos usar essa variável no template do e-mail mais adiante.ctx.setVariable("springLogo", SPRING_LOGO_IMAGE)
: define uma variável chamada "springLogo" com o caminho da imagem que iremos enviar.ctx.setVariable("url", confirmationUrl)
: define uma variável chamada "url" com a URL de confirmação gerada anteriormente.String htmlContent = this.htmlTemplateEngine.process(TEMPLATE_NAME, ctx)
: renderiza o modelo HTML de e-mail usando o nome do modelo definido anteriormente e o contexto criado.email.setText(htmlContent, true)
: define o conteúdo do e-mail com o conteúdo HTML gerado anteriormente. O segundo parâmetrotrue
indica que o conteúdo é HTML.ClassPathResource clr = new ClassPathResource(SPRING_LOGO_IMAGE)
: carrega a imagem a partir do caminho definido anteriormente.email.addInline("springLogo", clr, PNG_MIME)
: adiciona a imagem como um recurso em linha no e-mail. O primeiro parâmetro é o nome do recurso, o segundo parâmetro é o objetoClassPathResource
que contém a imagem e o terceiro parâmetro é o tipo MIME da imagem.
e finalmente,
mailSender.send(mimeMessage)
: envia o e-mail usando o objetoJavaMailSender
definido anteriormente.
CRIANDO O CONTROLADOR
Agora podemos criar a nossa Controller, que irá se comunicar com nosso model e nosso service. Vamos começar anotando nosso UserController com @RestController e @RequestMapping("/register").
Já podemos injetar também o Service que acabamos de criar.
Nosso método será um @PostMapping
que receberá um Usuário User. Dentro dele nós vamos pedir ao Service para fazer o envio do e-mail e vamos indicar se o usuário foi criado com sucesso.
CUSTOMIZANDO O E-MAIL
Ótimo, a lógica está criada e podemos partir para customizar o nosso e-mail com o Thymeleaf. Em resources/templates, vamos criar um arquivo chamado registration, fazer a estrutura do e-mail e adicionar a nossa imagem. Nesse momento, use a sua criatividade pra customizar o e-mail de acordo com o seu gosto.
Lembra da variável name que definimos lá no Service? É através dela que a gente vai conseguir pegar o nome do usuário.
Por fim, vamos executar nossa aplicação e fazer o teste no Postman!
Como podemos ver nosso e-mail foi enviado com sucesso! Vamos conferir o resultado?
Obrigada por ter chegado até aqui, espero que esse conteúdo possa ter te ajudado. Até a próxima! 😊