【问题标题】:How to read emails from outlook [closed]如何从 Outlook 阅读电子邮件 [关闭]
【发布时间】:2011-08-18 08:13:38
【问题描述】:

最近我开始使用 javamail API 检索交换服务器上的电子邮件。但是,有时我无法获取任何邮件,因为 Outlook 客户端与邮件服务器同步,因此这些电子邮件已从服务器中删除。 有什么方法可以确保我可以在 Outlook 同步之前或之后获取所有新电子邮件。或者我应该尝试连接到 Outlook,如果是,是否有可用的免费 API?谢谢你。

【问题讨论】:

    标签: api outlook exchange-server jakarta-mail


    【解决方案1】:

    是否可以配置 Outlook 以在服务器上留下邮件副本?我真的不认为连接到前景是要走的路。

    【讨论】:

    • 感谢您的回复,每天都会收到大量带有大附件的邮件,恐怕会成为服务器的挑战。
    • 怎么样:如果你在outlook中配置了一个邮件规则将邮件移动到不同的文件夹(但保留在服务器上),你可以处理该文件夹中的所有邮件并从服务器中删除它们处理后?
    • @Pleun,你的意思是 Outlook 文件夹?如何读取 Outlook 收件箱文件夹?
    【解决方案2】:

    我有从 Outlook 阅读电子邮件的解决方案。 我们需要提供用户名、密码、域名和交换地址:https://webmail.**companynameXYZ**.com/ews/exchange.asmx

    以下是代码...。我出于某种目的使用它,从未读邮件中下载附件,并在下载后将其设为已读。 注意:我们需要下载 DLL Microsoft.Exchange.WebServices.dll

    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 团队创建了 EWS-Java-Api(一种 java 实现)作为 Microsoft.Exchange.WebServices.dll 的替代方案,用于 C# 实现,而且不错的是其开源:

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

      【讨论】:

        【解决方案4】:

        JAVA代码:

        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);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 2018-07-08
          • 1970-01-01
          • 2017-09-05
          • 1970-01-01
          • 1970-01-01
          • 2013-02-23
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多