Serviço de envio de e-mail utilizando Java, Spring boot e Thymeleaf

Patricia Nogueira
orangejuicetech
Published in
7 min readMay 2, 2023

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.namepelas 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 objeto Environment do Spring Framework. Esta variável é usada para obter informações de configuração do aplicativo.
  • mailSender: uma instância do objeto JavaMailSender do Spring Framework. Este objeto é usado para enviar o e-mail.
  • htmlTemplateEngine: uma instância do objeto TemplateEngine 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 propriedades application.properties.
  • mailFromName: é o nome usado como remetente para o e-mail de confirmação. Esta propriedade também foi definida no arquivo de propriedades application.properties usando a propriedade mail.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 objeto MimeMessageHelper para ajudar a configurar a mensagem MIME do e-mail. O segundo parâmetro true 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 constante MAIL_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 objeto Context do Thymeleaf para processar o modelo HTML de e-mail. A localidade usada é obtida a partir do LocaleContextHolder.
  • 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âmetro true 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 objeto ClassPathResource 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 objeto JavaMailSender 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! 😊

--

--