Java Mail:如何在没有全局系统属性的情况下使用 SOCKS 进行 IMAP 处理?
Posted
技术标签:
【中文标题】Java Mail:如何在没有全局系统属性的情况下使用 SOCKS 进行 IMAP 处理?【英文标题】:Java Mail: How to use SOCKS for IMAP processing without global sytem properties? 【发布时间】:2011-11-08 08:10:00 【问题描述】:我有这个问题中描述的问题 JavaMail: How to use different SOCKS5 for different threads?
..但是这个问题没有真正的答案:-(
此外,我想从 imap(s) 文件夹中检索邮件,但我不知道如何告诉 javaMail 在不通过全局系统属性设置的情况下使用 socks 代理。 (sockProxyHost 等等...) 如果我这样做,并行数据库请求也想使用 socks 代理,但它们不应该(无法通过 socks 代理访问 db)
非常感谢任何提示。 汉斯
【问题讨论】:
有什么提示吗?系统道具的副本没有帮助:-(除了操作 javaMail.jar 还有其他方法吗? 【参考方案1】:我和同事一起解决了
要使用 socks 代理,您必须执行以下操作..
在 mail.jar 中,您可以找到 SocketFetcher 类。在此类中,检查是否通过系统属性设置了会话工厂对象或类名。我实现了我自己的从 SSLSocketFactory 复制的 SocketFactory,我必须在 javaMail 中操作 SocketFetcher,我替换了类文件以从我自己的 SocketFactory 调用 createSocket(host, port) 方法。在那里我使用了代理来
String proxyHost = System.getProperty(SYSTEM_PROP_SOCKS_PROXY_HOST);
int proxyPort = Integer.parseInt(System.getProperty(SYSTEM_PROP_SOCKS_PROXY_PORT));
SocketAddress addr = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
socket = new Socket(proxy);
另外我必须操作 SocketFetcher.createSocket() ...
socket.connect(new InetSocketAddress(host, port));
...您必须检查套接字是否已连接,否则将引发异常并使用不属于您的默认 socketFactory
祝你好运:-)
【讨论】:
你能分享固定的JavaMail版本吗?你还需要设置系统属性吗?以上是关于Java Mail:如何在没有全局系统属性的情况下使用 SOCKS 进行 IMAP 处理?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 DLL 的情况下创建全局 WH_GETMESSAGE HOOK
在没有 Owasp 库的情况下,如何在 Java 中转义 HTML 属性值?