我正在通过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
属性使用该类。