【发布时间】:2018-12-04 12:27:20
【问题描述】:
我试图在 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。失败的 消息: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.RELEASE] 在 org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:359) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在 org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:354) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] 在 com.test.controller.MailTestController.sendMail(MailTestController.java:80) 〜[主要/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[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.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.java:435) ~[spring-context-support-5.1.2.RELEASE.jar:5.1.2.RELEASE] ...省略了 100 个常用帧
下面添加了mail-mock-server的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
并且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 中尝试相同的操作时,它会因连接异常而失败。
我的原始应用程序或模拟服务器应用程序中是否缺少任何其他配置?
任何帮助将不胜感激。
【问题讨论】:
-
从您的应用程序的角度来看,SMTP 服务没有在
localhost上运行。 -
@DavidMaze :但是当我使用 netstat 检查时,SMTP 服务器正在侦听端口 8585。并且可以从 REST 客户端测试端点。
-
你需要将端口而不是 127.0.0.1 暴露到 0.0.0.0 并暴露它。在 docker 内部,它是 docker 容器的本地。所以不会监听主机上运行的代码
标签: java spring docker docker-compose jakarta-mail