Я могу считать Outlook (2003/2007) файл PST в C#?

Попробуйте очистить поле ввода для фильтра. В IMAC это фильтрация содержимого, которое имеет строку color

64
задан Community 23 May 2017 в 12:02
поделиться

8 ответов

Библиотека Outlook Interop не только для дополнений. Например, это могло использоваться для записи консольного приложения, которое просто читает все Контакты Outlook. Я вполне уверен, что стандартная библиотека Microsoft Outlook Interop позволит Вам считать почту - хотя она, вероятно, бросит подсказку безопасности в Outlook, который пользователь должен будет нажать через.

РЕДАКТИРОВАНИЯ : На самом деле реализовывая почтовое чтение с помощью Outlook Interop зависит от того, что означает определение 'автономных'. Lib Interop Outlook требует, чтобы 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();
    }
}
}
27
ответ дан Matthew Ruston 24 November 2019 в 16:01
поделиться

Да можно использовать Доступ MS и затем Вас или импортировать Ваше содержание PST или просто связать его (медленный!).

-1
ответ дан Lorenzo 24 November 2019 в 16:01
поделиться

API MAPI - то, что Вы ищете. К сожалению, это не доступно в .NET, таким образом, я боюсь, что необходимо будет обратиться к вызову неуправляемого кода.

А быстрый Google показывает несколько доступных оберток, возможно, они работают на Вас?

Это могло бы также быть полезно: http://www.wischik.com/lu/programmer/mapi_utils.html

0
ответ дан Gerrie Schenck 24 November 2019 в 16:01
поделиться

Этот коннектор.NET для Outlook мог бы запустить Вас.

0
ответ дан Chris Ballance 24 November 2019 в 16:01
поделиться

Как уже упомянуто в одном из Ваших связанных ТАК вопросы, я также рекомендовал бы использовать библиотека Redemption . Я использую его в коммерческом применении для обработки писем 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
6
ответ дан Dmitry Streblechenko 24 November 2019 в 16:01
поделиться

Я прошел и провел рефакторинг для вложенных папок

    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);
        }
    }
6
ответ дан 24 November 2019 в 16:01
поделиться

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

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

Это очень дорого, но мы надеемся, что это сократит время разработки и повысит качество.

1
ответ дан 24 November 2019 в 16:01
поделиться

Для тех, кто упоминает, что они не видят коллекцию магазинов:

Коллекция магазинов была добавлена ​​в Outlook 2007. Итак, если вы используете библиотека взаимодействия, созданная из более ранней версии (в попытке быть независимой от версии - это очень распространено), поэтому вы не увидите коллекцию Stores.

Единственный способ получить магазины - это выполнить одно из следующих действий:

  • Использовать библиотеку взаимодействия для Outlook 2007 (это означает, что ваш код не будет работать с более ранними версиями Outlook).
  • Перечислить все папки верхнего уровня с помощью объектной модели Outlook, извлечь StoreID каждой папки, а затем использовать интерфейсы CDO или MAPI для получения дополнительных сведений о каждом хранилище.
  • Перечислить коллекцию InfoStores объекта сеанса CDO, а затем использовать коллекцию полей объекта InfoStore, чтобы получить дополнительную информацию о каждом магазине.
  • Или (самый сложный способ) использовать расширенный вызов MAPI (в C ++): IMAPISession :: GetMsgStoresTable.
2
ответ дан 24 November 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: