Таймаут подключения при подключении к smtp с использованием spring boot starter email в docker

Вопрос или проблема

Я использую spring-boot-starter-mail для отправки электронной почты, также я разворачиваю свое Spring Boot приложение с помощью Docker. Я не могу подключиться к SMTP-серверу на любом порту через Docker, в то время как с хоста я могу подключиться.

Также я не могу подключиться к SMTP через telnet после подключения к контейнеру Docker.

Кто-нибудь может помочь мне преодолеть эту проблему..

Вот ошибка

Не удалось установить соединение с почтовым сервером. Неудачные сообщения: org.eclipse.angus.mail.util.MailConnectException: Не удалось подключиться к хосту, порт: smtp.gmail.com, 587; тайм-аут -1; вложенное исключение: java.net.ConnectException: Превышено время ожидания операции

docker-compose.yml

version: '3'
services:
  ecommerce:
    image: ecommerce:latest
    build:
      context: .
      dockerfile: ecommerce/Dockerfile
    ports:
      - "8080:8080"
      - "587:587"
    networks:
      - app-network
networks:
  app-network:
    driver: bridge

Dockerfile

FROM openjdk:17-jdk-alpine

WORKDIR /app/ecommerce

COPY /ecommerce/main.jar /app/main.jar
COPY /ecommerce/env.properties /app/env.properties

EXPOSE 8080 587

ENTRYPOINT ["java", "-jar", "main.jar"]

Конфигурация Spring

spring.mail.host=${EMAIL_HOST}
spring.mail.port=${EMAIL_PORT}
spring.mail.username=${EMAIL_USERNAME}
spring.mail.password=${EMAIL_PASSWORD}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.enable=false

#ИНФО: вышеуказанные переменные заполняются корректно

Вещи, которые я пробовал

  1. Открыть порт
  2. Убедился, что файерволл с ufw позволяет входящие и исходящие соединения
  3. Пробовал на всех различных портах 25, 587, 433 и т.д.

Ответ или решение

Ошибка подключения к SMTP-серверу при использовании Spring Boot в Docker

Проблема

Вы столкнулись с проблемой подключения к SMTP-серверу из контейнера Docker, используя библиотеку spring-boot-starter-mail. Ошибка, которую вы получаете, указывает на то, что соединение не может быть установлено с SMTP-сервером, что подтверждается отсутствием возможности подключения через telnet. При этом на хосте ваше приложение работает корректно, что указывает на проблемы с сетью или настройками контейнера.

Причины и решения проблемы

  1. Сетевые настройки Docker

    Первое, на что стоит обратить внимание, это сеть Docker. Контейнеры по умолчанию работают в изолированной сети. Это может быть причиной того, что они не могут получить доступ к внешним SMTP-серверам. Вам нужно убедиться, что ваш контейнер имеет правильные сетевые настройки.

    В вашем docker-compose.yml вы используете сеть с драйвером bridge. Убедитесь, что ваш контейнер действительно подключен к этой сети. Попробуйте выполнить следующее:

    docker network inspect app-network

    Это покажет вам список подключенных контейнеров.

  2. Проверка настроек Firewall

    Вы уже упомянули, что проверяли настройки ufw. Убедитесь, что весь сетевой трафик разрешен для контейнеров. Выполните команды для проверки:

    sudo ufw status

    В случае необходимости добавьте правила для разрешения трафика на портах, на которых вы пытаетесь установить соединение.

  3. Проверка Dockerfile и конфигурации Spring Boot

    Проверьте файл Dockerfile. Обратите внимание на следующее:

    EXPOSE 8080 587

    Порт 587 (или 25) не является портом, который должен использоваться для вашего приложения, это порт для SMTP-сервера. Он не должен быть опубликован, если вы не используете его напрямую.

  4. Использование Telnet

    Когда вы находитесь внутри контейнера, попробуйте выполнить следующее:

    telnet smtp.gmail.com 587

    Если telnet не может подключиться, значит, проблема скорее всего связана с сетевыми настройками контейнера или с конфигурацией вашего SMTP-сервера.

  5. Проверка конфигурации SMTP

    Убедитесь, что настройки SMTP корректны. Например, для Gmail они выглядят следующим образом:

    spring.mail.host=smtp.gmail.com
    spring.mail.port=587
    spring.mail.username=ваш_email@gmail.com
    spring.mail.password=ваш_пароль
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.ssl.enable=false

    Проверьте правильность указанных переменных окружения и их наличие в файле env.properties.

Проверка дополнительных аспектов

  • Проблемы с безопасностью: Если ваше приложение запускается на локальном сервере и обращается к внешним SMTP, это может быть заблокировано настройками безопасности вашего облачного провайдера (например, Google, если используете Gmail). Убедитесь, что вы разрешили доступ из вашего Docker-контейнера к API Gmail.

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

Заключение

Подводя итоги, проблемы с подключением к SMTP-серверу из Docker могут быть вызваны различными факторами, включая неправильные сетевые настройки, блокировку внешнего трафика на уровне firewall или даже неправильную конфигурацию SMTP. Проведите указанные выше проверки и изменения, и это должно помочь решить вашу проблему.

Если проблема настойчиво сохраняется, рекомендуется рассмотреть возможность использования локального SMTP-сервера для тестирования или обратиться за поддержкой на форумах, посвященных Docker и Spring Boot.

Оцените материал
Добавить комментарий

Капча загружается...