Pregunta

¿Es posible leer un archivo PST con C #? Me gustaría hacer esto como una aplicación independiente, no como un complemento de Outlook (si es posible).

Si han visto otra : // stackoverflow. com / preguntas / 486883 / problema-en-liberadora de la memoria-de-un-Outlook-pst-archivo "> SO preguntas similar a esta mención MailNavigator pero yo soy buscando hacer esto mediante programación en C #.

He mirado en la Microsoft.Office.Interop .Outlook espacio de nombres, sino que parece ser sólo para los complementos de Outlook. libpst parece ser capaz de leer los archivos PST, pero esto es en C (lo siento Joel, no aprender C antes de graduarse ).

Cualquier ayuda sería muy apreciada, gracias!

EDIT:

Gracias a todos por las respuestas! Acepté la respuesta de Matthew Ruston como la respuesta, ya que en última instancia, me llevó a un código que estaba buscando. Aquí está un ejemplo sencillo de lo que tengo que trabajar (Usted tendrá que añadir una referencia a 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;
        }
    }
}

Nota: Este código asume que Outlook está instalado y ya configurado para el usuario actual. Se utiliza el perfil predeterminado (se puede editar el perfil predeterminado por ir a correo en el Panel de control). Una mejora importante en este código sería la creación de un perfil temporal para usar en lugar del predeterminado, luego destruirlo una vez terminado.

¿Fue útil?

Solución

La biblioteca de Outlook de interoperabilidad no es sólo para los complementos. Por ejemplo, podría ser utilizado para escribir una aplicación de consola que simplemente lee todos los contactos de Outlook. Estoy bastante seguro de que la biblioteca estándar de interoperabilidad de Microsoft Outlook le permitirá leer el correo -. Aunque es probable que lanzar un mensaje de seguridad en Outlook que el usuario tendrá que hacer clic a través

EDITS : En realidad la implementación de lectura electrónico con Outlook interoperabilidad depende de lo que su definición de 'independiente' significa. El lib perspectiva de interoperabilidad requiere Outlook para ser instalado en la máquina cliente con el fin de funcionar.

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

Otros consejos

Fui a través de e hice la refactorización para las subcarpetas

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

Como ya se ha mencionado en una de sus preguntas relacionadas SO, también me gustaría recomendar el uso de la redención biblioteca. Lo estoy usando en una aplicación comercial para el procesamiento de correos de Outlook y realizar diversas tareas con ellos. Está funcionando sin problemas y evita aparecer las alertas de seguridad molestos. Sería implicar el uso de interoperabilidad COM, pero eso no debería ser un problema.

Hay una biblioteca en ese paquete llamado RDO que está sustituyendo el CDO 1.21, lo que le permite acceder a los archivos PST directamente. Entonces es tan fácil como escribir (código de Visual Basic 6):

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

Puede utilizar pstsdk.net: puerto .NET de PST File Format SDK biblioteca que es de código abierto para leer el archivo pst sin instalado Outlook.

Para aquellos mencionar que no ven la colección Tiendas:

La colección de tiendas se añadió en Outlook 2007. Por lo tanto, si usted está utilizando una biblioteca de interoperabilidad creado a partir de una versión anterior (en un intento de ser la versión independiente - esto es común ver), entonces esto sería razón por la que no lo hará ver la colección de almacenes.

Sus únicas opciones para obtener los suministros se vayan a realizar una de las siguientes:

  • Utilice una biblioteca de interoperabilidad para Outlook 2007 (esto significa que su código no funcionará para las versiones anteriores de Outlook).
  • Enumerar todas las carpetas de nivel superior con el modelo de objetos de Outlook, extraer el StoreID de cada carpeta, y luego usar las interfaces CDO o MAPI para obtener más información acerca de cada tienda.
  • Enumerar la colección infostores de CDO objeto de sesión, y luego usar la colección de campos de objetos del Almacén de información con el fin de obtener más información sobre cada tienda.
  • O (la forma más dura) un uso prolongado llamada MAPI (en C ++): IMAPISession :: GetMsgStoresTable.

Otra solución opcional: NetPstExtractor

Esta es una API para leer .Net de Outlook archivo PST sin instalado Outlook.

Puede encontrar la versión de demostración aquí.

Vamos a usar esto, para proporcionar una solución que no se basa en la perspectiva.

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

Es muy caro, pero esperamos que reducirán el tiempo de desarrollo y aumentar la calidad.

La API de MAPI es lo que busca. Por desgracia, no está disponible en .Net así que me temo que tendrá que recurrir a llamar a código no administrado.

Una búsqueda rápida en Google revela varias envolturas disponibles, tal vez trabajan para usted?

Esto también podría ser útil: http://www.wischik.com/lu /programmer/mapi_utils.html

Este conector .NET para Outlook podría empezar.

Sí, con Independentsoft PST .NET es posible leer / contraseña de exportación de archivos .pst protegidos y encriptados.

He encontrado algunos recursos directamente desde Microsoft que pueden ser útiles para completar esta tarea. Un buscar en MSDN revela lo siguiente.

Tenga en cuenta que cuando se va a añadir una referencia a Microsoft.Office.Interop.Outlook, la documentación insiste en que lo hace a través de la ficha .NET en lugar de la ficha COM.

código realmente útil. Si ha pst y almacenar los mensajes en su raíz (sin ningún tipo de directorio), entonces usted puede utilizar el siguiente método en 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);
      }
 }

Sí se puede usar MS Access y, a continuación, ya sea importar su contenido pst o simplemente enlazarlo (lento!).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top