java - 应用程序无法使用 docker 连接到 smtp 主机和端口 587

标签 java docker docker-compose

我是 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/

相关文章:

python - 如何在浏览器上打开在 docker 上远程运行的 Flask 应用程序?

Java内部类导入Scala项目

java - SVG 上的 Android RotateDrawable 会产生锯齿状边缘

java - O(n^2) 解决这个问题的速度不够快。任何更快的方法?

docker - docker 无事可做,找不到 docker 命令

linux - Docker - 从 docker 容器中重启树莓派主机

java - 如何更改Kafka拓扑的消费者偏移量?

docker - docker-我们如何仅导出/导入(或保存/加载)新更改?

docker - 使用Docker Compose标记图像/容器

docker - 为什么tty = true(在docker-compose.yml中)在Gin应用程序上突出显示日志?