java. net .UnknownHostException при подключении к outlook.office365.com с использованием EWSJavaAPI - PullRequest
0 голосов
/ 21 апреля 2020

Недавно почтовый ящик моей организации был перенесен на office365, и он также перестал поддерживать SMTP / POP3 и протокол IMAP, поэтому вся моя автоматизация рассылки должна использовать EWS, а URL-адрес службы равен https://outlook.office365.com/ews/exchange.asmx.

Я ссылался на https://github.com/OfficeDev/ews-java-api/wiki/Getting-Started-Guide ссылку и пробовал как автообнаружение, так и ручной режим, но оба способа приводят к исключениям

Автообнаружение Исключение:

microsoft.exchange.webservices.data.autodiscover.exception.AutodiscoverLocalException: The Autodiscover service couldn't be located.
    at microsoft.exchange.webservices.data.autodiscover.AutodiscoverService.internalGetLegacyUserSettings(AutodiscoverService.java:742)
    at microsoft.exchange.webservices.data.autodiscover.AutodiscoverService.getLegacyUserSettings(AutodiscoverService.java:521)
    at microsoft.exchange.webservices.data.autodiscover.AutodiscoverService.internalGetLegacyUserSettings(AutodiscoverService.java:959)
    at microsoft.exchange.webservices.data.autodiscover.AutodiscoverService.getUserSettings(AutodiscoverService.java:1846)
    at microsoft.exchange.webservices.data.core.ExchangeService.getAutodiscoverUrl(ExchangeService.java:3615)
    at microsoft.exchange.webservices.data.core.ExchangeService.autodiscoverUrl(ExchangeService.java:3572)
    at com.ford.qa.utilities.MSExchangeEmailService.<clinit>(MSExchangeEmailService.java:42)
microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The Url property on the ExchangeService object must be set.
    at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:74)
    at microsoft.exchange.webservices.data.core.request.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:158)
    at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:504)
    at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:523)
    at microsoft.exchange.webservices.data.core.service.folder.Folder.bind(Folder.java:98)
    at microsoft.exchange.webservices.data.core.service.folder.Folder.bind(Folder.java:147)
    at com.ford.qa.utilities.MSExchangeEmailService.readEmails(MSExchangeEmailService.java:92)
    at com.ford.qa.utilities.MSExchangeEmailService.main(MSExchangeEmailService.java:178)
Caused by: microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException: The Url property on the ExchangeService object must be set.
    at microsoft.exchange.webservices.data.core.ExchangeService.validate(ExchangeService.java:3706)
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.validate(ServiceRequestBase.java:121)

Руководство:

microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. outlook.office365.com
    at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:74)
    at microsoft.exchange.webservices.data.core.request.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:158)
    at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:504)
    at microsoft.exchange.webservices.data.core.ExchangeService.bindToFolder(ExchangeService.java:523)
    at microsoft.exchange.webservices.data.core.service.folder.Folder.bind(Folder.java:98)
    at microsoft.exchange.webservices.data.core.service.folder.Folder.bind(Folder.java:147)
    at com.ford.qa.utilities.MSExchangeEmailService.readEmails(MSExchangeEmailService.java:86)
    at com.ford.qa.utilities.MSExchangeEmailService.main(MSExchangeEmailService.java:172)
Caused by: microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. outlook.office365.com
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.getEwsHttpWebResponse(ServiceRequestBase.java:729)
    at microsoft.exchange.webservices.data.core.request.ServiceRequestBase.validateAndEmitRequest(ServiceRequestBase.java:639)
    at microsoft.exchange.webservices.data.core.request.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:62)
    ... 7 more
Caused by: java.net.UnknownHostException: outlook.office365.com
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(Unknown Source)
    at java.net.InetAddress.getAddressesFromNameService(Unknown Source)

Вот мой код:

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl;
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.PropertySet;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.core.service.folder.Folder;
import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.AppointmentSchema;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.ItemId;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.ItemView;

