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 属性值?

如何在没有 SMTP 的情况下从 PHPMAILER 发送电子邮件

java Mail如何发送邮件

如何在 OS X 上全局设置 java 系统属性?

在没有 Class.forName() 或系统属性的情况下如何加载 JDBC 驱动程序? [复制]