SMTP / POP3通过代理System.getProperties()vs新的Properties()?

时间:2015-01-23 06:49:07

标签: java proxy smtp javamail pop3

我试图通过代理从POP3服务器获取邮件。大多数“教程”建议做类似

的事情
 Properties p = System.getProperties();
 p.setProperty("proxySet", "true");//does this line even do anything?
 p.setProperty("socksProxyHost", proxyHost);
 p.setPorperty("socksProxyPort", proxyPort);
 p.setProperty("socksProxyVersion", "5");//or 4 if you want to use 4
 p.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
 p.setProperty("mail.pop3.socketFactory.fallback", "false");//also not sure what it does
 p.setProperty("mail.pop3.port", portOnHostYouWantToTalkTo);
 p.setProperty("mail.pop3.socketFactory.port", portOnHostYouWantToTalkTo);

 Session session = Session.getDefaultInstance(p, null);
 //or session = Session.getInstance(p, null);

 URLName urlName = new URLName(protocol, hostYouwantToTalkTo, portOnHostYouWantToTalkTo, null, mailbox, mailboxPassword);
 Store store = session.getStore(urlName);

现在,如果我这样做,我会得到一个例外:

java.net.SocketException: Can't connect to SOCKS proxy:Connection timed out: connect. 

我的POP3服务器未记录任何连接,表明我的代码中存在代理问题或错误。我现在正在使用73.29.157.190:29099。

2)但是,如果我这样做

 Properties p = new Properties();
 //all the same logic and stuff
 Session = Session.getInstance(p, null);

我的POP3服务器从localhost记录连接,并且工作正常,表明我没有使用代理连接到它,其他一切都很好。

我的问题是,为什么“教程”使用System.getProperties()并将其传递给getInstance()?每个Session实例都将保留对System.properties的引用。因此,每次尝试创建新实例或以任何方式更改System.getProperties()时,每个Session实例都会受到影响,因此您可以重用相同的实例。

javamail是否需要专门在System.properties中设置的内容而不是传递给Session的内容?

另外,为了让javamail使用代理,您需要设置哪些参数? System.properties具有哪些功能,使其与我的新属性不同?一个很好的教程或文档的链接解释它将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,get rid of all the socket factory stuff,你不需要它。

接下来,确保您确实拥有SOCKS代理而不仅仅是Web代理。如果您这样做,请参阅this JavaMail FAQ entry

设置SOCKS代理的系统属性将导致程序中的所有网络连接通过代理服务器,这可能不是您想要的。