Когда я пытаюсь подключиться к серверу обмена, у меня ошибка 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-вещи?
Спасибо за вашу помощь
Это мой код, который работает. Только при вызове 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;
}
}
Это хороший вопрос, но я нашел другой способ его решить!
Во-первых, вы должны импортировать 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();
}
}