2009-02-23 9 views
61

क्या सी # का उपयोग कर एक पीएसटी फ़ाइल पढ़ना संभव है? मैं इसे एक स्टैंडअलोन एप्लिकेशन के रूप में करना चाहता हूं, न कि Outlook एडिन के रूप में (यदि यह संभव है)।क्या मैं सी # में एक आउटलुक (2003/2007) पीएसटी फ़ाइल पढ़ सकता हूं?

तो otherSOquestionssimilar देखा है इस उल्लेख MailNavigator लिए, लेकिन मैं सी # में प्रोग्राम के रूप में यह करने के लिए देख रहा हूँ।

मैंने Microsoft.Office.Interop.Outlook नामस्थान देखा है, लेकिन यह केवल Outlook addins के लिए प्रतीत होता है। LibPST पीएसटी फ़ाइलों को पढ़ने में सक्षम प्रतीत होता है, लेकिन यह सी में है (क्षमा करें जोएल, मैंने learn C before graduating नहीं किया था)।

किसी भी मदद की सराहना की जाएगी, धन्यवाद!

संपादित करें:

आप सभी प्रतिक्रियाओं के लिए धन्यवाद! मैंने मैथ्यू रूस्टन की प्रतिक्रिया को उत्तर के रूप में स्वीकार कर लिया क्योंकि आखिरकार मुझे उस कोड पर ले जाया गया जिसे मैं ढूंढ रहा था। यहाँ मैं क्या काम मिल गया (आप Microsoft.Office.Interop.Outlook के लिए एक संदर्भ जोड़ने की आवश्यकता होगी) का एक सरल उदाहरण है:

using System; 
using System.Collections.Generic; 
using Microsoft.Office.Interop.Outlook; 

namespace PSTReader { 
    class Program { 
     static void Main() { 
      try { 
       IEnumerable<MailItem> mailItems = readPst(@"C:\temp\PST\Test.pst", "Test PST"); 
       foreach (MailItem mailItem in mailItems) { 
        Console.WriteLine(mailItem.SenderName + " - " + mailItem.Subject); 
       } 
      } catch (System.Exception ex) { 
       Console.WriteLine(ex.Message); 
      } 
      Console.ReadLine(); 
     } 

     private static IEnumerable<MailItem> readPst(string pstFilePath, string pstName) { 
      List<MailItem> mailItems = new List<MailItem>(); 
      Application app = new Application(); 
      NameSpace outlookNs = app.GetNamespace("MAPI"); 
      // Add PST file (Outlook Data File) to Default Profile 
      outlookNs.AddStore(pstFilePath); 
      MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder(); 
      // Traverse through all folders in the PST file 
      // TODO: This is not recursive, refactor 
      Folders subFolders = rootFolder.Folders; 
      foreach (Folder folder in subFolders) { 
       Items items = folder.Items; 
       foreach (object item in items) { 
        if (item is MailItem) { 
         MailItem mailItem = item as MailItem; 
         mailItems.Add(mailItem); 
        } 
       } 
      } 
      // Remove PST file from Default Profile 
      outlookNs.RemoveStore(rootFolder); 
      return mailItems; 
     } 
    } 
} 

नोट: इस कोड को मानता है कि आउटलुक स्थापित किया गया है और पहले से ही वर्तमान उपयोगकर्ता के लिए कॉन्फ़िगर किया गया। यह डिफ़ॉल्ट प्रोफ़ाइल का उपयोग करता है (आप नियंत्रण कक्ष में मेल पर जाकर डिफ़ॉल्ट प्रोफ़ाइल संपादित कर सकते हैं)। इस कोड पर एक बड़ा सुधार डिफ़ॉल्ट के बजाय उपयोग करने के लिए अस्थायी प्रोफ़ाइल बनाना होगा, फिर इसे पूरा करने के बाद इसे नष्ट कर दें।

+0

मुझे पता नहीं था कि AddStores और स्टोर सूची भी आउटलुक एपीआई में ही अस्तित्व में। अच्छी पोस्ट! –

+0

क्या मुझे कुछ याद आ रहा है? मैं दृष्टिकोण के स्टोर संग्रह का उपयोग क्यों नहीं कर सकता? यह इंटेलिजेंस में नहीं है। –

+0

क्या आपने 'माइक्रोसॉफ्ट.ऑफिस.इंटरोप.ऑटlook;' का उपयोग किया था। आपके कोड में? –

उत्तर

23

आउटलुक इंटरॉप पुस्तकालय सिर्फ addins के लिए नहीं है। उदाहरण के लिए इसका उपयोग कंसोल ऐप लिखने के लिए किया जा सकता है जो आपके सभी Outlook संपर्कों को पढ़ता है। मुझे पूरा यकीन है कि मानक माइक्रोसॉफ्ट आउटलुक इंटरऑप लाइब्रेरी आपको मेल पढ़ने देगी - यद्यपि यह शायद Outlook में एक सुरक्षा संकेत फेंक देगा कि उपयोगकर्ता को क्लिक करना होगा।

