我正在通过JavaMail将邮件发送到本地端口25上的邮件服务器。
我的邮件服务器仅绑定到IP4,即它绑定到127.0.0.1:25,但不绑定到[::]:25

使用JavaMail 2.5.1和JDK 1.7.0_45,只有在设置系统属性java.net.preferIPv4Stack=true时,我才能使它工作。

问题:


为什么需要设置系统属性?我的意思是为什么不
在JavaMail中足以将我的目标主机设置为127.0.0.1
localhost。我会假设使用一个明确的IP4地址
足以告诉Java我要使用IP4
连接?
好的,假设我确实需要该系统属性。我在J2EE中
服务器,我真的不想惹上其他租户
同一台J2EE服务器。如果我以编程方式在代码中进行设置,例如
System.setProperty("java.net.preferIPv4Stack","true")它将影响J2EE服务器中的其他租户吗?
我真正想做的是确保只有SMTP连接使用IP4。在应用程序中,还有许多其他与SMTP不相关的TCP连接。我不想限制那些仅使用IP4。有没有办法可以做到这一点?


谢谢

最佳答案

我会回答我自己的问题。

问题是使用属性mail.smtp.host=127.0.0.1不会像我期望的那样强制使用IP4。

诀窍是也要使用属性mail.smtp.localaddress=127.0.0.1。这会将传出套接字绑定到该本地地址,从而使其成为IP4。

JavaMail中SMTP连接的属性记录在here中。

我假设通过创建自定义SocketFactory类也可以解决问题,然后让JavaMail知道应通过mail.smtp.socketFactory.class属性使用该类。

10-02 23:23