我是 jetty worker 的新手。我需要你的帮助来解决我过去 1 周面临的 docker 问题之一。我有一个 Spring Boot 应用程序,它使用 SMTP 主机和 SMTP 端口连接到公司电子邮件服务器来发送电子邮件。当应用程序在本地作为普通 java 程序运行时,它运行良好。应用程序能够建立与 SMTP 服务器的连接并能够发送电子邮件。现在,一旦应用程序位于 docker 容器上,我就会收到“连接超时”错误。
请注意,我能够从 docker 容器发送像 google.com 这样的curl 命令,只是为了检查我是否能够连接到互联网并能够在那里获得响应。我不确定会出现什么问题,因为curl 适用于 HTTP,但 SMTP 连接不适用于 docker 容器。我需要更改 docker 设置吗?
我还尝试使/etc/hosts 文件和/etc/resolve.conf 与主机配置文件保持一致,但仍然无法继续。我使用的是mac,所以我认为错误可能是由于docker for mac创建的薄层VM的设置引起的,所以我尝试在linux机器上运行该应用程序,但仍然没有成功。
任何建议或指示将不胜感激。
错误堆栈跟踪:
notification-service | Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.company.com, 587; timeout 10000
notification-service | at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at javax.mail.Service.connect(Service.java:246) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at com.company.EmailSender.sendEmailNotification(EmailSender.java:127) ~[classes!/:na]
notification-service | ... 38 common frames omitted
notification-service | Caused by: java.net.SocketTimeoutException: connect timed out
notification-service | at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_171]
notification-service | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_171]
notification-service | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_171]
notification-service | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_171]
notification-service | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_171]
notification-service | at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_171]
notification-service | at com.sun.mail.util.WriteTimeoutSocket.connect(WriteTimeoutSocket.java:115) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:351) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:239) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175) ~[javax.mail-1.6.1.jar!/:1.6.1]
notification-service | ... 42 common frames omitted
这是我的 Dockerfile
FROM com.company/serverjre:8
ARG JAR_FILE
ARG JAR_INSTRUMENT
VOLUME /tmp
COPY ${JAR_FILE} /app.jar
COPY ${JAR_INSTRUMENT} /spring-instrument.jar
EXPOSE 9000
ENTRYPOINT exec java -javaagent:/spring-instrument.jar -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar
这是我的 docker-compose.yml 的片段
version: '3.5'
services:
notification-service:
hostname: notification-service
container_name: notification-service
image: com.company/notification-service:1.0-SNAPSHOT
depends_on:
- kafka
- kafka-schema-registry
ports:
- 9810:9810
volumes:
- ./notification-service-application.yaml:/config/application.yml
尝试在 docker-compose.yml 中添加端口 587:587 但没有成功。
最佳答案
经过两周的努力,发现问题只出在我这边。问题是缺少 SMTP 代理设置。配置 SMTP 代理设置后,我收到读取超时错误。因此,我将整体超时设置从 10000 增加到 20000,瞧,我能够将电子邮件发送给收件人。
将其作为答案,以防万一有类似问题的人登陆此页面,并且此页面可能能够帮助他们。
关于java - 应用程序无法使用 docker 连接到 smtp 主机和端口 587,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59317586/