Вопрос или проблема
Я использую 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
#ИНФО: вышеуказанные переменные заполняются корректно
Вещи, которые я пробовал
- Открыть порт
- Убедился, что файерволл с ufw позволяет входящие и исходящие соединения
- Пробовал на всех различных портах 25, 587, 433 и т.д.
Ответ или решение
Ошибка подключения к SMTP-серверу при использовании Spring Boot в Docker
Проблема
Вы столкнулись с проблемой подключения к SMTP-серверу из контейнера Docker, используя библиотеку spring-boot-starter-mail
. Ошибка, которую вы получаете, указывает на то, что соединение не может быть установлено с SMTP-сервером, что подтверждается отсутствием возможности подключения через telnet. При этом на хосте ваше приложение работает корректно, что указывает на проблемы с сетью или настройками контейнера.
Причины и решения проблемы
-
Сетевые настройки Docker
Первое, на что стоит обратить внимание, это сеть Docker. Контейнеры по умолчанию работают в изолированной сети. Это может быть причиной того, что они не могут получить доступ к внешним SMTP-серверам. Вам нужно убедиться, что ваш контейнер имеет правильные сетевые настройки.
В вашем
docker-compose.yml
вы используете сеть с драйверомbridge
. Убедитесь, что ваш контейнер действительно подключен к этой сети. Попробуйте выполнить следующее:docker network inspect app-network
Это покажет вам список подключенных контейнеров.
-
Проверка настроек Firewall
Вы уже упомянули, что проверяли настройки
ufw
. Убедитесь, что весь сетевой трафик разрешен для контейнеров. Выполните команды для проверки:sudo ufw status
В случае необходимости добавьте правила для разрешения трафика на портах, на которых вы пытаетесь установить соединение.
-
Проверка Dockerfile и конфигурации Spring Boot
Проверьте файл
Dockerfile
. Обратите внимание на следующее:EXPOSE 8080 587
Порт 587 (или 25) не является портом, который должен использоваться для вашего приложения, это порт для SMTP-сервера. Он не должен быть опубликован, если вы не используете его напрямую.
-
Использование Telnet
Когда вы находитесь внутри контейнера, попробуйте выполнить следующее:
telnet smtp.gmail.com 587
Если telnet не может подключиться, значит, проблема скорее всего связана с сетевыми настройками контейнера или с конфигурацией вашего SMTP-сервера.
-
Проверка конфигурации 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.