从Java发送OWA登录表单

时间:2010-07-19 18:14:36

标签: java forms dom outlook-web-app

我对从Java代码以编程方式登录OWA(Microsoft Outlook Web Access - 基于Web的电子邮件客户端)的方式感兴趣,并且只检索收件箱未读计数 - 我可以从收件箱Web中读取此数字页面的HTML源代码 - 但问题就在于 - 登录。

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

<form action="owaauth.dll" method="POST" name="logonForm" autocomplete="off"> 

由其中的按钮元素提交:

<input type="submit" class="btn" value="Log On" onclick="clkLgn()"> 

通过调查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+"&amp;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页面。

2 个答案:

答案 0 :(得分:3)

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

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

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

另见:


顺便说一句,您是否考虑过使用JavaMail之类的SMTP / IMAP API进行连接?

答案 1 :(得分:1)

为什么要通过表格? 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