Как настроить аутентифицированный JavaMailSender в Spring Boot - PullRequest
0 голосов
/ 09 мая 2018

Мне кажется, что я не могу правильно настроить реализацию SpringMail JavaMail через Spring Boot application.properties.

Следующий код с использованием стандартного API JavaMail отправляет сообщения электронной почты просто отлично:

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "587");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("username", "password");
    }
});

try {

    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("sender@gmail.com"));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipientaddress@gmail.com"));
    message.setSubject("Test Message");
    message.setText("This is a test message.");

    Transport.send(message);
    System.out.println("Sent");
} catch (MessagingException e) {
    throw new RuntimeException(e);
}

Приложение My Spring Boot application.properties содержит следующие свойства, относящиеся к доставке электронной почты:

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.transport.protocol=smtp
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

Следующий код в приложении Spring Boot не отправляет сообщения электронной почты, но также не выдает никаких исключений:

@Autowired
private JavaMailSender emailSender;

@RequestMapping("/sendEmail")
public ResponseEntity<Void> sendEmail(HttpServletRequest httpRequest) {

    try {

        MimeMessage message = emailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message);
        helper.setFrom("sender@gmail.com");
        helper.setTo("recipientaddress@gmail.com");
        helper.setText("This is a test message.");
        helper.setSubject("Test Message");
        emailSender.send(message);
        System.out.println("Sent");
    }
    catch (MessagingException me) {
        logger.error("Failed to send email: {}", me.getMessage());
    }

    return new ResponseEntity<Void>(null, HttpStatus.OK);
}

1 Ответ

0 голосов
/ 24 июля 2018

Когда вы использовали стандартные API JavaMail, вы выполняли аутентификацию с помощью

new PasswordAuthentication ("username", "password");

При загрузке Spring вы не проходите аутентификацию, у вас есть два варианта:

  1. Проверка подлинности с использованием имени пользователя и пароля из application.properties, создание сеанса, подобного тому, который используется с JavaMail API
  2. Делегируйте аутентификацию для Spring Boot, удалите все параметры, относящиеся к конфигурации электронной почты, из application.properties и используйте их, определенные на сервере, замените на

spring.mail.jndi имя = Java: JBoss / почта / exampleJboss

метод sendEmail будет работать с JavaMailSender

...