从Java发送OWA登录表单

我感兴趣的是一种从Java代码以编程方式登录OWA(Microsoft Outlook Web Access – 基于Web的电子邮件客户端)并检索收件箱未读计数的方法 – 我可以从收件箱网页的HTML源中读取此数字 – 但问题是到了那里 – 登录。

从本质上讲,通过查看OWA登录页面的HTML源代码,我可以看到有一个HTML表单元素:

由其中的按钮元素提交:

  

从调查clkLgn()脚本,我发现它向文档发送一个cookie,因此它可能不是至关重要的:

 function clkLgn() { if(gbid("rdoPrvt").checked) { var oD=new Date(); oD.setTime(oD.getTime()+2*7*24*60*60*1000); var sA="acc="+(gbid("chkBsc").checked?1:0); var sL="lgn="+gbid("username").value; document.cookie="logondata="+sA+"&"+sL+";expires="+oD.toUTCString(); } } 

基本上,我该如何发送此表格? 以下代码是我对此问题的尝试,我可以建立HTTP连接 – 但我似乎无法发出正确的HTTP请求。

  URL urlObject = new URL(url); HttpURLConnection hConnection = (HttpURLConnection)urlObject.openConnection(); HttpURLConnection.setFollowRedirects(true); hConnection.setDoOutput(true); hConnection.setRequestMethod("POST"); PrintStream ps = new PrintStream(hConnection.getOutputStream()); ps.print("username="+username+"&password="+password); ps.close(); hConnection.connect(); if( HttpURLConnection.HTTP_OK == hConnection.getResponseCode() ) { InputStream is = hConnection.getInputStream(); OutputStream os = new FileOutputStream("output.html"); int data; while((data=is.read()) != -1) { os.write(data); } is.close(); os.close(); hConnection.disconnect(); } 

它只是返回相同的登录HTML页面。

JavaScript确实很重要:它为文档添加了一个cookie。 一个体面的HTTP客户端需要在每个HTTP请求的头上发送所有有效的cookie。 您应该以编程方式执行相同操作。 您可以使用URLConnection#setRequestProperty()添加标头。

此外,在以编程方式提交表单时还需要考虑以下几点:您不应跳过任何隐藏的输入字段( input type="hidden" ),这些字段可能具有相关性。 您还应该将您要按编程方式按下的提交按钮的name=value对作为请求参数发送。 最后,你不应该使用& 连接参数对,但&

请注意,我不保证它最终会起作用,OWA可能会对机器人进行其他一些预防,但它应该解决迄今为止发现的问题。

也可以看看:

  • 如何使用URLConnection?

顺便说一句,您是否考虑过使用像JavaMail这样的SMTP / IMAP API连接它?

为什么要通过表格? MS最近为他们的Exchange服务器API开源了一个Java客户端。

http://blogs.office.com/2014/08/28/open-sourcing-exchange-web-services-ews-java-api/

https://github.com/OfficeDev/ews-java-api