使用Java EWS从MS Exchange读取电子邮件

使用Java EWS从MS Exchange读取电子邮件,java,exchangewebservices,Java,Exchangewebservices,我正在尝试创建一个简单的程序来读取公司MS Exchange收件箱中的电子邮件。 我编写了一个simle程序,如下所示,但它不起作用 有人能给我指点迷津吗? 我尝试了自动发现和URL模式 运行程序时,我看到以下输出: 111111111111111 Aug 08, 2014 12:37:12 AM org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme INFO: NTLM authentication

我正在尝试创建一个简单的程序来读取公司MS Exchange收件箱中的电子邮件。 我编写了一个simle程序,如下所示,但它不起作用

有人能给我指点迷津吗? 我尝试了自动发现和URL模式

运行程序时,我看到以下输出:

111111111111111 Aug 08, 2014 12:37:12 AM
org.apache.commons.httpclient.auth.AuthChallengeProcessor
selectAuthScheme INFO: NTLM authentication scheme selected Aug 08,
2014 12:37:12 AM org.apache.commons.httpclient.HttpMethodDirector
processWWWAuthChallenge INFO: Failure authenticating with NTLM <any
realm>@autodiscover.<cmpany>:443
该方案:

package com.experiment;

import microsoft.exchange.webservices.data.ExchangeCredentials;
import microsoft.exchange.webservices.data.ExchangeService;
import microsoft.exchange.webservices.data.ExchangeVersion;
import microsoft.exchange.webservices.data.FindItemsResults;
import microsoft.exchange.webservices.data.Item;
import microsoft.exchange.webservices.data.ItemView;
import microsoft.exchange.webservices.data.WebCredentials;
import microsoft.exchange.webservices.data.WellKnownFolderName;

public class MSOutlookIntg {
    private static final String EMAIL_ID = "myid@company.com";
    private static final String EMAIL_PWD = "mypwd";

    public static void main(String[] args) {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
        ExchangeCredentials credentials = new WebCredentials(EMAIL_ID, EMAIL_PWD);
        service.setCredentials(credentials);



        try {
            System.out.println("111111111111111");
            service.autodiscoverUrl(EMAIL_ID);
            //service.setUrl(new URI("https://<email-server>/EWS/Exchange.asmx"));
            service.setTraceEnabled(true);
            System.out.println("222222222222222");
            ItemView view = new ItemView(10);
            FindItemsResults<Item> findResults;

            findResults = service.findItems(WellKnownFolderName.Inbox, view);

            for(Item item : findResults.getItems())
            {
                item.load();
                System.out.println(item.getSubject());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
您应该将service.setTraceEnabled移到ExchangeService service=new ExchangeServiceExchangeVersion.Exchange2010_SP2之后的第一行。完整跟踪是成功调试问题的关键

顺便说一句,我必须自己实现一个跟踪侦听器。您是否将工作跟踪侦听器连接到服务?如果没有这一点,SetTraceeEnabled将不会有多大帮助

您尝试过EnableScpLookup吗

在我的例子中,将EnableSCPLookup设置为True从来都不是问题。它可能需要几毫秒,直到没有适当的SCP记录返回,但大部分时间它节省了我20秒!要在等待web服务器,请执行以下操作:https://autodiscover.company.com 由于https证书服务器等待客户端证书和客户端等待服务器答复而超时

此外,URL模式中出现了什么错误?这不可能是相同的,因为在绕过自动发现时不应出现自动发现错误

伊迪丝说,你应该检查你的电子邮件是否与你的UPN名称相同。我认为您的凭证必须包含UPN名称,而不是电子邮件?从Microsoft文档中还不完全清楚,因为Microsoft选择了UPN来匹配电子邮件地址