Explicando a requisição feita
Se você olhar na estrutura do projeto acima, temos:
EmailController, com a função sendEmail, recebendo um EmailDTO (retorna noContent e void).
EmailDTO, obviamente, possui a estrutura da requisição Postman anterior com as anotações @Email, @NotBlank.
No service, temos a função recebendo um EmailDTO fazendo um try-catch.
O bacana do service é que ele pega o username do properties:


Depois, injetamos o componente chamado JavaMailSender (da biblioteca spring mail). Esse JavaMailSender, pega as configurações do properties também: port, host, etc.
@Service
public class EmailService {
@Value("${spring.mail.username}")
private String emailFrom;
@Autowired
private JavaMailSender emailSender;
public void sendEmail(EmailDTO obj) {
try{
//esse simplemail é um objeto da lib do spring mail
SimpleMailMessage message = new SimpleMailMessage();
//agora é só settar o message
//remetente
message.setFrom(emailFrom);
//destinatário
message.setTo(obj.getTo());
//assunto
message.setSubject(obj.getSubject());
//corpo mensagem
message.setText(obj.getBody());
emailSender.send(message);
}
//essa exception foi criada customizada no pacote do service
catch (MailException e){
throw new EmailException("Failed to send email");
}
}
}
Destacando que tem que criar também o ExceptionHandler no pacote do Controller para tratar essa exceção acima.
Atualizado