java - 从 Java 发送 OWA 登录表单

标签 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 连接 - 但我似乎无法 POST 正确的 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 请求的 header 中发送所有有效的 cookie。您应该以编程方式执行相同的操作。您可以使用 URLConnection#setRequestProperty() 添加标题.

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

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

另见:


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

关于java - 从 Java 发送 OWA 登录表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3283785/

相关文章:

java - 使用双屏时显示 JFrame 在主显示器居中

c# - POST 表单数组没有成功

javascript - DOM 循环中的 HTML5 Canvas

javascript - indexOf 始终为 document.location 返回 true

java - 总是归零

java - 我是否需要在保证发生之前的对象上进行同步?

java - Jira Rest Java 客户端的 ClassNotDef 异常

PHP - 如何在表单提交后保留文本框数组的值?

php - 从 HTML 将文本区域写入 PHP 文件

javascript - 克隆节点真正只有一级