spring-mvc - SMTP 连接在 354 后被拒绝,仅来自与 smtp postfix 部署在同一台机器上的 Web 服务器

标签 spring-mvc tomcat jakarta-mail postfix-mta

我有一个奇怪的问题。我的 SMTP 服务器部署在 linux 主机(postfix/dovecot)上。我有一个基于 Spring MVC + Tomcat 的 Web 应用程序。如果我从我的本地 macbook 连接到 Lunix 服务器 (Centos) 上的 SMTP 服务器,消息发送正常。但是,当我在 Linux 系统上的 Tomcat 7(使用受信任的 CA 证书 SSL)上部署 Web 应用程序时,它在从服务器接收到 354 后给了我一个连接被拒绝的异常。我还为 smtp 生成了开放式 ssl 证书,并添加到 jdk/jre/lib/security/cacert 中的受信任证书。我在 macbook 和 linux 服务器上都尝试过 smtp 和 smtps。在开发中,两者都有效。在 linux(prod) 上,两者都失败了。请注意,在 dev 和 prod 中,它都能够进行身份验证和登录。它仅在“354 End data with .”之后。来自 SMTP 的响应,dev 和 prod 的行为不同。

来 self 的 spring appServerContext.xml:-

            <property name="host" value="${linux.host}" />
            <property name="port" value="${linux_ssl.port}" />
            <property name="username" value="${username}" />
            <property name="password" value="${password}" />
            <property name="protocol" value="smtps" />

    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtps.auth">true</prop>
            <prop key="mail.smtps.connectiontimeout">5000</prop>
            <prop key="mail.smtps.sendpartial">true</prop>
            <prop key="mail.smtps.userset">true</prop>
            <prop key="mail.mime.charset">UTF-8</prop>
            <prop key="mail.smtps.isSecure">true</prop>
            <prop key="mail.smtps.requiresAuthentication">true</prop>
            <prop key="mail.smtps.port">465</prop>
            <prop key="mail.smtps.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
            <prop key="mail.smtps.socketFactory.fallback">true</prop>
            <prop key="mail.smtps.starttls.enable">true</prop>
            <prop key="mail.debug">true</prop>
            <!-- <prop key="mail.smtps.ssl.checkserveridentity">true</prop>
            <prop key="mail.smtps.ssl.trust">*</prop> -->
        </props>
   </property>
</bean>

来自开发日志的 SMTP 调试:

354 End data with <CR><LF>.<CR><LF>
..
From: Test User <testuser@mydomain.com>
To: princess_yvonne@gmail.com
Message-ID: <1833254786.2.1468329021927.JavaMail.local@Yvonne-Koks-MacBook-  Pro.local>
Subject: Acknowledgement
MIME-Version: 1.0

来自 prod(smtp 和 smtps 都在同一个地方失败并出现相同的错误)

DATA
354 End data with <CR><LF>.<CR><LF>
DEBUG SMTP: IOException while sending, closing, THROW:
java.net.ConnectException: Connection refused at        java.net.PlainSocketImpl.socketConnect(Native Method) at     
java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)at     java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625) at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160) at sun.net.NetworkClient.doConnect(NetworkClient.java:180) at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275) at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at org.springframework.core.io.UrlResource.getInputStream(UrlResource.java:168) at org.springframework.mail.javamail.MimeMessageHelper$1.getInputStream(MimeMessageHelper.java:1093) at javax.activation.DataHandler.writeTo(DataHandler.java:305) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865) at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462) at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:103) at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889) at javax.activation.DataHandler.writeTo(DataHandler.java:317) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865) at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462) at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:103) at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889) at javax.activation.DataHandler.writeTo(DataHandler.java:317) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119) at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:433) at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345) at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)

我已经详尽地搜索了确切的问题。尽管有 ConnectionRefused 的示例,但我没有注意到与 smtp 服务器位于同一个盒子上时紧跟在 354 之后的例子。

提前非常感谢您的帮助!

最佳答案

去掉 socket factory stuff, you don't need it .

您是否将 URLDataSource 用于您发送的消息的部分内容?当 JavaMail 尝试访问邮件的部分内容时,连接被断开,这需要与某些服务器的 https 连接。这是 https 连接被丢弃,导致 SMTP 连接被丢弃。

关于spring-mvc - SMTP 连接在 354 后被拒绝,仅来自与 smtp postfix 部署在同一台机器上的 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38331026/

相关文章:

java - Spring - 在 Web 请求完成并触发 RequestMapping 之前执行

java - 如何在 Spring MVC 中使用单个 View 执行所有 CRUD 操作?

hibernate - JBoss 7 Spring JPA + Hibernate 应用程序 : no transaction is in progress

java - 部署war到JBOSS

java - 将方法(或 void)传递给 Java ArrayList

Java邮件 : can FetchProfile be used when searching mails instead of just fetching them?

java - Spring Security中如何保证同一个账号不被两个不同的人同时登录?

java - Tomcat,httpd : Running both at same time and calling based upon URL.

javax.mail.MessagingException : * BYE Internal error occurred

javaMail 与 Lotus 服务器