<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Henrique Ferreira</title>
    <description>The latest articles on DEV Community by Henrique Ferreira (@henrique2305).</description>
    <link>https://dev.to/henrique2305</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1090145%2F42b8756b-3e0f-4e38-b404-ce786caaf7e1.jpg</url>
      <title>DEV Community: Henrique Ferreira</title>
      <link>https://dev.to/henrique2305</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henrique2305"/>
    <language>en</language>
    <item>
      <title>Criando uma API com Spring Boot para o envio de e-mail</title>
      <dc:creator>Henrique Ferreira</dc:creator>
      <pubDate>Fri, 29 Mar 2024 02:37:21 +0000</pubDate>
      <link>https://dev.to/henrique2305/criando-uma-api-com-spring-boot-para-o-envio-de-e-mail-429n</link>
      <guid>https://dev.to/henrique2305/criando-uma-api-com-spring-boot-para-o-envio-de-e-mail-429n</guid>
      <description>&lt;p&gt;Neste post, vamos criar uma simples API Rest para enviar um e-mail. Eu irei utilizar o Spring Boot e o Mailtrap para fazer essa simulação de envio de e-mail. Preparado? &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Come to my Dojo!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu irei utilizar o site &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;https://start.spring.io/&lt;/a&gt; para gerar um projeto Spring Boot para mim já com as dependências necessárias. Segue a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7r6b6xbeh6c46m6bnppn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7r6b6xbeh6c46m6bnppn.png" alt="Configurações do projeto no site do spring boot - spring initializr" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, crie uma conta no Mailtrap. Em Inboxes, você consegue ver as credenciais do SMTP como port, username e password. Essas informações serão necessárias para o projeto. Segue a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg07vvadqvyojsg2d1mqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg07vvadqvyojsg2d1mqc.png" alt="Credenciais SMTP do Mailtrap" width="416" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No projeto, adicione essas configurações no application.properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=587
spring.mail.username= &amp;lt;adicione o username&amp;gt;
spring.mail.password= &amp;lt;adicione o password&amp;gt;
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse projeto, teremos três pacotes: controller, model e o service. Segue a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9tr8vyttffhixz9yn94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9tr8vyttffhixz9yn94.png" alt="Estrutura do projeto" width="335" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos criar a classe EmailDetails dentro do pacote model. Essa classe será responsável pelas informações do e-mail como o destinatário, assunto, corpo da mensagem e anexo. Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.henrique.Email.API.model;

public class EmailDetails {

    private String to;
    private String subject;
    private String body;
    private String attachment;

    public EmailDetails() {
    }

    public EmailDetails(String to, String subject, String body, String attachment) {
        this.to = to;
        this.subject = subject;
        this.body = body;
        this.attachment = attachment;
    }

    public String getTo() {
        return to;
    }

    public String getSubject() {
        return subject;
    }

    public String getBody() {
        return body;
    }

