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

Java 应用程序无法使用docker连接到smtp主机和端口587,java,docker,docker-compose,Java,Docker,Docker Compose,我是新来的码头工人。我需要你的帮助来解决我在过去一周所面临的docker问题之一。我有一个Spring Boot应用程序,它使用SMTP主机和SMTP端口连接到公司电子邮件服务器以发送电子邮件。当应用程序在本地作为普通java程序工作时,它工作正常。应用程序能够建立到SMTP服务器的连接,并能够发送电子邮件。现在,只要应用程序在docker容器上,就会出现“连接超时”错误 请注意,我可以从docker容器发送curl命令,比如google.com,只是为了检查我是否能够连接到internet,并

我是新来的码头工人。我需要你的帮助来解决我在过去一周所面临的docker问题之一。我有一个Spring Boot应用程序,它使用SMTP主机和SMTP端口连接到公司电子邮件服务器以发送电子邮件。当应用程序在本地作为普通java程序工作时,它工作正常。应用程序能够建立到SMTP服务器的连接,并能够发送电子邮件。现在,只要应用程序在docker容器上,就会出现“连接超时”错误

请注意,我可以从docker容器发送curl命令,比如google.com,只是为了检查我是否能够连接到internet,并且能够在那里得到响应。我不确定会出什么问题,因为curl在HTTP上工作,但SMTP连接在docker容器上不工作。我需要更改docker设置吗

我还试着在主机配置文件的基础上制作/ETC/HOST文件和/ETC/Soviv.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
这是我的文件

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,瞧,我能够将电子邮件发送给收件人


在此处给出答案,以防有类似问题的人访问此页面,并且此页面可能能够帮助他们。

您在容器内使用了哪个curl命令来验证与smtp服务器的通信是否正常?请不要在评论中回复:编辑您的问题并添加此信息。谢谢询问。已添加所需的信息。您是否能够远程登录邮件服务器?否。。。我无法做到这一点,即使从我的本地机器。。。当我从本地和docker进行telnet时,如果同一个应用程序在本地工作,就会出现连接拒绝错误。。。