通过代理使用 Javamail

Use Javamail through a proxy

我有一个 Java 应用程序,它使用 Javamail (v.1.5.4) 向 POP/SMTP 邮件服务器发送和查看邮件。此应用程序必须 运行 在我们的公司网络中,我们有一个代理(f*ck!)阻止我的请求。我用谷歌搜索了可能的解决方案,Javamail 说我们可以使用 SOCKS5:

Q: How do I configure JavaMail to work through my proxy server? [updated!]

A: JavaMail does not currently support accessing mail servers through a web proxy server. One of the major reasons for using a proxy server is to allow HTTP requests from within a corporate network to pass through a corporate firewall. The firewall will typically block most access to the Internet, but will allow requests from the proxy server to pass through. In addition, a mail server inside the corporate network will perform a similar function for email, accepting messages via SMTP and forwarding them to their ultimate destination on the Internet, and accepting incoming messages and sending them to the appropriate internal mail server.

该解决方案对我无效,因此我必须寻找新的替代方案。有人说他们实现了自定义 SocketFactory,但我不确定这是否足够。有人试过吗?

另一个可能的解决方案是使用另一个库,但我没有找到任何可以避免此代理的方法。

有人治疗过这个问题吗?你是怎么解决的?

总结

问题: 我必须在 Java 应用程序中发送和阅读电子邮件,但我的代理阻止了请求。

我试过什么?使用javamail,我试过用SOCKS5解决,但是没有效果。

我在寻找什么? 避免此代理的方法。有人讲述了一个习俗 SocketFactory(但我不确定这是否有效)。我找不到 Javamail 的替代方法。

问候!!

虽然这不是程序化解决方案,但最简洁的方法是检查您的公司是否有内部邮件服务器并使用该服务器发送您的电子邮件。它不需要使用 SOCKS 或代理,只需配置。

一个很好的副作用可能是以您公司的名义发送的电子邮件也由您的公司发送。如果邮件管理员已正确设置 SPF records,它会大大降低您的电子邮件最终进入某人的垃圾邮件文件夹的风险。

使用您自己的邮件服务器通常是最好的解决方案,但如果您没有自己的邮件服务器,JavaMail FAQ describes other solutions, such as using Corkscrew or connect 可以通过您的 Web 代理服务器工作。

实际上JavaMail 确实支持 SOCKS 代理,只是没有经过身份验证的代理。

That solution is not valid for me

但是你没有解释为什么。

还有另一种使用 SOCKS 代理(甚至经过身份验证的代理)配置 Java 邮件的方法,它不涉及配置您自己的套接字工厂。有一个名为 Simple Java Mail 的开源库(完全公开:我维护它),使用起来非常简单:

new Mailer(
        new ServerConfig("smtp.host.com", 587, "user@host.com", "password"),
        TransportStrategy.SMTP_TLS,
        new ProxyConfig("socksproxy.host.com", 1080, "proxy user", "proxy password")
).sendMail(email);

但是,如果您的代理实际上是一个 HTTP 代理,那么您就不走运了,您需要求助于 Corkscrew or connect

根据最新版本的 Javamail API 1.6.2,JavaMail 支持通过 Web 代理服务器访问邮件服务器,并支持向代理服务器进行身份验证。在这里查看我的回答