    public String getAttachment() {
        return attachment;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, crie a interface EmailService dentro do pacote model. Essa interface terá dois métodos sendMail e sendMailWithAttachment. Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.henrique.Email.API.model;

public interface EmailService {

    String sendMail(EmailDetails emailDetails);

    String sendMailWithAttachment(EmailDetails emailDetails) throws Exception;

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bom, temos as configurações no applications.properties e já temos o pacote de model com os arquivos necessários. Vamos passar para o pacote de service.&lt;/p&gt;

&lt;p&gt;Nesse pacote, vamos criar a classe EmailServiceImpl. Que terá a implementação dos métodos da interface EmailService. Aqui, teremos como dependência JavaMailSender, pois estamos utilizando o método send() para enviar o e-mail. Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.henrique.Email.API.service;

import com.henrique.Email.API.model.EmailDetails;
import com.henrique.Email.API.model.EmailService;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class EmailServiceImpl implements EmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String sender;

    @Override
    public String sendMail(EmailDetails emailDetails) {
        SimpleMailMessage message = new SimpleMailMessage();

        message.setFrom(sender);
        message.setTo(emailDetails.getTo());
        message.setSubject(emailDetails.getSubject());
        message.setText(emailDetails.getBody());

        javaMailSender.send(message);
        return "Mail Sent Successfully...";
    }

    @Override
    public String sendMailWithAttachment(EmailDetails emailDetails) throws Exception {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper;

        helper = new MimeMessageHelper(mimeMessage, true);

        helper.setFrom(sender);
        helper.setTo(emailDetails.getTo());
        helper.setSubject(emailDetails.getSubject());
        helper.setText(emailDetails.getBody());

        FileSystemResource file = new FileSystemResource(new File(emailDetails.getAttachment()));
        helper.addAttachment(file.getFilename(), file);

        javaMailSender.send(mimeMessage);
        return "Mail Sent Successfully...";
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, vamos passar para o pacote controller e nesse pacote, criaremos a classe EmailController, que terá os endpoints para que possamos testar o envio de e-mails. Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.henrique.Email.API.controller;

import com.henrique.Email.API.model.EmailDetails;
import com.henrique.Email.API.model.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/sendMail")
    public ResponseEntity sendMail(@RequestBody EmailDetails details) {
       try {
           String result = emailService.sendMail(details);
           return ResponseEntity.ok(result);
       } catch (Exception ex) {
           return ResponseEntity.badRequest().body("Error while Sending Mail");
       }
    }

    @PostMapping("/sendMailWithAttachment")
    public ResponseEntity sendMailWithAttachment(@RequestBody EmailDetails details) {
        try {
            String result = emailService.sendMailWithAttachment(details);
            return ResponseEntity.ok(result);
        } catch (Exception ex) {
            return ResponseEntity.badRequest().body("Error while Sending Mail");
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, chegou a parte do teste. Vamos criar a classe EmailControllerTest no pacote de test do projeto. Nessa classe eu vou implementar o teste do endpoint /sendMailWithAttachment. Segue o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.henrique.Email.API.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.henrique.Email.API.model.EmailDetails;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.net.URI;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@AutoConfigureMockMvc
class EmailControllerTest {

    @Autowired
    private MockMvc mockMvc;

    ObjectMapper mapper = new ObjectMapper();

    @Test
    public void deveriaRetornarOEmailEnviado() throws Exception {
        EmailDetails details = new EmailDetails(
                "email@email.com",
                "Simple Email Message",
                "Hey! \n\nThis is a Simple Email with attachment\n\nThanks",
                "C:/caminho-da-imagem/nome.png"
        );

        URI uri = new URI("/sendMailWithAttachment");

        MvcResult mvcResult = mockMvc
                .perform(MockMvcRequestBuilders
                        .post(uri)
                        .content(mapper.writeValueAsString(details))
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers
                        .status()
                        .is(200)).andReturn();

        String expectedResponseBody = "Mail Sent Successfully...";
        String actualResponseBody = mvcResult.getResponse().getContentAsString();
        System.out.println(actualResponseBody);
        Assertions.assertEquals(expectedResponseBody, actualResponseBody);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto. Se tudo ocorreu bem, a seguinte mensagem é exibida no console: Mail Sent Successfully...&lt;/p&gt;

&lt;p&gt;E no Mailtrap aparecerá isso. Segue a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrb89s7ihtmcvz55a080.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrb89s7ihtmcvz55a080.png" alt="e-mail recebido no Mailtrap" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt;&lt;br&gt;
É isso! A ideia foi mostrar um exemplo simples de como utilizar a implementação do envio de e-mail do Spring Boot com o Mailtrap, com uma API Rest básica.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

&lt;p&gt;Link do repositório: &lt;a href="https://github.com/Henrique2305/mail-api" rel="noopener noreferrer"&gt;https://github.com/Henrique2305/mail-api&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>mailtrap</category>
    </item>
  </channel>
</rss>
