How to read emails from outlook [closed]

假装没事ソ 提交于 2019-12-08 10:00:32

问题


recently I started a task to retrieve the emails on the exchange server using javamail API. However, sometimes I can not fetch any mails because outlook client synchronises with the mail server and those emails are therefore removed from the server. Is there any way to ensure that I can fetch all new emails no matter before or after outlook synchronization. Or I should try to connect to outlook, if so, is there any available free API? Thank you.


回答1:


Isn't is possible to configure outlook to leave a copy of the messages on the server? I really do not think connection to outlook is the way to go.




回答2:


I have the solution to read emails from outlook. We need to give username, password, domain and exchange address: https://webmail.**companynameXYZ**.com/ews/exchange.asmx.

following is the code .... I have used this from some purpose, to download attachments from undread mails and making it as read after downloading. NOTE: we need DLL Microsoft.Exchange.WebServices.dll to be downloaded

CODE in C#:

string _username = string.Empty;
            string _password = string.Empty;
            string _domain = "us";
            string _exchange = string.Empty;

            _username = ConfigurationSettings.AppSettings["Username"].ToString();
            _password = ConfigurationSettings.AppSettings["Pasword"].ToString();
            _exchange = ConfigurationSettings.AppSettings["MailServer"].ToString();

            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
            // service.AutodiscoverUrl("maxdatafeeds@maritz.com");            
            service.Url = new Uri(_exchange);
            service.Credentials = new WebCredentials(_username, _password, _domain);

            FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, new ItemView(10));
            int attachmentCount = 0;
            foreach (Item item in findResults.Items)
            {
                // Bind to an existing message item, requesting its Id property plus its attachments collection.
                EmailMessage message = EmailMessage.Bind(service, item.Id);

                //read only unread mails and has attachemnts to it.
                if ((!message.IsRead) && message.HasAttachments )
                {                  
                    Console.WriteLine(item.Subject);

                    #region  Iterate through the attachments collection and load each attachment.
                    foreach (Microsoft.Exchange.WebServices.Data.Attachment attachment in message.Attachments)
                    {    
                        if (attachment is FileAttachment)
                        {
                            FileAttachment fileAttachment = attachment as FileAttachment;
                            attachmentCount++;
                            // Load the file attachment into memory and print out its file name.
                            fileAttachment.Load();
                            Console.WriteLine("Attachment name: " + fileAttachment.Name);

                            //create Attachments-folder if not exists.
                            if (!Directory.Exists(@"C:\Attachments\"))
                            {
                                Directory.CreateDirectory(@"C:\Attachments\");
                            }
                            // Load attachment contents into a file.
                            fileAttachment.Load("C:\\attachments\\" + fileAttachment.Name);

                        }
                        else // Attachment is an item attachment.
                        {
                            // Load attachment into memory and write out the subject.
                            ItemAttachment itemAttachment = attachment as ItemAttachment;
                            itemAttachment.Load();
                            Console.WriteLine("Subject: " + itemAttachment.Item.Subject);
                        }

                    }//for inner
                    #endregion

                    //mark as READ
                    message.IsRead = true;
                    message.Update(ConflictResolutionMode.AlwaysOverwrite);
                    Console.WriteLine("------------------------");
                }//if



            }//for outer



回答3:


Microsoft team has created EWS-Java-Api (a java implementation) as an alternative to Microsoft.Exchange.WebServices.dll for C# implementation, and nice thing is its open sourced:

Link: https://github.com/OfficeDev/ews-java-api/wiki




回答4:


JAVA Code:

package EWSGetDetailsOffice365;

import java.text.SimpleDateFormat;
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 java.util.logging.Level;
import java.util.logging.Logger;

import microsoft.exchange.webservices.data.Appointment;
import microsoft.exchange.webservices.data.AppointmentSchema;
import microsoft.exchange.webservices.data.CalendarFolder;
import microsoft.exchange.webservices.data.CalendarView;
import microsoft.exchange.webservices.data.EmailMessage;
import microsoft.exchange.webservices.data.ExchangeService;
import microsoft.exchange.webservices.data.ExchangeVersion;
import microsoft.exchange.webservices.data.FindItemsResults;
import microsoft.exchange.webservices.data.Folder;
import microsoft.exchange.webservices.data.IAutodiscoverRedirectionUrl;
import microsoft.exchange.webservices.data.Item;
import microsoft.exchange.webservices.data.ItemId;
import microsoft.exchange.webservices.data.ItemSchema;
import microsoft.exchange.webservices.data.ItemView;
import microsoft.exchange.webservices.data.PropertySet;
import microsoft.exchange.webservices.data.SearchFilter;
import microsoft.exchange.webservices.data.ServiceLocalException;
import microsoft.exchange.webservices.data.WebCredentials;
import microsoft.exchange.webservices.data.WellKnownFolderName;

public class MSExchangeEmailService {

    public static class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl {
        public boolean autodiscoverRedirectionUrlValidationCallback(String redirectionUrl) {
          return redirectionUrl.toLowerCase().startsWith("https://");
        }
    }

    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 URI("https://webmail.xxxx.com/ews/Exchange.asmx"));


        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * Initialize the Exchange Credentials. 
     * Don't forget to replace the "USRNAME","PWD","DOMAIN_NAME" variables. 
     */
    public MSExchangeEmailService() {
        service.setCredentials(new WebCredentials("abc@domain.com", "1234"));
        try {
            service.autodiscoverUrl("dhananjayk@sysmind.com", new RedirectionUrlCallback());
        } catch (Exception ex) {
            Logger.getLogger(MSExchangeEmailService.class.getName()).log(Level.SEVERE, null, ex);
        }
        service.setTraceEnabled(true);
    }
    /**
     * 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);
            FindItemsResults<Appointment> appointments = calendarFolder.findAppointments(cView);
            System.out.println("|------------------> Appointment count = " + appointments.getTotalCount());
            int i =1;
            //List appList = appointments.getItems();
            for (Appointment appointment : appointments.getItems()) {
                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 static void getAllMeetings() throws Exception {

     try {

      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");      
      Date startDate = formatter.parse("2016-01-01 00:00:00");

      SearchFilter filter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.LastModifiedTime,startDate);

      FindItemsResults<Item> findResults = service.findItems(WellKnownFolderName.Calendar, filter, new ItemView(1000));
      System.out.println("|------------------> meetings count = " + findResults.getTotalCount());

      for (Item item : findResults.getItems())
      {
          Appointment appt = (Appointment)item;
          //appt.setStartTimeZone();
          System.out.println("TimeZone====="+appt.getTimeZone());
          System.out.println("SUBJECT====="+appt.getSubject());
          System.out.println("Location========"+appt.getLocation());
          System.out.println("Start Time========"+appt.getStart());
          System.out.println("End Time========"+appt.getEnd());
          System.out.println("Email Address========"+ appt.getOrganizer().getAddress());
          System.out.println("Last Modified Time========"+appt.getLastModifiedTime());
          System.out.println("Last Modified Time========"+appt.getLastModifiedName());
          System.out.println("*************************************************\n");
      } 
     } catch (Exception exp) {
         exp.printStackTrace();
     }
    }

    public static void main(String[] args) {
        MSExchangeEmailService msees = new MSExchangeEmailService();
        //msees.readEmails();
        //msees.readAppointments();
        try {
            msees.getAllMeetings();
        } catch (Exception ex) {
            Logger.getLogger(MSExchangeEmailService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}


来源:https://stackoverflow.com/questions/5880551/how-to-read-emails-from-outlook

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!