Guia do Spring Email

Guia do Spring Email

1. Visão geral

Neste artigo, vamos percorrer as etapas necessárias para enviar e-mails de um aplicativo Spring simples, bem como de um aplicativo Spring Boot, o primeiro usando a bibliotecaJavaMail e o último usando ospring-boot-starter-maildependência s.

Leitura adicional:

Registro - Ative uma nova conta por e-mail

Verifique os usuários recém-registrados enviando um token de verificação por e-mail antes de permitir o login - usando o Spring Security.

Read more

Atuador de inicialização por mola

Uma introdução rápida aos Spring Boot Actuators - usando e estendendo os existentes, configurando e executando os seus próprios.

Read more

2. Dependências do Maven

Primeiro, precisamos adicionar as dependências ao nossopom.xml.

2.1. Primavera

Para uso na estrutura do Spring simples, adicionaremos:


    org.springframework
    spring-context-support
    5.0.1.RELEASE

A versão mais recente pode ser encontradahere.

2.2. Spring Boot

E para o Spring Boot:


    org.springframework.boot
    spring-boot-starter-mail
    2.0.1.RELEASE

A versão mais recente está disponível no repositórioMaven Central.

3. Propriedades do servidor de correio

As interfaces e classes para suporte a correio Java na estrutura Spring estão organizadas da seguinte maneira:

  1. MailSender interface: a interface de nível superior que fornece funcionalidade básica para enviar e-mails simples

  2. JavaMailSender interface: a subinterface deMailSender acima. Ele oferece suporte a mensagens MIME e é usado principalmente em conjunto com a classeMimeMessageHelper para a criação de umMimeMessage. É recomendável usar o mecanismoMimeMessagePreparator com esta interface

  3. JavaMailSenderImpl class: fornece uma implementação da interfaceJavaMailSender. SuportaMimeMessageeSimpleMailMessage

  4. SimpleMailMessage class: usado para criar uma mensagem de correio simples incluindo os campos de, para, cc, assunto e texto

  5. MimeMessagePreparator interface: fornece uma interface de retorno de chamada para a preparação de mensagens MIME

  6. MimeMessageHelper class: classe auxiliar para a criação de mensagens MIME. Oferece suporte para imagens, anexos de correio típicos e conteúdo de texto em um layout HTML

Nas seções a seguir, mostramos como essas interfaces e classes são usadas.

3.1. Propriedades do servidor Spring Mail

Propriedades de correio necessárias para especificar, por exemplo o servidor SMTP pode ser definido usandoJavaMailSenderImpl.

Por exemplo, para o Gmail, isso pode ser configurado como mostrado abaixo:

@Bean
public JavaMailSender getJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.gmail.com");
    mailSender.setPort(587);

    mailSender.setUsername("[email protected]");
    mailSender.setPassword("password");

    Properties props = mailSender.getJavaMailProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.debug", "true");

    return mailSender;
}

3.2. Propriedades do servidor Spring Boot Mail

Depois que a dependência estiver estabelecida, a próxima etapa é especificar as propriedades do servidor de e-mail no arquivoapplication.properties usando o namespacespring.mail.*.

Por exemplo, as propriedades do servidor SMTP do Gmail podem ser especificadas como:

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

Alguns servidores SMTP requerem uma conexão TLS, portanto, a propriedadespring.mail.properties.mail.smtp.starttls.enable é usada para habilitar uma conexão protegida por TLS.

3.2.1. Propriedades SMTP do Gmail

Podemos enviar um email via servidor SMTP do Gmail. Dê uma olhada emdocumentation para ver as propriedades do servidor SMTP de correio de saída do Gmail.

Nosso arquivoapplication.the properties já está configurado para usar o SMTP do Gmail (consulte a seção anterior).

Observe que a senha da sua conta não deve ser uma senha comum, mas uma senha do aplicativo gerada para a sua conta do Google. Siga estelink para ver os detalhes e gerar sua senha do Google App.

3.2.2. Propriedades SES SMTP

