2013-05-04 2 views
4

Я видел разницу между pst и ost-файлами и в настоящее время работает над обращением к Outlook-файлу pst через следующий код, приведенный ниже. Можно ли использовать один и тот же код для доступа к ost-файлу? Может кто-то мне на это поправить?Доступ к Outlook ost-файлу

private DataTable GetInboxItems() 
{ 
    DataTable inboxTable; 
    //try 
    //{ 
    filter = "[ReceivedTime] >= '" + dtpStartDate.Value.ToString("dd/MM/yyyy 12:00 AM") + "' and [ReceivedTime] <= '" + dtpEndDate.Value.ToString("dd/MM/yyyy 11:59 PM") + "'"; 
    Outlook.Application outlookApp = GetApplicationObject(); 
    Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder; 
    EnumerateFolders(root); 
    //string filter = "[ReceivedTime] > '" + dtpStartDate.Value.ToString("dd/MM/yyyy") + "'"; 

    //inbox 
    Outlook.MAPIFolder inboxFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
    inboxTable = CreateTable(); 
    int count = 0; 


    if (inboxFolder.Items.Count > 0) 
    { 

     var restrictedItems = inboxFolder.Items.Restrict(filter); 
     restrictedItems.Sort("[ReceivedTime]", true); //descending 
     //foreach (var item in inboxFolder.Items) 
     foreach (var item in restrictedItems) 
     { 
      var mail = item as Outlook.MailItem; 
      if (mail != null) 
      { 
       //try 
       //{ 
       DataRow row = inboxTable.NewRow(); 
       //row["sn"] = (++count).ToString(); 
       row["sn"] = mail.EntryID + " " + mail.ReceivedByEntryID; 
       row["MailType"] = "Inbox"; 
       row["SenderName"] = mail.SenderName; 
       row["SenderEmail"] = mail.SenderEmailAddress; 
       row["ReceivedDate"] = mail.ReceivedTime; 
       row["Subject"] = mail.Subject; 
       row["Body"] = mail.Body != null ? (mail.Body.Length > 25 ? mail.Body.Substring(0, 25) : mail.Body) : null; 
       //row["Body"] = mail.Body != null ? mail.Body : ""; 
       row["MailSize"] = mail.Size.ToString(); 
       string attachments = null; 
       if (mail.Attachments.Count > 0) 
       { 
        foreach (var attachment in mail.Attachments) 
        { 
         if (((Outlook.Attachment)attachment) != null) 
          //attachments = ((Outlook.Attachment)attachment).FileName + " " + ((Outlook.Attachment)attachment).Size.ToString() + ", "; 
          attachments += (((Outlook.Attachment)attachment).Size/1024).ToString() + " KB, "; 
        } 
       } 


       row["AttachmentCount"] = mail.Attachments.Count; 
       if (attachments != null) 
        row["AttachmentSize"] = attachments.Substring(0, attachments.Length - 2); 

       inboxTable.Rows.Add(row); 
      } 
      //catch (Exception ex) 
      //{ 

      // return null; 
      //} 

     } 
    } 

    return inboxTable; 
} 
+1

Этот код работает с объектом магазина, он не заботится, если магазин PST, ОСТ или онлайн обмен без оффлайн файл. У вас были проблемы с этим кодом? Возможно, он требует учетных данных ... – Arthur

+0

Спасибо Артур ... Как я могу получить доступ к файлу OST? не могли бы вы продемонстрировать с примером кода, в какой момент необходимы учетные данные? И какое преимущество делает этот файл OST над файлом PST? – newbie

+0

OST создается при использовании кэшированного режима в типе учетной записи Exchange, вы не можете его контролировать. PST используется для хранения почтовых данных без учетной записи сервера или с использованием других типов учетных записей, таких как IMAP. Код, который у вас есть в вашем вопросе, будет читать файл OST, если хранилище по умолчанию имеет учетную запись Exchange. Вы пробовали? У вас были проблемы? – Arthur

ответ

1

Вы должны обучить себя на том, что ОСТ/PST как доступ к ним не сильно отличается, оба Store объекты таким образом, они имеют один и тот же интерфейс.

Попробуйте использовать эти источники для начала и экспериментируйте, так как это лучший способ понять, как работает материал.

http://en.wikipedia.org/wiki/Personal_Storage_Table

http://msdn.microsoft.com/en-us/library/bb609139(v=office.14).aspx

http://msdn.microsoft.com/en-us/library/ff184648(v=office.14).aspx

http://msdn.microsoft.com/en-us/library/bb208208(v=office.12).aspx

http://www.c-sharpcorner.com/UploadFile/rambab/OutlookIntegration10282006032802AM/OutlookIntegration.aspx

+0

*** HOW-TO *** управляет файлами OST с помощью C# для конвертирования в _PST_ или просто считывает письма из ** OST **? – Kiquenet

4

После того как я понял, как на самом деле построить код, предоставленный О.П., я нашел, что это очень полезно, чтобы получить начался в Outlook, так что я ould хотел бы поделиться приведенным ниже кодом.

using System; 
using System.Collections.Generic;//List 
using System.Linq;//Array 
//using System.Text; 
//using System.Threading.Tasks; 
using System.Diagnostics;//Process 
using System.Runtime.InteropServices;//Marshal 
using System.Data;//DataTable 
using System.Reflection;//Missing 
using Microsoft.Office.Interop.Outlook;//.OST files, needs Microsoft.Office.Interop.Outlook.dll 

