Веб-службы Exchange (EWS) Java Api: 401 не авторизованы

2

Когда я пытаюсь подключиться к серверу обмена, у меня ошибка 401:

 microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. The remote server returned an error: (401)Unauthorized

Я тестировал https://ewseditor.codeplex.com/ (с тем же именем пользователя, userPw, доменом и URL-адресом), и он отлично работает.

Это мой фактический код:

public static void main( String[] args )
{
    try {
        CustomExchangeService service = new CustomExchangeService(version);
        ExchangeCredentials credentials = new WebCredentials(userId, userPw,domain);
        service.setUrl(new URI(url));
        service.setCredentials(credentials);
        service.setTraceEnabled(true);
        Folder.bind( getInstance().service, WellKnownFolderName.Inbox, PropertySet.IdOnly );

    } catch (Exception e) {
        e.printStackTrace();
    }
}

И класс CustomExchangeService, который этот метод:

protected Registry<ConnectionSocketFactory>     createConnectionSocketFactoryRegistry() {
    try {
        return RegistryBuilder.<ConnectionSocketFactory>create()
            .register(EWSConstants.HTTP_SCHEME, new PlainConnectionSocketFactory())
            .register(EWSConstants.HTTPS_SCHEME, EwsSSLProtocolSocketFactory.build(
                null, NoopHostnameVerifier.INSTANCE
          ))
          .build();
    } catch (GeneralSecurityException e) {
      throw new RuntimeException(
          "Could not initialize ConnectionSocketFactory instances for HttpClientConnectionManager", e
      );
    }
}

Почему у меня такая ошибка? Может быть, из-за SSL-вещи?

Спасибо за вашу помощь

  • 0
    Ошибка с учетными данными, если это был SSL, вы получите другую ошибку. Проверьте свой формат учетных данных, который вы можете попробовать, просто используя UPN в качестве имени пользователя, тогда вам нужно только имя пользователя, пароль для учетных данных
  • 0
    Решено: На сервере откройте диспетчер служб IIS. Разверните слева, чтобы найти EWS. Нажмите на Аутентификацию и активируйте все линии с 401.
Теги:
exchange-server
exchangewebservices

2 ответа

0

Это мой код, который работает. Только при вызове EWS происходит вход в систему. Поскольку я писал emailValidService для Exchange. У меня такая же ошибка, я пробовал много часов и вижу, где проблема. Я использовал subscribeToPullNotifications() funtion, поскольку он вызывает EWS.

Эта часть, если код не работает, если я не назову this.pullEmailNotifications().

public  Boolean checkEmailValid(String username, String password, String uri, String  service_name) {
    ExchangeVersion en = ExchangeVersion.valueOf(service_name);
    logger.info("******checkEmailValid service  ************:  "  +en);
    ExchangeService service = new ExchangeService( en);
    ExchangeCredentials credentials = new WebCredentials(username,password); 
    service.setCredentials(credentials);
    logger.info("*** checkEmailValid USERNAME : " + username);
    logger.info("**** checkEmailValid PASSWORD : " + password);

    try {
        service.setUrl(new URI(uri));
        service.validate();
        return this.pullEmailNotifications(service);
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        logger.error("login failed : " + e1.getLocalizedMessage());
        e1.printStackTrace();
        return false;
    }
}



     @SuppressWarnings({ "unchecked", "rawtypes" })
    public  boolean pullEmailNotifications(ExchangeService service) throws 
     Exception {
     try {
          logger.info("pullEmailNotifications");
          List folder = new ArrayList();        


     folder.add(FolderId.getFolderIdFromWellKnownFolderName 
     (WellKnownFolderName.Inbox));
    logger.info("folder creatd : " + folder.size());
    PullSubscription subscription = service.
            subscribeToPullNotifications(folder, 5, null, EventType.Created/* , EventType.Created, EventType.Deleted */);
    logger.info("Adding pull subscription");
    GetEventsResults events = subscription.getEvents();
    for (ItemEvent itemEvent : events.getItemEvents()) {
        logger.info("Event recieved");
        // if (itemEvent.getEventType()== EventType.NewMail) {
        logger.info("New Mail");
        EmailMessage message = EmailMessage.bind(service, itemEvent.getItemId());
        logger.info("Adding message " + message);

    }
    logger.info("Adding pull events" + events);

    return true; 
    }catch(Exception e) {
        logger.error("pull notification failed : " + e.getLocalizedMessage());

        e.printStackTrace();
        return false;
    }
}
0

Это хороший вопрос, но я нашел другой способ его решить!

Во-первых, вы должны импортировать jar ews-java-api-2.0.jar. если вы используете maven, вы бы добавили следующий код в свой pom.xml

<dependency>
  <groupId>com.microsoft.ews-java-api</groupId>
  <artifactId>ews-java-api</artifactId>
  <version>2.0</version>
</dependency>

Во-вторых, вы должны MailUtil.java новый класс java с именем MailUtil.java Некоторые серверы Exchange не запускают службу SMTP по умолчанию, поэтому мы используем Microsoft Exchange WebServices(EWS) вместо службы SMTP.

MailUtil.java

package com.spacex.util;


import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;

/**
 * Exchange send email util
 *
 * @author vino.dang
 * @create 2017/01/08
 */
public class MailUtil {

    private static Logger logger = LoggerFactory.getLogger(MailUtil.class);



    /**
     * send emial
     * @return
     */
    public static boolean sendEmail() {

        Boolean flag = false;
        try {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); // your server version
            ExchangeCredentials credentials = new WebCredentials("vino", "abcd123", "spacex"); // change them to your email username, password, email domain
            service.setCredentials(credentials);
            service.setUrl(new URI("https://outlook.spacex.com/EWS/Exchange.asmx")); //outlook.spacex.com change it to your email server address
            EmailMessage msg = new EmailMessage(service);
            msg.setSubject("This is a test!!!"); //email subject
            msg.setBody(MessageBody.getMessageBodyFromText("This is a test!!! pls ignore it!")); //email body
            msg.getToRecipients().add("[email protected]"); //email receiver
//        msg.getCcRecipients().add("[email protected]"); // email cc recipients
//        msg.getAttachments().addFileAttachment("D:\\Downloads\\EWSJavaAPI_1.2\\EWSJavaAPI_1.2\\Getting started with EWS Java API.RTF"); // email attachment
            msg.send(); //send email
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;

    }


    public static void main(String[] args) {

        sendEmail();

    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню