SMTP-сервер Greenmail не работает как пользовательский образ докера - PullRequest
0 голосов
/ 04 декабря 2018

Я пытался запустить greenmail-сервер в приложении с весенней загрузкой и докеризовать его, чтобы я мог использовать его в качестве локального mail-mock-сервера для проверки работоспособности почтовых функций в моем исходном приложении.

Образ докера работает правильно при запуске с использованием команды docker-compose up -d и конечных точек, протестированных с помощью клиента REST.

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

Ниже приведена трассировка исключений при попытке отправить почту на mock-сервер.

org.springframework.mail.MailSendException: сбой подключения к почтовому серверу;вложенным исключением является javax.mail.MessagingException: не удалось подключиться к узлу SMTP: 127.0.0.1, порт: 8585, ответ: -1.Сообщения с ошибками: javax.mail.MessagingException: Не удалось подключиться к узлу SMTP: 127.0.0.1, порт: 8585, ответ: -1 на org.springframework.mail.javamail.JavaMailSenderImpl.doSend (JavaMailSenderImpl.java:446) ~ [весна-context-support-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.mail.javamail.JavaMailSenderImpl.send (JavaMailSenderImpl.java:359) ~ [spring-context-support-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.springframework.mail.javamail.JavaMailSenderImpl.send (JavaMailSenderImpl.java:354) ~ [spring-context-support-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at com.test.controller.MailTestController.sendMail (MailTestController.java:80) ~ [main /: na] at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~ [na: 1.8.0_171] в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [na: 1.8.0_171] в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) ~ [na: 1.8f. J.invoke (Method.java:498) ~ [na: 1.8.0_171] ....................................................................................................... .......................................................................................................

Причина: javax.mail.MessagingException: Не удалось подключиться к узлу SMTP: 127.0.0.1, порт: 8585, ответ: -1 на com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:2197) ~ [javax.mail-1.6.2.jar: 1.6.2] в com.sun.mail.smtp.SMTPTransport.protocolConnect (SMTPTransport.java:740) ~ [javax.mail-1.6.2.jar: 1.6.2] на javax.mail.Service.connect (Service.java:366) ~ [javax.mail-1.6.2.jar: 1.6.2] на org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport (JavaMailSenderImpl.java:515) ~ [spring-context-support-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.mail.javamail.JavaMailSenderImpl.doSend (JavaMailSenderImpl.jpg435) ~ [spring-context-support-5.1.2.RELEASE.jar: 5.1.2.RELEASE] ... пропущено 100 общих кадров

Конфигурация DockerFileи docker-compose.yml mail-mock-server добавляются ниже.

DockerFile : -

FROM gcr.io/distroless/java:latest

VOLUME /opt/test/

ARG JAR_FILE
COPY libs/mock-mail-server-*.jar /opt/test/mock-mail-server-app.jar
WORKDIR /opt/test/
CMD ["mock-mail-server-app.jar"]

docker-compose.yml : -

version: '3'
services:
  app:
    image: test/mock-mail-server:0.0.1-SNAPSHOT
    container_name: mock-mail-server-app
    ports: 
      - 0.0.0.0:8484:8484
      - 127.0.0.1:8585:8585

И сервер greenmail запускается в основном классе следующим образом.

@SpringBootApplication
public class MailMockServerApplication {

  public static void main(String[] args) {
    SpringApplication.run(MailMockServerApplication.class, args);
  }

  @Bean
  public GreenMail greenMail() {
    GreenMail smtpServer = new GreenMail(new ServerSetup(8585, "127.0.0.1", "smtp"));
    smtpServer.setUser("test.mailer@test.com", "test", "test");
    smtpServer.start();
    return smtpServer;
  }
}

После построения образа Docker и запуска контейнера Docker с помощью команды docker-compose up -d Я попыталсяследующие конфигурации для bean-компонента JavaMailSender в файле application.yml моего исходного приложения.

mail:
    default-encoding: UTF-8
    host: ${MAIL_SERVER_HOST:127.0.0.1}
    username: ${MAIL_SERVER_USER_NAME:test}
    password: ${MAIL_SERVER_PASSWORD:test}
    port: ${MAIL_SERVER_PORT:8585}
    properties:
      mail:
        debug: true
        smtp:
          debug: false
          auth: true
          starttls: true
    protocol: smtp
    test-connection: false

Между тем, это нормально работает, когда приложение mock-mail-server из командной строки использует команду java -jar.Но когда я пытаюсь повторить то же самое в докере, происходит сбой с исключением соединения.

Я пропускаю какие-либо другие настройки в моем исходном приложении или приложении mock-server?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 04 декабря 2018

Проверяли ли вы после запуска docker-контейнера, есть ли какая-либо служба, прослушивающая указанный вами порт?Для этого [windows / linux] есть команда netstat.Если служба не прослушивает службу, это может привести к невозможности подключения к серверу.

docker exec -ti <container> bash

может использоваться для Linux, как базовые образы.Или попробуйте некоторые подробные журналы из службы smtp.

CMD будет единственным процессом, выполняющимся в контейнере, если в нем нет менеджера процессов.

Непонятно, работает ли «когда выполняется как java -jar», когда вы запускаете команду CMD или за пределами докера на локальном компьютере.Не могли бы вы уточнить.

Как обсуждалось в чате -

Сервер находится внутри контейнера, настроенного на прослушивание 127.0.0.1:8585, и вы выставили тот же порт на хосте.
Таким образом, чтобы решить проблему

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

 GreenMail smtpServer = new GreenMail(new ServerSetup(8585, "0.0.0.0", "smtp"));

и файл yaml для конфигурации приложения с

 host: ${MAIL_SERVER_HOST:0.0.0.0}

Хотя конфигурацию файла docker-compose 127.0.0.1:8585:8585 можно изменить на 8585: 8585 для прослушивания всех адресов хоста, таких как переадресация портов или IP-адрес хоста, кроме петлевого ip.

...