Outlook (2003/2007) PST 파일을 C #으로 읽을 수 있습니까?
C #을 사용하여 .PST 파일을 읽을 수 있습니까? Outlook 추가 기능이 아닌 독립 실행 형 응용 프로그램으로이 작업을 수행하고 싶습니다 (가능한 경우).
경우 본 다른 SO의 질문에 비슷한 이 언급에 MailNavigator을 하지만 프로그래밍 C #으로이 일을 찾고 있어요.
Microsoft.Office.Interop.Outlook 네임 스페이스를 살펴 봤지만 Outlook 추가 기능에만 해당되는 것 같습니다. 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이 설치되어 있고 현재 사용자에 대해 이미 구성되어 있다고 가정합니다. 기본 프로필을 사용합니다 (제어판의 메일로 이동하여 기본 프로필을 편집 할 수 있음). 이 코드의 주요 개선 사항 중 하나는 Default 대신 사용할 임시 프로필을 만든 다음 완료되면 삭제하는 것입니다.
Outlook Interop 라이브러리는 추가 기능만을위한 것이 아닙니다. 예를 들어 모든 Outlook 연락처를 읽는 콘솔 앱을 작성하는 데 사용할 수 있습니다. 표준 Microsoft Outlook Interop 라이브러리를 사용하면 메일을 읽을 수있을 것이라고 확신합니다. Outlook에서 사용자가 클릭해야하는 보안 프롬프트를 표시 할 수도 있습니다.
EDITS : 실제로 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);
}
}
As already mentioned in one of your linked SO questions, I'd also recommend using the Redemption library. I'm using it in a commercial application for processing Outlook mails and performing various tasks with them. It's working flawlessly and prevents showing up the annoying security alerts. It would mean using COM Interop, but that shouldn't be a problem.
There's a library in that package called RDO which is replacing the CDO 1.21, which lets you access PST files directly. Then it's as easy as writing (VB6 code):
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
You can use pstsdk.net: .NET port of PST File Format SDK library which is open source to read pst file without Outlook installed.
For those mentioning that they don't see the Stores collection:
The Stores collection was added in Outlook 2007. So, if you're using an interop library created from an earlier version (in an attempt to be version independent - this is ver common) then this would be why you won't see the Stores collection.
Your only options to get the Stores are to do one of the following:
- Use an interop library for Outlook 2007 (this means your code won't work for earlier versions of Outlook).
- Enumerate all top level folders with Outlook object model, extract the StoreID of each folder, and then use CDO or MAPI interfaces to get more information about each store.
- Enumerate the InfoStores collection of CDO session object, and then use the fields collection of InfoStore object in order to get more information about each store.
- Or (the hardest way) use extended MAPI call (In C++): IMAPISession::GetMsgStoresTable.
Another optional solution: NetPstExtractor
This is a .Net API to read Outlook PST file without Outlook installed.
You can find demo version here.
We are going to use this, to provide a solution that doesn't rely on outlook.
http://www.independentsoft.de/pst/index.html
It is very expensive, but we hope that will lower development time and increase quality.
The MAPI API is what you are looking for. Unfortunately it is not available in .Net so I'm afraid you will have to resort to calling unmanaged code.
A quick Google reveals several wrappers available, maybe they work for you?
This might also be helpful: http://www.wischik.com/lu/programmer/mapi_utils.html
This .NET connector for Outlook might get you started.
Yes, with Independentsoft PST .NET is possible to read/export password protected and encrypted .pst file.
I found some resources directly from Microsoft which may be helpful for completing this task. A search on MSDN reveals the following.
- How to use the Microsoft Outlook Object Library to retrieve a message from the Inbox by using Visual C#
- How to use the Microsoft Outlook Object Library to retrieve an appointment by using Visual C#
Note that when you're adding a reference to Microsoft.Office.Interop.Outlook, the documentation insists that you do so via the .NET tab instead of the COM tab.
Really usefull code. If you have pst and store your messages in its root (without any directory), then you can use the following in 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);
}
}
Yes you can use MS Access and then you either import your pst content or just link it (slow!).
참고URL : https://stackoverflow.com/questions/577904/can-i-read-an-outlook-2003-2007-pst-file-in-c
'IT박스' 카테고리의 다른 글
Mac에서 어떤 사용자가 / usr / local / mysql을 소유해야합니까? (0) | 2020.11.22 |
---|---|
ASP.NET MVC 3 Razor 성능 (0) | 2020.11.22 |
Amazon의 S3에서 파일의 md5sum을 가져 오는 방법 (0) | 2020.11.22 |
Java가 소스 코드에서 이스케이프 된 유니 코드 문자를 허용하는 이유는 무엇입니까? (0) | 2020.11.22 |
STL / Boost C ++ 코딩 스타일이 다른 사람들과 크게 다른 이유는 무엇입니까? (0) | 2020.11.22 |