gpt4 book ai didi

java - Greenmail SMTP服务器无法作为自定义Docker镜像正常工作

转载 作者:行者123 更新时间:2023-12-02 19:28:52 27 4
gpt4 key购买 nike

我试图在 Spring 启动应用程序中启动greenmail服务器并对其进行docker化,以便可以将其用作本地邮件模拟服务器,以对原始应用程序中的邮件测试功能。

使用docker-compose up -d命令启动docker镜像并通过REST客户端测试端点后,该镜像可以正常工作。

当我尝试从原始应用程序将其连接以进行测试,并且容器中运行的docker镜像出现问题时,就会发生此问题。

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

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: 127.0.0.1, port: 8585, response: -1. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: 127.0.0.1, port: 8585, response: -1 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:446) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] at 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(Native Method) ~[na:1.8.0_171] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_171] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171] ....................................................................................................... .......................................................................................................

Caused by: javax.mail.MessagingException: Could not connect to SMTP host: 127.0.0.1, port: 8585, response: -1 at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2197) ~[javax.mail-1.6.2.jar:1.6.2] at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740) ~[javax.mail-1.6.2.jar:1.6.2] at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.6.2.jar:1.6.2] at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:515) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:435) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] ... 100 common frames omitted



下面添加了DockerFile配置和mail-mock-server的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

并在主类中按以下方式启动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-compose up -d命令启动docker容器后,我在原始应用程序的application.yml文件中尝试了 JavaMailSender bean的以下配置。
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文件配置127.0.0.1:8585:8585更改为8585:8585以侦听所有主机地址,例如端口转发或主机IP(而非回送ip)。

关于java - Greenmail SMTP服务器无法作为自定义Docker镜像正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com