从Java发送OWA登录表单

从Java发送OWA登录表单,java,forms,dom,outlook-web-app,Java,Forms,Dom,Outlook Web App,我对一种从Java代码以编程方式登录OWA(Microsoft Outlook Web Access-一种基于Web的电子邮件客户端)的方法感兴趣,它只检索收件箱未读计数——我可以从收件箱网页的HTML源中读取该数字——但问题是如何登录 本质上,从OWA登录页面的HTML源代码中,我可以看到有一个HTML表单元素: <form action="owaauth.dll" method="POST" name="logonForm" autocomplete="off"> 基本上,我

我对一种从Java代码以编程方式登录OWA(Microsoft Outlook Web Access-一种基于Web的电子邮件客户端)的方法感兴趣,它只检索收件箱未读计数——我可以从收件箱网页的HTML源中读取该数字——但问题是如何登录

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

<form action="owaauth.dll" method="POST" name="logonForm" autocomplete="off"> 
基本上,我如何发送此表单? 下面的代码是我试图解决这个问题的代码,我可以建立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页面。

JavaScript确实做了一件重要的事情:它向文档中添加cookie。在每个HTTP请求上,需要一个体面的HTTP客户端沿头发送所有有效的cookie。您应该以编程方式执行相同的操作。您可以使用添加标题

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

请注意,我不能保证它最终会起作用,OWA东西可能会有其他一些防止机器人的措施,但它应该可以解决目前发现的问题

另见:


顺便问一下,您是否考虑过只使用SMTP/IMAP API将其连接起来?

JavaScript确实做了一件重要的事情:它向文档添加cookie。在每个HTTP请求上,需要一个体面的HTTP客户端沿头发送所有有效的cookie。您应该以编程方式执行相同的操作。您可以使用添加标题

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

请注意,我不能保证它最终会起作用,OWA东西可能会有其他一些防止机器人的措施,但它应该可以解决目前发现的问题

另见:


顺便问一下,您是否考虑过只使用SMTP/IMAP API连接它,比如?

为什么要使用表单?MS最近为其Exchange server API开放了一个Java客户端


为什么要填写表格?MS最近为其Exchange server API开放了一个Java客户端


OWA和Sharepoint都喜欢使用隐藏字段作为“安全性”。为浏览器抓取一个工具栏,该工具栏将显示表单字段,并发布所有字段及其值的列表。清除Cookie,刷新页面,然后再次发布该信息以查看更改。OWA和Sharepoint都喜欢使用隐藏字段作为“安全性”。为浏览器抓取一个工具栏,该工具栏将显示表单字段,并发布所有字段及其值的列表。清除cookies,刷新页面,然后再次发布该信息以查看更改。良好的链接!那么,如何在输入按钮上触发onClick()事件呢?发送POST HTTP请求是否会隐式触发事件?不,不需要对HTML页面或JS代码执行任何操作。您只需发送服务器端所期望的参数和cookie即可。良好的链接!那么,如何在输入按钮上触发onClick()事件呢?发送POST HTTP请求是否会隐式触发事件?不,不需要对HTML页面或JS代码执行任何操作。您只需发送服务器端期望的参数和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();
    }
}
                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();
                }