public class MSExchangeEmailService {
    private static ExchangeService service;
    private static Integer NUMBER_EMAILS_FETCH = 5; // only latest 5 emails/appointments are fetched.
    /**
     * Firstly check, whether "https://webmail.xxxx.com/ews/Services.wsdl" and "https://webmail.xxxx.com/ews/Exchange.asmx"
     * is accessible, if yes that means the Exchange Webservice is enabled on your MS Exchange.
     */
    static {
        try {
            service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
           // service.setUrl(new java.net.URI("https://outlook.office365.com/ews/exchange.asmx"));
            service.autodiscoverUrl("username@xx.com", new RedirectionUrlCallback());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl {
        public boolean autodiscoverRedirectionUrlValidationCallback(
                String redirectionUrl) {
            return redirectionUrl.toLowerCase().startsWith("https://");
        }
    }
    /**
     * Initialize the Exchange Credentials.
     * Don't forget to replace the "USRNAME","PWD","DOMAIN_NAME" variables.
     */
    public MSExchangeEmailService() {
        ExchangeCredentials credentials = new WebCredentials("username@xx.xom", "<password>");
        service.setCredentials(credentials);
    }
    /**
     * Reading one email at a time. Using Item ID of the email.
     * Creating a message data map as a return value.
     */
    public Map readEmailItem(ItemId itemId) {
        Map messageData = new HashMap();
        try {
            Item itm = Item.bind(service, itemId, PropertySet.FirstClassProperties);
            EmailMessage emailMessage = EmailMessage.bind(service, itm.getId());
            messageData.put("emailItemId", emailMessage.getId().toString());
            messageData.put("subject", emailMessage.getSubject().toString());
            messageData.put("fromAddress", emailMessage.getFrom().getAddress().toString());
            messageData.put("senderName", emailMessage.getSender().getName().toString());
            Date dateTimeCreated = emailMessage.getDateTimeCreated();
            messageData.put("SendDate", dateTimeCreated.toString());
            Date dateTimeRecieved = emailMessage.getDateTimeReceived();
            messageData.put("RecievedDate", dateTimeRecieved.toString());
            messageData.put("Size", emailMessage.getSize() + "");
            messageData.put("emailBody", emailMessage.getBody().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return messageData;
    }
/**
 * Number of email we want to read is defined as NUMBER_EMAILS_FETCH, 
 */
    public List readEmails() {
        List msgDataList = new ArrayList();
        try {
            Folder folder = Folder.bind(service, WellKnownFolderName.Inbox);
            FindItemsResults<Item> results = service.findItems(folder.getId(), new ItemView(NUMBER_EMAILS_FETCH));
            int i = 1;
            for (Item item : results) {
                Map messageData = new HashMap();
                messageData = readEmailItem(item.getId());
                System.out.println("\nEmails #" + (i++) + ":");
                System.out.println("subject : " + messageData.get("subject").toString());
                System.out.println("Sender : " + messageData.get("senderName").toString());
                msgDataList.add(messageData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return msgDataList;
    }
    /**
     * Reading one appointment at a time. Using Appointment ID of the email.
     * Creating a message data map as a return value.
     */
    public Map readAppointment(Appointment appointment) {
        Map appointmentData = new HashMap();
        try {
            appointmentData.put("appointmentItemId", appointment.getId().toString());
            appointmentData.put("appointmentSubject", appointment.getSubject());
            appointmentData.put("appointmentStartTime", appointment.getStart() + "");
            appointmentData.put("appointmentEndTime", appointment.getEnd() + "");
            //appointmentData.put("appointmentBody", appointment.getBody().toString());
        } catch (ServiceLocalException e) {
            e.printStackTrace();
        }
        return appointmentData;
    }
    /**
     *Number of Appointments we want to read is defined as NUMBER_EMAILS_FETCH,
     *  Here I also considered the start data and end date which is a 30 day span.
     *  We need to set the CalendarView property depending upon the need of ours.   
     */
    public List readAppointments() {
        List  apntmtDataList = new ArrayList ();
        Calendar now = Calendar.getInstance();
        Date startDate = Calendar.getInstance().getTime();
        now.add(Calendar.DATE, 30);
        Date endDate = now.getTime();
        try {
            CalendarFolder calendarFolder = CalendarFolder.bind(service, WellKnownFolderName.Calendar, new PropertySet());
            CalendarView cView = new CalendarView(startDate, endDate, 5);
            cView.setPropertySet(new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End));// we can set other properties 
            // as well depending upon our need.
            FindItemsResults appointments = calendarFolder.findAppointments(cView);
            int i = 1;
            List<Appointment> appList = appointments.getItems();
            for (Appointment appointment : appList) {
                System.out.println("\nAPPOINTMENT #" + (i++) + ":");
                Map appointmentData = new HashMap();
                appointmentData = readAppointment(appointment);
                System.out.println("subject : " + appointmentData.get("appointmentSubject").toString());
                System.out.println("On : " + appointmentData.get("appointmentStartTime").toString());
                apntmtDataList.add(appointmentData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return apntmtDataList;
    }
    public void sendEmails(List<String> recipientsList) {
        try {
            StringBuilder strBldr = new StringBuilder();
            strBldr.append("The client submitted the SendAndSaveCopy request at:");
            strBldr.append(Calendar.getInstance().getTime().toString() + " .");
            strBldr.append("Thanks and Regards");
            strBldr.append("Karthik");
            EmailMessage message = new EmailMessage(service);
            message.setSubject("Test sending email");
            message.setBody(new MessageBody(strBldr.toString()));
            for (String string : recipientsList) {
                message.getToRecipients().add(string);
            }
            message.sendAndSaveCopy();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("message sent");
    }
    public static void main(String[] args) {
        MSExchangeEmailService msees = new MSExchangeEmailService();
        msees.readEmails();
        //msees.readAppointments();
       // List recipientsList = new ArrayList<>();
        //recipientsList.add("email.id3@domain2.com");
      //  msees.sendEmails(recipientsList);
    }
}

Может кто-нибудь, пожалуйста, помогите решить эту проблему.

...