Aprendendo Spring: #3 – Enviando e-mail

https://gist.github.com/edermfl/f7c0030908e298e3248d9bcf9fec574a.js

SpringBoot: Enviando e-mail Fala aí galera, tudo certo?

Mais um post sobre meu aprendizado de Spring Boot. Já estou me virando bem com o framework, mas sempre aparece algo que ainda não sei fazer!!

Caso seja seu primeiro contato com Spring Boot e não acompanhou os posts anteriores, seguem abaixo os links. São leituras recomendadas:

Hoje falarei sobre envio de e-mail!

Dependências

Para enviar um e-mail via Spring, basicamente você precisará baixar em seu projeto a dependência Spring Boot Mail Starter.

Se tiver usando Maven, no arquivo pom.xml adicione estas linhas:

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

Caso esteja usando o Gradle, adicione a linha abaixo no arquivo build.gradle:

//
compile('org.springframework.boot:spring-boot-starter-mail')
//

Ah… será necessário também um servidor SMTP (servidor responsável por enviar e-mail).

Eu usei o SMTP do Gmail mesmo. Só que usa-lo fora de um dos serviços a Google, é necessário criar permissão para que uma aplicação externa possa enviar e-mail. Penei bastante com isso, pois meus e-mails nunca eram enviados, sempre retornava uma mensagem de erro dizendo que não tinha permissão para isso.

Mas como já encontrei a solução vou deixar o link da solução aqui: POP e SMTP não funciona com o meu endereço de email.

Configuração

Será necessário informar ao Spring a configuração do servidor SMTP e conta de e-mail. Para isso, edite o arquivo application.properties na pasta resources, acrescentando as seguintes linhas:

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.protocol=smtp
spring.mail.username=<seu_email>@gmail.com
spring.mail.password=<chave de 16 digitos gerada pelo Google Account>
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.quitwait=false

Importante: a configuração acima descrita, remete ao envio de e-mail usando o protocolo de segurança TLS. Não consegui de forma alguma enviar e-mail de outra forma (por exemplo, usando a porta 25, envio não criptografado).

Para quem configura usando YAML, adicione as linhas abaixo:

spring:
# … outras configurações
mail:
host: smtp.gmail.com
port: 587
protocol: smtp
username: <seu_email>@gmail.com
password: <chave de 16 digitos gerada pelo Google Account>
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
quitwait: false

Observação: Caso você esqueça de fazer a configuração, o SpringBoot não conseguirá criar o bean (JavaMailSender) necessário para o envio do e-mail.

Implementação

Configuração pronta, basta agora implementar o serviço de envio de e-mail.

@Component
public class SenderMailService {
@Autowired
private JavaMailSender mailSender;
private void enviar() {
SimpleMailMessage email = new SimpleMailMessage();
email.setTo("teste@gmail.com");
email.setSubject("Teste envio de e-mail");
email.setText("Enviei este e-mail usando Spring Boot.");
mailSender.send(email);
}
}

Basicamente, o que fizemos no serviço, foi solicitar ao Spring uma instância de JavaMailService já configurada com as informações que adicionamos no application.properties (linha5). O método enviar(), inicializa um objeto do tipo SimpleMailMessage (linha 8) e adiciona as informações: e-mail destinatário, assunto e texto do corpo do e-mail (linhas de 8 à 11). Por fim, o sender se encarrega de enviar o e-mail (linha 12).

Abaixo deixo código de um teste para o método enviar():

@RunWith(SpringRunner.class)
@SpringBootTest
public class SenderMailServiceTest {
@Autowired
SenderMailService senderMailService;
@Test
public void testEnvioEmail() {
senderMailService.enviar();
}
}

Eis um print do resultado do teste:

Print do e-mail recebido, enviado pelo teste do SenderMailService

Espero que eu tenha ajudado.

Até mais pessoal.

5 Comentários

  1. Executando o passo-a-passo, me deparei com um mesmo erro que sempre encontro ao tentar criar uma aplicaçãozinha que dispara algum email.

    erro: org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 534-5.7.14 Please log in via your web browser and
    534-5.7.14 then try again.
    534-5.7.14 Learn more at
    534 5.7.14 https://support.google.com/mail/answer/78754 n75sm6671711qkl.26 – gsmtp

    alguma luz? hehe

    Curtir

    1. Olá Mateus, deixei a informação de como contornar este problema no post, no entanto na última edição que fiz no post, apaguei esta dica e nem percebi.
      Restaurei está parte do post, clique aqui e seja feliz!
      Depois comente aí se funcionou!

      Curtir

      1. Funcionou perfeitamente! Valeu, abraços.

        Curtir

  2. […] Aprendendo Spring: #3 – Enviando e-mail […]

    Curtir

  3. […] Aprendendo Spring: #3: Enviando e-mail […]

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: