Неожиданная ошибка при попытке отправить электронное письмо через весеннюю загрузку

Мне нужно было написать сервис для отправки писем, но сколько источников я не просматривал документацию по Java-мейлеру, ничего не выходит и вылетает с неожиданной ошибкой:

"Mail server connection failed. Failed messages: org.eclipse.angus.mail.util .MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 587; timeout -1;\n nested exception is:\n\tjava.net.ConnectException: Connection timed out: connect".

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

@Service
public class EmailService implements IEmailService{

    private static final Logger log = LoggerFactory.getLogger(EmailService.class);
    private final JavaMailSender _javaMailSender;

    public EmailService(JavaMailSender javaMailSender){
        _javaMailSender=javaMailSender;
    }

    @Value("${spring.mail.username}") private String sender;

    @Override
    public ServiceResponse<String> sendEmail(String recipientEmail, String subject, String message) throws Exception {
            var serviceResponse = new ServiceResponse<String>();
            try {

                MimeMessage messageM = _javaMailSender.createMimeMessage();
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(messageM, true);
                mimeMessageHelper.setFrom(sender);
                mimeMessageHelper.setTo(recipientEmail);
                mimeMessageHelper.setSubject(subject);
                mimeMessageHelper.setText(message);
                _javaMailSender.send(messageM);
                serviceResponse.data=null;
                serviceResponse.success=true;
                serviceResponse.message=String.format("Security code for %s successfully sent to your email.", subject);
            }
            catch (Exception ex) {
                serviceResponse.data=null;
                serviceResponse.success=false;
                serviceResponse.message=ex.getMessage();
            }
            return serviceResponse;
    }

Вот мой application.yml:

  mail:
    host: smtp.gmail.com
    username: [email protected]
    password: **** **** **** ****
    port: 587
    protocol: smtp
    properties:
      "mail.transport.protocol": smtp
      "mail.smtp.auth": true
      "mail.smtp.starttls.enable": true

pom.xml пакет:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

ожидал, что сообщение будет отправлено по электронной почте, но вместо этого произошла вышеуказанная ошибка

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
158
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

application.yml

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: [email protected]
    password: your_app_password_here
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

Добавьте их в application.yml, чтобы включить ведение журнала отладки для отправителя почты.

logging:
  level:
    org.springframework.mail: DEBUG
    org.apache.commons.mail: DEBUG

Обновите EmailService Также:

@Service
public class EmailService implements IEmailService {

    private static final Logger log = LoggerFactory.getLogger(EmailService.class);
    private final JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String sender;

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

    @Override
    public ServiceResponse<String> sendEmail(String recipientEmail, String subject, String message) {
        var serviceResponse = new ServiceResponse<String>();
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setFrom(sender);
            mimeMessageHelper.setTo(recipientEmail);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(message);
            javaMailSender.send(mimeMessage);
            serviceResponse.data = null;
            serviceResponse.success = true;
            serviceResponse.message = String.format("Security code for %s successfully sent to your email.", subject);
        } catch (Exception ex) {
            log.error("Error sending email: {}", ex.getMessage(), ex);
            serviceResponse.data = null;
            serviceResponse.success = false;
            serviceResponse.message = ex.getMessage();
        }
        return serviceResponse;
    }
}

привет, спасибо, все поменял, но ошибки остались прежние. 2024-07-14T14:29:12.578+03:00 ОШИБКА 14272 --- [io-8080-exec-10] h.service.emailService.EmailService: Ошибка отправки электронной почты: не удалось подключиться к почтовому серверу. Неудачные сообщения: org.eclipse.angus.mail.util.MailConnectException: не удалось подключиться к хосту, порт: smtp.gmail.com, 587; тайм-аут -1;

ushkdn 14.07.2024 13:31

Что ты изменил? Что было не так раньше?

Sotirios Delimanolis 14.07.2024 15:43

заменил мои файлы на ваши и включил ведение журнала, ошибки остались прежними

ushkdn 14.07.2024 15:54

Сообщение об ошибке «Ошибка подключения к почтовому серверу» на самом деле указывает на проблему с сетевым подключением, которая может быть вызвана множеством причин или проблем.

  1. Сначала вам нужно проверить подключение к сети.

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

ping smtp.gmail.com

или

telnet smtp.gmail.com 587
  1. Также попробуйте проверить настройки SMTP в вашем application.yml.
spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: [email protected]
    password: yourpassword
    properties:
      mail.smtp.auth: true
      mail.smtp.starttls.enable: true
      mail.transport.protocol: smtp
  1. Включите «Менее безопасные приложения» в Gmail
  • Google может заблокировать соединение, если посчитает приложение менее безопасным. Вам необходимо разрешить доступ к менее безопасным приложениям в настройках вашего аккаунта Google:
  • Зайдите в настройки аккаунта Google.
  • В разделе «Доступ к менее безопасным приложениям» включите доступ для менее безопасных приложений.
  1. Используйте пароль приложения Если в вашей учетной записи Google включена двухфакторная аутентификация (2FA), вам необходимо создать пароль приложения вместо использования обычного пароля учетной записи:
  • Перейдите в «Пароли приложений».
  • Создайте пароль приложения и используйте его в своем application.yml.

Я написал эту конфигурацию, вы также можете использовать ее для проверки правильности настройки вашего JavaMailSender bean:

@Configuration
public class MailConfig {

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

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

        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;
    }
}

Не забудьте проверить настройки брандмауэра/прокси-сервера, чтобы убедиться, что ваш компьютер или сеть не блокирует исходящие соединения через порт 587. Вы можете проверить настройки брандмауэра или прокси-сервера, которые могут мешать этому соединению.

Надеюсь, это поможет.

привет, спасибо, все поменял, но ошибки остались прежние. 2024-07-14T14:29:12.578+03:00 ОШИБКА 14272 --- [io-8080-exec-10] h.service.emailService.EmailService: Ошибка отправки электронной почты: не удалось подключиться к почтовому серверу. Неудачные сообщения: org.eclipse.angus.mail.util.MailConnectException: не удалось подключиться к хосту, порт: smtp.gmail.com, 587; тайм-аут -1; и на сайте Google говорится, что они отключили функцию менее безопасных приложений с 2024 года.

ushkdn 14.07.2024 13:47

У меня та же проблема. SMTP-сервер доступен. Команда ping не показывает потерю пакетов. Более того, я могу зайти в почту и отправлять с нее сообщения вручную. Все настройки в файле выставлены правильно. Со специальным паролем для приложения проблем не возникает. Попробовал установить правила для порта 587 в брандмауэре. Ничего не помогает, ошибка та же. По-прежнему "Тайм-аут соединения истек", как будто SMTP-сервер недоступен, хотя он доступен.

Byb 14.07.2024 20:15

В качестве теста или альтернативы вы можете попробовать использовать другого поставщика услуг электронной почты. SMTP2GO предлагает бесплатные уровни и может быть быстрым способом проверить, является ли проблема специфичной для Gmail. @ushkdn

Funmi Ayinde 14.07.2024 23:12
Ответ принят как подходящий

Проблема решилась заменой интернет-провайдера (изначально не получалось, так как я подключался к Wi-Fi другой сети со вставленным патч-кордом текущей сети (не знаю, проблема была в винде или сама сетевая карта, что она не могла переключить сигнал, но после переключения) в другую сеть и полного отключения от предыдущей смтп сразу встала и работает)).

Другие вопросы по теме