Не проходит аутентификацию при отправке электронного письма
Пытаюсь добавить в приложение функцию отправке писем использую сервер яндекса. Вот пример моего 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 шт):
Попробуйте следующие настройки:
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.enable=true
У Яндекса, для доступа к почте из разных приложений, нужно создавать отдельные пароли для каждого приложения. Подробнее читайте в справке Яндекса.