EDITS: वास्तव में Outlook इंटरऑप का उपयोग करके मेल पढ़ने को लागू करने पर निर्भर करता है कि 'स्टैंडअलोन' की आपकी परिभाषा क्या है। Outlook इंटरऑप lib को कार्य करने के लिए क्लाइंट मशीन पर Outlook स्थापित करने की आवश्यकता होती है।

// Dumps all email in Outlook to console window. 
// Prompts user with warning that an application is attempting to read Outlook data. 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Outlook = Microsoft.Office.Interop.Outlook; 

namespace OutlookEmail 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Outlook.Application app = new Outlook.Application(); 
     Outlook.NameSpace outlookNs = app.GetNamespace("MAPI"); 
     Outlook.MAPIFolder emailFolder = outlookNs.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

     foreach (Outlook.MailItem item in emailFolder.Items) 
     { 
      Console.WriteLine(item.SenderEmailAddress + " " + item.Subject + "\n" + item.Body); 
     } 
     Console.ReadKey(); 
    } 
} 
} 
+0

यह मानना ​​सुरक्षित है कि मशीन पर Outlook स्थापित किया जाएगा, हालांकि, मैं यह पसंद करूंगा कि पीएसटी फ़ाइल से पढ़ने के लिए Outlook को खोलना आवश्यक नहीं है। –

+0

इसे खोलने की आवश्यकता नहीं है। इंटरऑप lib बस इसे पृष्ठभूमि में खुलता है और जब आपका काम पूरा हो जाता है। –

+0

अहह, ठीक है, यह अच्छा लगता है। मैं संपर्कों को पढ़ने के लिए इसका उपयोग करने के लिए कुछ उदाहरण देखता हूं और ऐसे में, लेकिन मुझे बस एक पीएसटी में संदेश पढ़ने में दिलचस्पी है, न कि एक्सचेंज सर्वर से संपर्क। क्या आप जानते हैं, या इस पर एक उदाहरण है? –

0

एमएपीआई एपीआई आप जो खोज रहे हैं वह है। दुर्भाग्य से यह .NET में उपलब्ध नहीं है इसलिए मुझे डर है कि आपको अप्रबंधित कोड को कॉल करने का सहारा लेना होगा।

एक त्वरित Google कई रैपर उपलब्ध कराता है, शायद वे आपके लिए काम करते हैं?

यह भी उपयोगी हो सकता है: http://www.wischik.com/lu/programmer/mapi_utils.html

0

This Outlook के लिए .NET कनेक्टर आपको प्रारंभ कर सकता है।

0

हाँ आप एमएस एक्सेस का उपयोग कर सकते हैं और फिर आप या तो अपनी पीएसटी सामग्री आयात कर सकते हैं या बस इसे लिंक कर सकते हैं (धीमा!)।

+0

क्षमा करें, मुझे नहीं लगता कि यह सी # में एक पीएसटी फ़ाइल को पढ़ने के तरीके के बारे में मेरे प्रश्न का उत्तर कैसे देता है। कृपया आगे व्याख्या कीजिये। –

+0

ओह हाँ क्षमा करें, मैं सी # भाग भूल गया, लेकिन यदि आप शायद सी # से एक्सेस को नियंत्रित कर सकते हैं तो भी आप उस तरह से जा सकते हैं। Untested! – Lorenzo

6

जैसा कि पहले से ही आपके लिंक किए गए SO प्रश्नों में से एक में उल्लेख किया गया है, मैं Redemption लाइब्रेरी का उपयोग करने की भी सिफारिश करता हूं। मैं इसे Outlook मेल को संसाधित करने और उनके साथ विभिन्न कार्यों को करने के लिए एक वाणिज्यिक अनुप्रयोग में उपयोग कर रहा हूं। यह बेकार ढंग से काम कर रहा है और परेशान सुरक्षा अलर्ट दिखाने से रोकता है। इसका मतलब COM इंटरऑप का उपयोग करना होगा, लेकिन यह कोई समस्या नहीं होनी चाहिए।

आरडीओ नामक उस पैकेज में एक लाइब्रेरी है जो सीडीओ 1.21 को प्रतिस्थापित कर रही है, जो आपको सीधे पीएसटी फ़ाइलों तक पहुंचने देती है।

set Session = CreateObject("Redemption.RDOSession") 
'open or create a PST store 
set Store = Session.LogonPstStore("c:\temp\test.pst") 
set Inbox = Store.GetDefaultFolder(6) 'olFolderInbox 
MsgBox Inbox.Items.Count 
5

मैं माध्यम से चला गया और सबफ़ोल्डर

