Greenmail SMTP服务器无法作为自定义docker映像正常工作



我试图在spring-boot应用程序中启动一个greenmail服务器,并对其进行dockerize,以便将其用作本地邮件模拟服务器,在我的原始应用程序中对邮件功能进行行为测试。

当使用docker-compose up -d命令和从REST客户端测试的端点启动时,docker映像工作正常。

当我试图将它从我的原始应用程序连接到容器中运行的docker映像进行测试时,就会出现这个问题。

下面添加了当我尝试向模拟服务器发送邮件时的异常跟踪。

org.springframework.mail.MailSendException:邮件服务器连接失败;嵌套异常为javax.mail.MessagingException:无法连接到SMTP主机:127.0.0.1,端口:8585,响应:-1。失败messages:javax.mail.MessagingException:无法连接到SMTP主机:127.0.0.1,端口:8585,响应:-1网址:org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:446)~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.REASE]网址:org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:359)~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.REASE]网址:org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:354)~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.REASE]网址:com.test.controller.MailTestController.sendMail(MailTestControll.java:80)~[main/:na]在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.8.0_171]位于java.lang.reflect.Method.ioke(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.procolConnect(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.REASE]网址:org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:435)~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.REASE]…100个普通帧省略

DockerFile配置和邮件模拟服务器的docker-compose.yml添加在下面。

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

绿色邮件服务器在main类中启动,如下所示。

@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-compose up -d启动docker容器之后,我在原始应用程序的application.yml文件中尝试了JavaMailSenderbean的以下配置。

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

同时,当我的模拟邮件服务器应用程序在命令行中使用java -jar命令时,这一点也很好。但当我在docker中尝试同样的操作时,它会失败,并出现连接异常。

我的原始应用程序或模拟服务器应用程序中是否缺少任何其他配置?

如有任何帮助,我们将不胜感激。

运行docker容器后,是否检查了指定端口上是否有任何服务在侦听?这个[windows/linux]有netstat命令。如果没有服务在侦听,则会出现无法连接到服务器的错误。

docker exec -ti <container> bash

可以用于类似linux的基本映像。或者尝试一些详细的方式从smtp服务日志。

除非容器中有进程管理器,否则CMD进程将是容器中唯一运行的进程

当您在本地机器上尝试命令CMD或外部docker时,还不清楚"它在作为java-jar执行时工作"。你能澄清一下吗。

如聊天中所述-

服务器位于配置为侦听127.0.0.1:8585的容器内,并且您在主机上暴露了相同的端口
所以要解决这个问题

您需要将smtp服务器配置为在0.0.0.0上侦听,因为使用127.0.0.1会侦听来自容器内部的连接,因为容器的127.0.0.1和127.0.0.1 fo容器与客户端尝试连接的主机的本地主机不同。因此,以下更改将起作用-

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

以及带有的应用程序的配置yaml文件

host: ${MAIL_SERVER_HOST:0.0.0.0}

尽管docker compose file config 127.0.0.1:8585:58585可以更改为8585:5858,以侦听所有主机地址,如端口转发或除环回ip之外的主机ip。

最新更新