Para enviar e-mails usando o serviço Amazon SES, defina seuapplication.properties como fazemos a seguir:

spring.mail.host=email-smtp.us-west-2.amazonaws.com
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.transport.protocol=smtp
spring.mail.properties.mail.smtp.port=25
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

Lembre-se de que a Amazon exige que você verifique suas credenciais antes de usá-las. Siga olink para verificar seu nome de usuário e senha.

4. Enviando email

Depois que o gerenciamento e a configuração da dependência estiverem em vigor, podemos usar oJavaMailSender mencionado anteriormente para enviar um e-mail.

Uma vez que tanto a estrutura do Spring simples quanto a versão do Boot lidam com a composição e o envio de e-mails de maneira semelhante, não teremos que distinguir entre as duas nas subseções abaixo.

4.1. Enviando e-mails simples

Vamos primeiro compor e enviar uma mensagem de e-mail simples, sem nenhum anexo:

@Component
public class EmailServiceImpl implements EmailService {

    @Autowired
    public JavaMailSender emailSender;

    public void sendSimpleMessage(
      String to, String subject, String text) {
        ...
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        emailSender.send(message);
        ...
    }
}

4.2. Envio de e-mails com anexos

Às vezes, a mensagem simples do Spring não é suficiente para nossos casos de uso.

Por exemplo, queremos enviar um email de confirmação do pedido com uma fatura anexada. Nesse caso, devemos usar uma mensagem multiparteMIME da bibliotecaJavaMail em vez deSimpleMailMessage. Spring suporta mensagensJavaMail com a classeorg.springframework.mail.javamail.MimeMessageHelper.

Em primeiro lugar, adicionaremos um método aoEmailServiceImpl para enviar e-mails com anexos:

@Override
public void sendMessageWithAttachment(
  String to, String subject, String text, String pathToAttachment) {
    // ...

    MimeMessage message = emailSender.createMimeMessage();

    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(text);

    FileSystemResource file
      = new FileSystemResource(new File(pathToAttachment));
    helper.addAttachment("Invoice", file);

    emailSender.send(message);
    // ...
}

4.3. Modelo de email simples

A classeSimpleMailMessage suporta formatação de texto. Podemos criar um modelo para e-mails definindo um bean de modelo em nossa configuração:

@Bean
public SimpleMailMessage templateSimpleMessage() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setText(
      "This is the test email template for your email:\n%s\n");
    return message;
}

Agora podemos usar esse bean como modelo para email e precisamos fornecer apenas os parâmetros necessários para o modelo:

@Autowired
public SimpleMailMessage template;
...
String text = String.format(template.getText(), templateArgs);
sendSimpleMessage(to, subject, text);

5. Tratamento de erros de envio

JavaMail forneceSendFailedException para lidar com situações em que uma mensagem não pode ser enviada. Mas é possível que você não obtenha essa exceção ao enviar um e-mail para o endereço incorreto. O motivo é o seguinte:

As especificações de protocolo para SMTP no RFC 821 especificam o código de retorno 550 que o servidor SMTP deve retornar ao tentar enviar um email para o endereço incorreto. Mas a maioria dos servidores SMTP públicos não faz isso. Em vez disso, eles enviam um e-mail de "falha na entrega" para sua caixa ou não dão nenhum feedback.

Por exemplo, o servidor SMTP do Gmail envia uma mensagem de "falha na entrega". E você não recebe exceções no seu programa.

Portanto, existem poucas opções para lidar com este caso:

  1. Pegue oSendFailedException, que nunca pode ser lançado

  2. Verifique a caixa de correio do remetente na mensagem "falha na entrega" por algum período de tempo. Isso não é simples e o período não é determinado

  3. Se o seu servidor de email não der nenhum feedback, você não poderá fazer nada

6. Conclusão

Neste artigo rápido, mostramos como configurar e enviar emails de um aplicativo Spring Boot.

A implementação de todos esses exemplos e trechos de código pode ser encontrada emGitHub project; este é um projeto baseado em Maven, então deve ser fácil importar e executar como está.