سؤال

هل من الممكن قراءة ملف .pst باستخدام C #؟ أرغب في القيام بذلك كتطبيق مستقل، وليس كإضافة addin (إذا كان ذلك ممكنا).

إذا رأيت آخر وبالتالي أسئلة مماثل لهذا الإشارة mailnavigator. لكنني أتطلع إلى القيام بهذا برمجيا في C #.

لقد نظرت إلى microsoft.office.interop.outlook. مساحة الاسم ولكن هذا يبدو أنه فقط لإضفاء الأدوار Outlook. libpst. يبدو أنه قادر على قراءة ملفات PST، ولكن هذا في C (آسف جويل، لم أفعل تعلم ج قبل التخرج).

أي مساعدة سيكون موضع تقدير كبير، وذلك بفضل!

تعديل:

شكرا لكم جميعا على الردود! قبلت استجابة Matthew Ruston كإجابة لأنها قادني في النهاية إلى التعليمات البرمجية التي كنت أبحث عنها. فيما يلي مثال بسيط على ما حصلت عليه (ستحتاج إلى إضافة مرجع إلى 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;
        }
    }
}

ملحوظة: يفترض هذا الرمز أن Outlook مثبتة وتكوينها بالفعل للمستخدم الحالي. يستخدم الملف الشخصي الافتراضي (يمكنك تحرير ملف التعريف الافتراضي عن طريق الانتقال إلى البريد في لوحة التحكم). سيكون هناك تحسن كبير في هذا الرمز هو إنشاء ملف تعريف مؤقت لاستخدامه بدلا من الافتراضي، ثم قم بتدميره بمجرد الانتهاء.

هل كانت مفيدة؟

المحلول

مكتبة Outlook Interop ليست فقط للدوار. على سبيل المثال، يمكن استخدامه لكتابة تطبيق وحدة التحكم التي يقرأ فقط جميع جهات اتصال Outlook الخاصة بك. أنا متأكد من أن مكتبة Microsoft Outlook Interop القياسية ستتيح لك قراءة البريد - وإن كان من المحتمل أن يتم إلقاء موجه أمان في Outlook، فسيطر على المستخدم النقر عبره.

تعديلات: في الواقع تطبيق قراءة البريد باستخدام Outlook Interop يعتمد على ما تعريفك "المستقلة". يتطلب برنامج Outlook Interop 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();
    }
}
}

نصائح أخرى

مرت وقمت بإعادة صياغة المجلدات الفرعية

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

كما ذكرنا بالفعل في واحدة من الأسئلة المرتبطة، أود أيضا أن أوصي باستخدام الخلاص مكتبة. أنا أستخدمه في تطبيق تجاري لمعالجة رسائل التوقعات وأداء مهام مختلفة معهم. إنها تعمل لا تشوبها شائبة وتمنع إظهار التنبيهات الأمنية المزعجة. هذا يعني استخدام COM Interop، لكن لا ينبغي أن يكون مشكلة.

هناك مكتبة في تلك الحزمة تسمى RDO والتي تحل محل CDO 1.21، والتي تتيح لك الوصول إلى ملفات PST مباشرة. ثم إنها سهلة مثل الكتابة (رمز VB6):

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

يمكنك استخدام pstsdk.net: .NET ميناء تنسيق ملف PST SDK المكتبة التي هي مصدر مفتوح لقراءة ملف PST بدون تثبيت Outlook.

لأولئك الذين يذكرون أنهم لا يرون مجموعة المتاجر:

تمت إضافة مجموعة المتاجر في Outlook 2007. لذلك، إذا كنت تستخدم مكتبة Interop تم إنشاؤها من إصدار سابق (في محاولة لإصدار مستقلة - فهذا هو Ver شائعا) ثم سيكون هذا هو السبب في أنك لن ترى المتاجر مجموعة.

خياراتك الوحيدة للحصول على المتاجر هي القيام بأحد الإجراءات التالية:

  • استخدم مكتبة Interop ل Outlook 2007 (هذا يعني أن الكود الخاص بك لن يعمل من أجل الإصدارات السابقة من Outlook).
  • قم بتعداد جميع مجلدات المستوى الأعلى مع طراز كائن Outlook، واستخراج مخزن كل مجلد، ثم استخدم واجهات CDO أو MAPI للحصول على مزيد من المعلومات حول كل متجر.
  • قم بتعداد مجموعة Infostores من كائن جلسة CDO، ثم استخدم مجموعة الحقول كائن Infostore للحصول على مزيد من المعلومات حول كل متجر.
  • أو (أكثر الطرق) استخدام مكالمة MAPI الموسعة (في C ++): Imapisession :: GetMSGStorstable.

حل اختياري آخر: netpstextractor.

هذا API .NET لقراءة ملف Outlook PST بدون تثبيت Outlook.

يمكنك العثور على نسخة تجريبية هنا.

سوف نستخدم هذا، لتوفير حل لا يعتمد على Outlook.

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

إنها مكلفة للغاية، لكننا نأمل أن تنخفض وقت التنمية وزيادة الجودة.

API MAPI هو ما تبحث عنه. لسوء الحظ، لا يتوفر ذلك متوفرا بذلك.

جوجل سريع يكشف عن العديد من الأغلفة المتاحة، ربما يعملون من أجلك؟

هذا قد يكون مفيدا أيضا: http://www.wischik.com/lu/programmer/mapi_utils.html.

هذه NENT موصل ل Outlook قد تبدأ في البدء.

نعم، مع IndependentSoft PST .NET من الممكن قراءة / تصدير ملف .pst المحمي بكلمة مرور ومشفرة.

لقد وجدت بعض الموارد مباشرة من Microsoft والتي قد تكون مفيدة لاستكمال هذه المهمة. أ البحث في MSDN. يكشف ما يلي.

لاحظ أنه عند إضافة مرجع إلى Microsoft.Office.Interop.Outlook، وثائق تصر على أنك تقوم بذلك عبر علامة التبويب .NET بدلا من علامة التبويب COM.

رمز مفصول حقا حقا. إذا كان لديك PST وتخزين رسائلك في جذرها (بدون أي دليل)، فيمكنك استخدام ما يلي في 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);
      }
 }

نعم، يمكنك استخدام MS Access وبعد ذلك إما استيراد محتوى PST الخاص بك أو مجرد ربطه (بطيء!).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top