Spring

Spring Send Email

Neste projeto, vamos implementar o envio de e-mail com Spring Boot. Utilizaremos recursos conhecidos e práticos do ambiente Spring Boot.

Primeiros passos

Primeiro, inicie seu projeto Spring utilizando o Spring Initializr. Caso não lembre como criar um projeto Spring, confira nesta aula: Spring Initializr

Tecnologias

  • Spring Email
  • G-mail

G-Mail senhas adicionais

Para podermos trabalhar com o envio de email em nosso app, precisamos fazer alguns ajustes antes. O serviço de envio de Google tem o recurso de adicionar senhas adicionais para finalidades específicas de uso (Senhas de App), no nosso caso, envio de e-mail através da nossa API.

Uma senha de app tem 16 dígitos e autoriza o acesso à sua Conta do Google por um dispositivo ou um app menos seguro. As senhas de app podem ser usadas apenas em contas que tenham a verificação em duas etapas ativada.

Tendo habiltado a verificação em duas etapas, acesse o link do Google: App passwords entre em sua conta, e dê um nome para seu App:

sendEmail

clique em create e copie a senha que será usada para configurar nosso envio de email. sendEmail

Guarde a senha em um local seguro, não a exponha para ninguém! Vamos usa-la logo, logo.

Configuração

Habilitar o envio de e-mail pelo Spring Boot integrando ao G-Mail é uma tarefa simples e prática. Siga as instruções abaixo:

Em seu pom.xml adicione a dependência:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Vou adicionar a dependência Lombok ao projeto para evitar códigos boilerplate. Fique à vontade para fazer o mesmo, se preferir.

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Criando as classes

Dentro do diretório raiz do seu projeto exemplo: src/main/java/com.iza.tec

Crie o pacote /email

SendEmail

Agora, dentro do pacote email, vamos criar duas classes para enviar nosso e-mail.

A classe Message servirá de suporte ao nosso conteúdo, endereço de e-mail e remetente.

package com.iza.tec.email;

import lombok.Data;

@Data
public class Message{
    //Este campo represente remetente do e-mail 
    private String from;
    //Este campo represente destinatário do e-mail
    private String to;
    private String title;
    private String body;

}
Note que adicionei a anotação @Datedo lombok para criar nossos gettes e settes.

E SendEmail, que iremos configurar para fazer o envio do e-mail.

Ficará assim:

package com.iza.tec.email;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

@Component
public class SendEmail {
    @Autowired
    private JavaMailSender mailSender;

    public SendEmail(){
        System.out.println("CRIANDO SEND EMAIL SERVICE REAL");

    }
    public void send(Message message){
        SimpleMailMessage messageSender = new SimpleMailMessage();

        messageSender.setFrom(message.getFrom());
        messageSender.setTo(message.getTo());
        messageSender.setSubject(message.getTitle());
        messageSender.setText(message.getBody());
        try{
            Thread sender = new Thread(process(mailSender, messageSender));
            sender.start();
        }catch (Exception e ){
            e.printStackTrace();
        };
    }

    private Runnable process(JavaMailSender mailSender, SimpleMailMessage msg){
        return new Runnable() {
            @Override
            public void run() {
                mailSender.send(msg);
            }
        };
    }

}
Nós implementamos o envio de uma thread para que o processo principal não precise aguardar o envio de email

Em sua classe principal java, vamos criar um método para testarmos nosso envio de email:

package com.iza.tec;

import com.iza.tec.email.Message;
import com.iza.tec.email.SendEmail;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootSendEmailApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootSendEmailApplication.class, args);
    }


    @Bean
    public CommandLineRunner run(SendEmail sendEmail) throws Exception{
        return args ->{
            Message message = new Message();

            message.setFrom("remetente@gmail.com");
            message.setTo("destinatario@gmail.com");
            message.setTitle("Enviando email de teste");
            message.setBody("Este é um exemplo de e-mail enviado pelo Spring Send E-mail");

            sendEmail.send(message);
        };
    }
}

Antes de iniciarmos a aplicação, precisamos configurar as propriedades no application.properties

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=seuemail@gmail.com
spring.mail.password=${EMAIL_PASSWORD}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.ssl.enable=false
spring.mail.test-connection=false

Observe que na configuração o parâmetro spring.mail.password espera uma variável chamada de ${EMAIL_PASSWORD}, quando for executar sua aplicação, você definirá esta variável utilizando sua IDE ou informando como variáveis de ambiente no Spring.

Duas observações em relação a configuração acima, primeira seu e-mail e senha NÃO PODEM estar diretamente no application.properties e sim na configuração de seu servidor ou container e o G-Mail recomanda NÃO USAR sua senha pessoal, mas sim criar uma senha para esta finalidade em específica.

Rodando a aplicação

Após termos configurado as credenciais corretamente e colocado o e-mail de remetente e destinatário corretamente, podemos rodar a aplicação. Caso dê tudo certo, no console aparecerá a mensagem que colocamos:

stackTrace

E o e-mail será enviado:

E-mail enviado com sucesso✔️

Conclusão

Nesta aula, vimos como pode ser simples implementar o envio de e-mail pelo G-Mail. Pratique bastante e observe cada detalhe da implementação. Crie e-mails de teste para usar à vontade! Até a próxima.

Renê AntunesRene-Antunes