es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviar correos electrónicos con Amazon SES y Spring Boot

Tengo una aplicación SpringBoot con estas dependencias:

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-mail</artifactid>
</dependency>
<dependency>
  <groupid>org.springframework.cloud</groupid>
  <artifactid>spring-cloud-aws</artifactid>
  <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
  <groupid>io.awspring.cloud</groupid>
  <artifactid>spring-cloud-starter-aws-ses</artifactid>
  <version>2.3.3</version>
</dependency>

este archivo de configuración:

@Configuration
public class MailConfig {

    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {

        return AmazonSimpleEmailServiceClientBuilder.standard()
                .withCredentials(new ProfileCredentialsProvider("ses-smtp-user.234221-1724219"))
                .withRegion(Regions.EU_WEST_2)
                .build();
    }

    @Bean
    public MailSender mailSender(
            AmazonSimpleEmailService amazonSimpleEmailService) {
        return new SimpleEmailServiceMailSender(amazonSimpleEmailService);
    }
}

y

@Service
public class NotificationService {

    private final MailSender mailSender;
    private final JavaMailSender javaMailSender;

    public NotificationService(MailSender mailSender, JavaMailSender javaMailSender) {
        this.mailSender = mailSender;
        this.javaMailSender = javaMailSender;
    }

    public void sendMailMessage(
            final SimpleMailMessage simpleMailMessage) {

        this.mailSender.send(simpleMailMessage);
    }

}

pero cuando inicio la aplicación, obtengo este error:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.dis.backend.service.NotificationService required a bean of type 'org.springframework.mail.javamail.JavaMailSender' that could not be found.

Action:

Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no se puede encontrar el bean JavaMailSender en la configuración. La clase NotificationService requiere que se inyecte un bean JavaMailSender a través de su constructor.

    Para resolver el problema, puede definir un bean JavaMailSender en su clase de configuración o en el archivo application.properties.

    Por ejemplo:

    @Configuration
    public class MailConfig {
    
        @Value("${spring.mail.host}")
        private String mailHost;
    
        @Value("${spring.mail.username}")
        private String mailUsername;
    
        @Value("${spring.mail.password}")
        private String mailPassword;
    
        @Value("${spring.mail.port}")
        private int mailPort;
    
        @Value("${spring.mail.protocol}")
        private String mailProtocol;
    
        @Bean
        public JavaMailSender javaMailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
            mailSender.setHost(mailHost);
            mailSender.setPort(mailPort);
            mailSender.setProtocol(mailProtocol);
            mailSender.setUsername(mailUsername);
            mailSender.setPassword(mailPassword);
    
            Properties props = mailSender.getJavaMailProperties();
            props.put("mail.smtp.auth", true);
            props.put("mail.smtp.starttls.enable", true);
            props.put("mail.smtp.ssl.trust", mailHost);
    
            return mailSender;
        }
    
        @Bean
        public AmazonSimpleEmailService amazonSimpleEmailService() {
    
            return AmazonSimpleEmailServiceClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider("ses-smtp-user.234221-1724219"))
                    .withRegion(Regions.EU_WEST_2)
                    .build();
        }
    
        @Bean
        public MailSender mailSender(
                AmazonSimpleEmailService amazonSimpleEmailService) {
            return new SimpleEmailServiceMailSender(amazonSimpleEmailService);
        }
    }
    

    En el código anterior, definimos un bean JavaMailSender basado en las propiedades definidas en el archivo application.properties. Estas propiedades incluyen el host del correo, el nombre de usuario, la contraseña, el puerto y el protocolo. También configuramos ciertas propiedades SMTP requeridas para la autenticación y el cifrado.

    Una vez que defina un bean JavaMailSender, debería estar disponible para inyectarse en la clase NotificationService.

Comments are closed.