Не проходит аутентификацию при отправке электронного письма

Пытаюсь добавить в приложение функцию отправке писем использую сервер яндекса. Вот пример моего application.yml

spring:
  mail:
    host: smtp.yandex.ru
    port: 465
    username: myusername
    password: mypassword
    properties:
      "mail.transport.protocol": smtps
      "mail.smtp.auth": true
      "mail.smtp.starttls.enable": true
    protocol: smtps

Формат username'a именно такой, без @yandex.ru, однако так же пытался вставить и @yandex.ru и точно также не работало. Вводимые данные корректны, сам под ними логинился. Вот код моего сервиса:

@Service
@Slf4j
public class EmailService {
    private final JavaMailSender mailSender;

    public EmailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendEmail(String to, String from, String text, String subject) {
        log.info("FROM EMAIL_SERVICE: SENDING MAIL TO {}, FROM {}, SUBJECT: {}, TEXT {}", to, from, subject, text);
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        log.info("FROM EMPLOYEE_SERVICE: MESSAGE PREPARED: {}", message);
        mailSender.send(message);
    }
}

Приложение виснет на mailSender#send, после чего выводит такую ошибку:

org.springframework.mail.MailAuthenticationException: Authentication failed

Caused by: jakarta.mail.AuthenticationFailedException: 535 5.7.8 Error: authentication failed: Invalid user or password! 1714085712-7tVbL26Xq0U0

По сообщение о причине ошибке ясно, что либо логин либо пароль введены неправильно, однако, как я уже сказал, всё введено верно. Вот пример того, как я отправляю письмо:

@SpringBootTest
public class EmailServiceTest {
    @Autowired
    private EmailService emailService;
    private static GreenMail testSmtp;

    @BeforeAll
    static void setUp() {
        testSmtp = new GreenMail(ServerSetupTest.SMTP);
        testSmtp.start();
    }

    @Test
    void should_send_email() throws MessagingException {
        emailService.sendEmail("[email protected]", "[email protected]",
                "test", "test");

        Message[] messages = testSmtp.getReceivedMessages();
        assertEquals(1, messages.length);
        assertEquals("test", messages[0].getSubject());
        String body = GreenMailUtil.getBody(messages[0]).replaceAll("=\r?\n", "");
        assertEquals("test", body);
    }

    @AfterAll
    static void afterAll() {
        testSmtp.stop();
    }
}

Думал, что проблема находится в библиотеке, которую я использую для тестирования отправки писем (Green Mail), однако точно такая же ошибка вылазит и за пределами теста. Как уже сказал, пробовал ввести логин в форматах [email protected] и myusername, однако ничего не меняется, пароль также является верным. В Яндекс Почте в разделе настроек "Почтовые программы" выставил все галочки, однако всё равно вылетает ошибка. введите сюда описание изображения

На скриншоте видно, что разрешить доступ к почте можно только с сервера imap.yandex.ru по протоколу IMAP. Значит ли это, что ошибка может заключаться именно в том, что я пытаюсь воспользоваться сервером smtp.yandex.ru по протоколу smtps (пробовал как обычный smtp, так и smtps, при использовании smtp приложение просто зависает), что не является возможным? Если это так, может ли кто-нибудь предоставить статьи или гайды о том, как это реализовать самым простым способом?


Ответы (2 шт):

Автор решения: user453575457

Попробуйте следующие настройки:

spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.enable=true
→ Ссылка
Автор решения: Allito

У Яндекса, для доступа к почте из разных приложений, нужно создавать отдельные пароли для каждого приложения. Подробнее читайте в справке Яндекса.

→ Ссылка