private static IEnumerable<MailItem> readPst(string pstFilePath, string pstName) 
    { 
     List<MailItem> mailItems = new List<MailItem>(); 
     Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); 
     NameSpace outlookNs = app.GetNamespace("MAPI"); 

     // Add PST file (Outlook Data File) to Default Profile 
     outlookNs.AddStore(pstFilePath); 

     string storeInfo = null; 

     foreach (Store store in outlookNs.Stores) 
     { 
      storeInfo = store.DisplayName; 
      storeInfo = store.FilePath; 
      storeInfo = store.StoreID; 
     } 

     MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder(); 

     // Traverse through all folders in the PST file 
     Folders subFolders = rootFolder.Folders; 

     foreach (Folder folder in subFolders) 
     { 
      ExtractItems(mailItems, folder); 
     } 
     // Remove PST file from Default Profile 
     outlookNs.RemoveStore(rootFolder); 
     return mailItems; 
    } 

    private static void ExtractItems(List<MailItem> mailItems, Folder folder) 
    { 
     Items items = folder.Items; 

     int itemcount = items.Count; 

     foreach (object item in items) 
     { 
      if (item is MailItem) 
      { 
       MailItem mailItem = item as MailItem; 
       mailItems.Add(mailItem); 
      } 
     } 

     foreach (Folder subfolder in folder.Folders) 
     { 
      ExtractItems(mailItems, subfolder); 
     } 
    } 
+0

pstName क्या है? आप पहले से ही pstFilePath पास कर चुके हैं, आपको pstName की आवश्यकता क्यों है? इस सुझाव के लिए – HoKy22

0

हम एक समाधान है कि निर्भर नहीं करता प्रदान करने के लिए इस का उपयोग करने के लिए जा रहे हैं के लिए पुनर्रचना के लिए क्या किया: तो फिर यह (VB6 कोड) लेखन जितना आसान है दृष्टिकोण पर

http://www.independentsoft.de/pst/index.html

यह बहुत महंगा है, लेकिन हमें उम्मीद है कि विकास समय और वृद्धि की गुणवत्ता को कम करेगा।

+0

+1 (यह मैंने उपयोग किया है)। तकनीकी सहायता भी बहुत प्रतिक्रियाशील। – noonand

2

उल्लेख है कि वे स्टोर संग्रह नहीं दिख रहा है उन लोगों के लिए:

स्टोर संग्रह (आउटलुक 2007 में जोड़ा गया था तो, आप किसी पुराने संस्करण द्वारा बनाया हुआ इंटरॉप पुस्तकालय उपयोग कर रहे हैं एक में संस्करण स्वतंत्र होने का प्रयास करें - यह सामान्य बात है) तो यही कारण है कि आप स्टोर संग्रह नहीं देखेंगे। (यह आपका कोड Outlook के पुराने संस्करणों के लिए काम नहीं करेगा मतलब है)

  • Outlook 2007 के लिए एक इंटरॉप पुस्तकालय का उपयोग करें:

    आपका ही विकल्प स्टोर पाने के लिए निम्न में से एक करने के लिए कर रहे हैं।

  • आउटलुक ऑब्जेक्ट मॉडल के साथ सभी शीर्ष स्तर फ़ोल्डरों का आकलन करें, प्रत्येक फ़ोल्डर के स्टोरआईडी निकालें, और फिर प्रत्येक स्टोर के बारे में अधिक जानकारी प्राप्त करने के लिए सीडीओ या एमएपीआई इंटरफेस का उपयोग करें।
  • सीडीओ सत्र ऑब्जेक्ट के InfoStores संग्रह का आकलन करें, और उसके बाद प्रत्येक स्टोर के बारे में अधिक जानकारी प्राप्त करने के लिए InfoStore ऑब्जेक्ट के फ़ील्ड संग्रह का उपयोग करें।
  • या (सबसे कठिन तरीका) विस्तारित एमएपीआई कॉल (सी ++ में) का उपयोग करें: IMAPISession :: GetMsgStoresTable।
0

हां, इंडिपेंडेंटॉफ्ट पीएसटी .NET के साथ पासवर्ड सुरक्षित और एन्क्रिप्टेड .pst फ़ाइल को पढ़ने/निर्यात करना संभव है।

0

मुझे माइक्रोसॉफ्ट से सीधे कुछ संसाधन मिले जो इस कार्य को पूरा करने में सहायक हो सकते हैं। एक search on MSDN निम्नलिखित बताता है।

नोट जब आप Microsoft.Office.Interop.Outlook के लिए एक संदर्भ, the documentation जोड़ रहे हैं का कहना है कि यह है कि आप कॉम के बजाय नेट टैब के माध्यम से ऐसा करने के टैब।

4

आप pstsdk.net: .NET port of PST File Format SDK लाइब्रेरी का उपयोग कर सकते हैं जो पीएसटी फ़ाइल पढ़ने के लिए ओपन सोर्स है Outlook स्थापित।

+0

उस पृष्ठ में उपलब्ध नहीं डाउनलोड! – villamejia

1

एक अन्य वैकल्पिक समाधान: NetPstExtractor

यह Outlook पीएसटी फ़ाइल पढ़ने के लिए एक नेट एपीआई है बिना आउटलुक स्थापित।

आप डेमो संस्करण here.

0

सच उपयोगी कोड पा सकते हैं। आप पीएसटी और (किसी भी निर्देशिका के बिना) की जड़ में अपने संदेशों को संग्रहीत किया है, तो आप विधि readPst में निम्न का उपयोग कर सकते हैं:

MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder(); 
Items items = rootFolder.Items; 
foreach (object item in items) 
{ 
     if (item is MailItem) 
     { 
      MailItem mailItem = item as MailItem; 
      mailItems.Add(mailItem); 
     } 
} 
संबंधित मुद्दे