문제

c#을 사용하여 .pst 파일을 읽을 수 있습니까? 나는 이것을 독립형 애플리케이션으로, Outlook Addin이 아닌 독립형 응용 프로그램으로하고 싶습니다 (가능하다면).

본 경우 다른 그래서 질문 비슷한 이 언급에 MailNavigator 그러나 나는 C#에서 프로그래밍 방식 으로이 작업을 수행하려고합니다.

나는 그것을 보았다 Microsoft.office.interop.outlook 네임 스페이스이지만 Outlook Addins를위한 것 같습니다. libpst PST 파일을 읽을 수있는 것처럼 보이지만 이것은 C에 있습니다 (죄송합니다 Joel, 나는하지 않았습니다. 졸업하기 전에 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 라이브러리는 Addins를위한 것이 아닙니다. 예를 들어 모든 Outlook 연락처를 읽는 콘솔 앱을 작성하는 데 사용될 수 있습니다. 표준 Microsoft Outlook Interop Library를 사용하면 메일을 읽을 수 있다고 확신합니다. 아마도 사용자가 클릭해야한다는 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();
    }
}
}

다른 팁

나는 Subfolders에 대한 리팩토링을 거쳤다

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

링크 된 SO 질문 중 하나에서 이미 언급했듯이 구원 도서관. Outlook 메일을 처리하고 다양한 작업을 수행하기 위해 상용 응용 프로그램에서 사용하고 있습니다. 완벽하게 작동하며 성가신 보안 경고가 표시되지 않습니다. 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 PORT OF PST 파일 형식 SDK PST 파일을 읽을 수있는 오픈 소스 인 라이브러리 없이 Outlook이 설치되었습니다.

상점 컬렉션이 보이지 않는다고 언급 한 사람들은 다음과 같습니다.

Stores Collection은 Outlook 2007에 추가되었습니다. 따라서 이전 버전에서 생성 된 Interop 라이브러리를 사용하는 경우 (버전 독립적 인 시도에서 - 이것은 일반적입니다) 이것이 매장을 보지 못하는 이유입니다. 수집.

상점을 얻는 유일한 옵션은 다음 중 하나를 수행하는 것입니다.

  • Outlook 2007에 Interop 라이브러리를 사용하십시오 (이는 이전 버전의 Outlook에서 코드가 작동하지 않음을 의미합니다).
  • Outlook Object 모델로 모든 최상위 폴더를 열거하고 각 폴더의 저장소를 추출한 다음 CDO 또는 MAPI 인터페이스를 사용하여 각 스토어에 대한 자세한 정보를 얻으십시오.
  • CDO 세션 객체의 Infostores 컬렉션을 열거 한 다음 각 상점에 대한 자세한 정보를 얻으려면 Infostore Object의 필드 컬렉션을 사용하십시오.
  • 또는 (가장 어려운 방법) 확장 된 MAPI 호출 (C ++)을 사용하십시오 : Imapisession :: getmsgstorestable.

다른 선택적 솔루션 : netpstextractor

Outlook PST 파일을 읽는 .NET API입니다. 없이 Outlook이 설치되었습니다.

데모 버전을 찾을 수 있습니다 여기.

우리는 이것을 사용하여 Outlook에 의존하지 않는 솔루션을 제공 할 것입니다.

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

매우 비싸지 만 개발 시간이 줄어들고 품질이 향상되기를 바랍니다.

MAPI API는 당신이 찾고있는 것입니다. 불행히도 .NET에서는 사용할 수 없으므로 관리되지 않는 코드를 호출 해야하는 것이 두렵습니다.

빠른 Google은 여러 래퍼를 사용할 수 있습니다. 아마도 당신을 위해 일할 수 있습니까?

이것은 또한 도움이 될 수 있습니다. http://www.wischik.com/lu/programmer/mapi_utils.html

이것 Outlook 용 .NET 커넥터를 사용하면 시작할 수 있습니다.

예, IndependentSoft PST를 사용하면 비밀번호 보호 및 암호화 된 .pst 파일을 읽고/내보낼 수 있습니다.

이 작업을 완료하는 데 도움이 될 수있는 Microsoft에서 직접 리소스를 찾았습니다. ㅏ MSDN에서 검색하십시오 다음을 밝힙니다.

Microsoft.office.interop.outlook에 대한 참조를 추가 할 때 문서 COM 탭 대신 .NET 탭을 통해 그렇게한다고 주장합니다.

정말 유용한 코드. PST가 있고 메시지를 루트에 저장하는 경우 (디렉토리없이) Method 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