我试图通过代理从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具有哪些功能,使其与我的新属性不同?一个很好的教程或文档的链接解释它将非常感激。
谢谢!
答案 0 :(得分:0)
首先,get rid of all the socket factory stuff,你不需要它。
接下来,确保您确实拥有SOCKS代理而不仅仅是Web代理。如果您这样做,请参阅this JavaMail FAQ entry。
设置SOCKS代理的系统属性将导致程序中的所有网络连接通过代理服务器,这可能不是您想要的。