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