Javamail 使用局部代理

昨天分享了Javamail如何配置icloud邮箱拉取邮件,目前线上job运行良好。传送门 Javamail接收icloud邮件

在昨天的代码里我们的工具类使用了全局代理:

//设置代理(全局代理,system级别)
props.setProperty("proxySet", "true");
props.setProperty("socksProxyHost", socksProxyHost);
props.setProperty("socksProxyPort", socksProxyPort);

设置此代理,将影响Java程序整个进程,使得其他网络请求也会强制走此代理。在我的应用程序中,还调用了公司内部其他服务比如发送邮件,这些本可以走内网的请求也会使用代理通道无端饶了一大圈,既影响了性能也对代理产生一定负担。为此我开始研究如何使用局部代理。

在Javamail的api描述中,我看到了有关代理的一些介绍:如何配置JavaMail以通过我的代理服务器工作?

如果你的代理服务器支持SOCKS V4或V5协议,并允许匿名连接,而你正在使用JDK 1.5或更高版本,JavaMail 1.4 .5或更新的版本,您可以通过设置 javadoc中所述的 “mail.smtp.socks.host” 属性,以每个会话,每个协议为基础配置SOCKS代理 。“imap”和“pop3”协议存在类似的特性。

如果您使用的是较旧版本的JDK或JavaMail,则可以通知Java运行时将所有TCP套接字连接指向SOCKS服务器。请参阅 网络属性指南 ,以获取有关 socksProxyHostsocksProxyPort 属性的最新文档。这些是系统级属性,而不是JavaMail会话属性。该工具可用于将SMTP,IMAP和POP3通信从JavaMail指向SOCKS代理服务器。请注意,设置这些属性会将 TCP套接字指向SOCKS代理,这可能会对应用程序的其他方面产生负面影响

于是我将代码改造(先将 javamail 包升级至1.4.5或以上,我用的1.4.7):

//屏蔽全局代理
//props.setProperty("proxySet", "true");
//props.setProperty("socksProxyHost", socksProxyHost);
//props.setProperty("socksProxyPort", socksProxyPort);

//设置局部代理(imap同理)
props.setProperty("mail.pop3.socks.host", socksProxyHost);
props.setProperty("mail.pop3.socks.port", socksProxyPort);

为了验证代理是否有效,我故意将mail 方法中的port 端口改成一个错误的8888

public static void main(String[] args) {
        String protocol = "pop3";
        String host = "pop.163.com";
        String username = "zhaoyuan7845@163.com";
        String password = "xxxx";
        String deleteFlag = "false";
        String socksProxyHost = "xxxx";
        String socksProxyPort = "8888";

        List<EmailEntity> list = ReceiveEmailTool.getEmailList(protocol, username, password, host, deleteFlag, socksProxyHost, socksProxyPort);
        for(EmailEntity en:list){
            System.out.println("主题:" + en.getSubject());
        }
    }

运行程序,发现成功读取到邮件,这说明代理并未生效!!!

主题:回复:ergou
主题:测试mail
主题:Re: 测试mail
主题:Re: 测试mail
主题:Re: 测试mail

为什么呢?明明版本已经升级了,也按照官方的api配置的,但是却不生效。接着继续查找资料,大约花费了几个小时,直到晚饭回来,无意中想起还有几个重要的参数被我忽视了:

props.setProperty("mail.pop3.socketFactory.port", "995");
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);

文档中的介绍是:

mail.pop3.socketFactory.port:指定在使用指定的套接字工厂时要连接的端口。如果未设置,则将使用默认端口。

mail.pop3.socketFactory.fallback:如果设置为true,则无法使用指定的套接字工厂类创建套接字将导致使用java.net.Socket类创建套接字。默认为true。

mail.pop3.socketFactory.class:如果设置,则指定实现javax.net.SocketFactory接口的类的名称。这个类将被用来创建POP3套接字。

似懂非懂的试着将这三行代码屏蔽,果然控制台输出连接失败,于是将端口号改成正确的1080,成功拉取。这也意味着使用局部代理成功了。

按照我的猜测,虽然配置了局部代理,但是由于配置了上述三行代码,jvm默认将使用指定的套接字工厂类创建jvm级别的套接字,因此覆盖了局部代理的范围,导致局部代理虽然端口号改错,也不影响全局代理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,808评论 6 342
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,966评论 6 13
  • 要入手账的坑,其他不说,总得先买几个本子吧。因为楼主是一个典型的三分钟热度girl,在爱好这件事上,极易喜新厌旧,...
    小鹿手账_ing阅读 598评论 0 8
  • 16年10月份,为了不浪费自己买的铅笔,我报名了彩铅学习的课程,然后,开始入坑: 一开始用的是自己的素描本,铅笔是...
    Cola猫咪阅读 549评论 0 12