5

サーバーからメールを読み取るために、 Microsoft ExchangeWebサービスのJavaAPI(バージョン1.2)をテストしています。これが私のコードです:

String url = "https://my-server/EWS/exchange.asmx";
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.setTraceEnabled(true);
service.setCredentials(new WebCredentials("user", "password"));
service.setUrl(url.toURI());

Mailbox mailbox = new Mailbox("foo@bar.com");
FolderId folder = new FolderId(WellKnownFolderName.Inbox, mailbox);
ItemView view = new ItemView(10);
view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending);
FindItemsResults<Item> items = service.findItems(folder, view);

残念ながら、このコードは次のエラーをスローします。

Exception in thread "main" microsoft.exchange.webservices.data.EWSHttpException: Connection not established
    at microsoft.exchange.webservices.data.HttpClientWebRequest.throwIfConnIsNull(Unknown Source)
    at microsoft.exchange.webservices.data.HttpClientWebRequest.getResponseCode(Unknown Source)
    at microsoft.exchange.webservices.data.EwsUtilities.formatHttpResponseHeaders(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeServiceBase.traceHttpResponseHeaders(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeServiceBase.processHttpResponseHeaders(Unknown Source)
    at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(Unknown Source)
    at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeService.findItems(Unknown Source)
    at microsoft.exchange.webservices.data.ExchangeService.findItems(Unknown Source)
    at foo.bar.TestMail.main(TestMail.java:52)

現在のコードの何が問題なのか理解できません。手がかりがありますか、または少なくともいくつかのテストを試してみてください。

Webサービス(https//my-server/exchange.asmx)は私のJavaコードにアクセスできることに注意してください。

それが役立つかどうかはわかりませんが、ログに表示されるトレースで次のことがわかりました。

<Trace Tag="EwsResponse" Tid="1" Time="2013-01-28 10:47:03Z">
<html><head><title>Error</title></head><body>The function requested is not supported
</body></html>
</Trace>

編集

別のテストを行いました。今回は、オブジェクトservice.setUseDefaultCredentials(true);を設定する代わりに、デフォルトのクレデンシャル(つまり、自分の電子メールアカウント)を使用しWebCredentialsます。接続はまだ確立されていませんが、別のエラーが発生します(トレースログの興味深い部分のみを取得しました)。

<h1>You are not authorized to view this page</h1>
You do not have permission to view this directory or page using the credentials that you supplied because your Web browser is sending a WWW-Authenticate header field that the Web server is not configured to accept.
(...)
<h2>HTTP Error 401.2 - Unauthorized: Access is denied due to server configuration.<br>Internet Information Services (IIS)</h2>

もちろん、Exchangeサーバー側では何にもアクセスしたり変更したりすることはできません。認証を成功させる方法はありますか?

4

3 に答える 3

1

この問題は、使用されている認証スキームが原因です。デフォルトでは、EWS は NTLM を使用しますが、私の Exchange サーバーはこの種類の認証を受け入れるように構成されていません。LDAP 認証を使用する必要があります。

于 2013-02-05T08:00:34.267 に答える
0

これは EWS JAVA api 1.2 の例です。これは、試すことができる方法の 1 つです。

package com.ea.connector.exchange;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import microsoft.exchange.webservices.data.BasePropertySet;
import microsoft.exchange.webservices.data.ExchangeCredentials;
import microsoft.exchange.webservices.data.ExchangeService;
import microsoft.exchange.webservices.data.FindItemsResults;
import microsoft.exchange.webservices.data.Item;
 import microsoft.exchange.webservices.data.ItemSchema;
import microsoft.exchange.webservices.data.ItemView;
import microsoft.exchange.webservices.data.LogicalOperator;
import microsoft.exchange.webservices.data.OffsetBasePoint;
import microsoft.exchange.webservices.data.PropertySet;
import microsoft.exchange.webservices.data.SearchFilter;
import microsoft.exchange.webservices.data.SortDirection;
import microsoft.exchange.webservices.data.WebCredentials;
import microsoft.exchange.webservices.data.WebProxy;
import microsoft.exchange.webservices.data.WellKnownFolderName;

import org.apache.commons.httpclient.NTCredentials;

import com.ea.connector.exchange.bean.ExchangeConnectionParamBean;
import com.ea.connector.exchange.util.ExchMessageProperties;
import com.ea.connector.net.ExchGetItemRequest;

public class Test {

protected static ArrayList<String> propertiesToFetch = new ArrayList<String>();

private static ExchangeService mService;

 // private Settings mSettings;
//  
//  private int imailCount;

private Date dStartDate;
private Date dEndDate;
private static ExchangeConnectionParamBean objParamBean;
public void setPropertiesToBeFetched(List<String> filter) {
    propertiesToFetch.addAll(filter);
}
public Date getConnectorStartDate() {
    return dStartDate;
}

public void setConnectorStartDate(Date dStartDate) {
    this.dStartDate = dStartDate;
}

public ExchangeConnectionParamBean getParamBean() {
    return objParamBean;
}

public void setParambean(ExchangeConnectionParamBean objParambean) {
    Test.objParamBean = objParambean;
}

public Date getConnectorEndDate() {
    return dEndDate;
}

public void setConnectorEndDate(Date dEndDate) {
    this.dEndDate = dEndDate;
}


    public static void main(String []args) throws URISyntaxException,Exception
    {
        setCredentialsAndGetExchRequest();
        System.out.println("conncection established");
    }

    protected static ExchGetItemRequest setCredentialsAndGetExchRequest() throws   URISyntaxException,Exception{

        @SuppressWarnings("unused")
        FindItemsResults<Item> resultMails;

        mService = new ExchangeService();
        mService.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
        WebProxy paramWebProxy=new WebProxy("ptbproxy.domain.com",8080);
        mService.setWebProxy(paramWebProxy);

        ExchangeCredentials cred = new WebCredentials("EA_Test_mailbox@domain.com","Zuxu0000");
        NTCredentials ntCredentials = new NTCredentials("EA_Test_mailbox@domain.com","Zuxu0000",                 "",
                "");
        mService.setCredentials(cred);
//          ProxyHost httpProxy=new ProxyHost("ptbproxy.domain.com",8080);
//          UsernamePasswordCredentials cred1=new     UsernamePasswordCredentials("EA_Test_mailbox@domain.com","Zuxu0000");

//          ExchGetItemRequest req = new ExchGetItemRequest(String.valueOf(new URI("http://outlook.office365.com/EWS/Exhanges.asmx")),ntCredentials);
        ExchGetItemRequest req = new ExchGetItemRequest("https://outlook.office365.com/EWS/Exhange.asmx",ntCredentials);

        SearchFilter filter = getSearchFilter();

        PropertySet propertySet = new PropertySet(BasePropertySet.IdOnly);
        ItemView itemView = new ItemView(1000, 0, OffsetBasePoint.Beginning);
        itemView.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending);
        itemView.setPropertySet(propertySet);

        //mService.setTimeout(500000);

        req.setProperties(new    ExchMessageProperties().getExchMessageProperties(propertiesToFetch));

              /*Fetching of  mail ids start here*/
                resultMails = getMails(filter, itemView);

                return req;
    }   

    protected static SearchFilter getSearchFilter() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
    Date d1 = sdf.parse("2014-11-04 00:00:00");
    Date d2 = sdf.parse("2014-11-05 00:00:00");


        SearchFilter greaterThanEq = new SearchFilter.IsGreaterThanOrEqualTo(
                ItemSchema.DateTimeReceived,sdf.format(d1));
        SearchFilter lessThan = new SearchFilter.IsLessThan(
                ItemSchema.DateTimeReceived, sdf.format(d2));
        SearchFilter mailFilter = new SearchFilter.IsEqualTo(
                ItemSchema.ItemClass, "IPM.Note");
      return new SearchFilter.SearchFilterCollection(LogicalOperator.And,
                greaterThanEq, lessThan, mailFilter);
    }
    private static FindItemsResults<Item> getMails(SearchFilter searchFilter,
            ItemView itemView) throws Exception {
        FindItemsResults<Item> items = null;

        int count = 0;

        int maxTries = 3;

        while (true) {
            try {
                items = mService.findItems(WellKnownFolderName.Inbox,
                        searchFilter, itemView);
                break;
            } catch (Exception e) {
                if (++count == maxTries)
                    throw e;
            }
        }

        return items;
    }

}

于 2014-11-20T06:33:34.570 に答える