//TO DO: If you use the Microsoft Outlook 11.0 Object Library, uncomment the following line. 
using Outlook = Microsoft.Office.Interop.Outlook; 

namespace WatchOutlookMails 
{ 
    class StoreFormat 
    { 
     public DataTable GetInboxItems(DateTime dtpStartDate, DateTime dtpEndDate) 
     { 
      DataTable inboxTable; 
      string filter = string.Format("[ReceivedTime] >= '{0:dd/MM/yyyy 12:00 AM}' and [ReceivedTime] <= '{1:dd/MM/yyyy 11:59 PM}'", dtpStartDate, dtpEndDate); 
      Outlook.Application outlookApp = GetApplicationObject(); 
#if false//only needed if you want to select another folder 
      Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder; 
      EnumerateFolders(root); 
#endif 
      //inbox 
      Outlook.MAPIFolder inboxFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
      inboxTable = CreateTable(); 
      if (inboxFolder.Items.Count > 0) 
      { 
       Items restrictedItems = inboxFolder.Items.Restrict(filter); 
       const bool SortDescending = true; 
       restrictedItems.Sort("[ReceivedTime]", SortDescending); 
       foreach (var item in restrictedItems)//item is a "COM Object" (?) 
       { 
        MailItem mail = item as Outlook.MailItem; 
        if (mail != null) 
        { 
         //try 
         //{ 
         DataRow row = inboxTable.NewRow(); 
         //row["sn"] = (++count).ToString(); 
         row["sn"] = mail.EntryID + " " + mail.ReceivedByEntryID; 
         row["MailType"] = "Inbox"; 
         row["SenderName"] = mail.SenderName; 
         row["SenderEmail"] = mail.SenderEmailAddress; 
         row["ReceivedDate"] = mail.ReceivedTime; 
         row["Subject"] = mail.Subject; 
         row["Body"] = mail.Body != null ? (mail.Body.Length > 25 ? mail.Body.Substring(0, 25) : mail.Body) : null; 
         //row["Body"] = mail.Body != null ? mail.Body : ""; 
         row["MailSize"] = mail.Size.ToString(); 
         int AttachmentSize = 0; 
         foreach (Outlook.Attachment attachment in mail.Attachments) 
         { 
          if (attachment != null) 
           AttachmentSize += attachment.Size; 
         } 
         row["AttachmentCount"] = mail.Attachments.Count; 
         row["AttachmentSize"] = AttachmentSize; 
         inboxTable.Rows.Add(row); 
         //catch (Exception ex) 
         //{ 
         // break; 
         //} 
        } 
       } 
      } 
      return inboxTable; 
     } 

     private DataTable CreateTable() 
     { 
      DataTable T = new DataTable(); 
      T.Columns.Add("sn", typeof(string)); 
      T.Columns.Add("MailType", typeof(string)); 
      T.Columns.Add("SenderName", typeof(string)); 
      T.Columns.Add("SenderEmail", typeof(string)); 
      T.Columns.Add("ReceivedDate", typeof(string)); 
      T.Columns.Add("Subject", typeof(string)); 
      T.Columns.Add("Body", typeof(string)); 
      T.Columns.Add("MailSize", typeof(int)); 
      T.Columns.Add("AttachmentCount", typeof(int)); 
      T.Columns.Add("AttachmentSize", typeof(int)); 
      return T; 
     } 

     private void EnumerateFoldersInDefaultStore() 
     { 
      Outlook.Application outlookApp = GetApplicationObject(); 
      Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder; 
      EnumerateFolders(root); 
      return; 
     } 

     private void EnumerateFolders(Outlook.Folder folder) 
     { 
      Outlook.Folders childFolders = folder.Folders; 
      if (childFolders.Count > 0) 
      { 
       foreach (Outlook.Folder childFolder in childFolders) 
       { 
        // Write the folder path. 
        //Debug.WriteLine(childFolder.FolderPath); 
        // Call EnumerateFolders using childFolder. 
        // Uses recursion to enumerate Outlook subfolders. 
        EnumerateFolders(childFolder); 
       } 
      } 
      return; 
     } 

     /// <summary> 
     /// obtain an Application object that represents an active instance of Microsoft Outlook, 
     /// if there is one running on the local computer, or to create a new instance of Outlook, 
     /// log on to the default profile, and return that instance of Outlook 
     /// </summary> 
     /// <returns></returns> 
     private Outlook.Application GetApplicationObject() 
     { 
      // source: https://msdn.microsoft.com/en-us/library/ff462097.aspx 
      Outlook.Application application = null; 

      // Check whether there is an Outlook process running. 
      if (Process.GetProcessesByName("OUTLOOK").Count() > 0) 
      { 

       // If so, use the GetActiveObject method to obtain the process and cast it to an Application object. 
       application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application; 
      } 
      else 
      { 

       // If not, create a new instance of Outlook and log on to the default profile. 
       application = new Outlook.Application(); 
       Outlook.NameSpace nameSpace = application.GetNamespace("MAPI"); 
       nameSpace.Logon("", "", Missing.Value, Missing.Value); 
       nameSpace = null; 
      } 

      // Return the Outlook Application object. 
      return application; 
     } 
    }//end class 
}//end ns 

Чтобы заполнить недостающие куски, я позаимствовал из https://support.microsoft.com/en-us/kb/310259, для EnumerateFolders: https://msdn.microsoft.com/en-us/library/office/ff184607.aspx

Смежные вопросы