c# - ultimo - programa para reparar pst dañados
¿Puedo leer un archivo PST de Outlook(2003/2007) en C#? (13)
¿Es posible leer un archivo .PST usando C #? Me gustaría hacer esto como una aplicación independiente, no como un complemento de Outlook (si es posible).
Si ha visto other questions SO similar a esto, mencione MailNavigator pero estoy buscando hacerlo programáticamente en C #.
He examinado el espacio de nombres Microsoft.Office.Interop.Outlook pero parece ser solo para complementos de Outlook. Parece que LibPST puede leer archivos PST, pero esto está en C (lo siento Joel, no aprendí C antes de graduarme ).
¡Cualquier ayuda sería muy apreciada, gracias!
EDITAR:
¡Gracias a todos por las respuestas! Acepté la respuesta de Matthew Ruston como la respuesta porque finalmente me llevó al código que estaba buscando. Aquí hay un ejemplo simple de lo que tengo que trabajar (Tendrá que agregar 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 configurado para el usuario actual. Utiliza el Perfil predeterminado (puede editar el perfil predeterminado yendo a Correo en el Panel de control). Una mejora importante en este código sería crear un perfil temporal para usar en lugar del predeterminado, y luego destruirlo una vez que se haya completado.
Código realmente útil. Si tiene pst y almacena sus mensajes en su raíz (sin ningún directorio), puede usar lo siguiente en el método 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);
}
}
Como ya mencioné en una de sus preguntas SO vinculadas, también recomendaría usar la biblioteca Redemption . Lo estoy usando en una aplicación comercial para procesar correos de Outlook y realizar varias tareas con ellos. Funciona perfectamente y evita que aparezcan las molestas alertas de seguridad. Significaría usar COM Interop, pero eso no debería ser un problema.
Hay una biblioteca en ese paquete llamada RDO que está reemplazando al CDO 1.21, que le permite acceder directamente a los archivos PST. Entonces es tan fácil como escribir (código 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
Encontré algunos recursos directamente de Microsoft que pueden ser útiles para completar esta tarea. Una búsqueda en MSDN revela lo siguiente.
- Cómo usar la Biblioteca de objetos de Microsoft Outlook para recuperar un mensaje de la Bandeja de entrada utilizando Visual C #
- Cómo usar la Biblioteca de objetos de Microsoft Outlook para recuperar una cita mediante Visual C #
Tenga en cuenta que cuando agrega una referencia a Microsoft.Office.Interop.Outlook, la documentación insiste en que lo haga a través de la pestaña .NET en lugar de la pestaña COM.
La API de MAPI es lo que estás buscando. Desafortunadamente no está disponible en .Net así que me temo que tendrá que recurrir a llamar al código no administrado.
Un Google rápido revela varios envoltorios disponibles, ¿quizás funcionan para usted?
Esto también podría ser útil: http://www.wischik.com/lu/programmer/mapi_utils.html
La biblioteca de Outlook Interop no es solo para complementos. Por ejemplo, podría usarse para escribir una aplicación de consola que simplemente lea todos sus contactos de Outlook. Estoy bastante seguro de que la biblioteca estándar Interoperabilidad de Microsoft Outlook le permitirá leer el correo, aunque probablemente arrojará un mensaje de seguridad en Outlook que el usuario tendrá que hacer clic.
EDITOS : en realidad, la implementación de la lectura de correo utilizando Outlook Interop depende de lo que signifique su definición de ''independiente''. Outlook Interop lib requiere que Outlook esté instalado en la máquina cliente para 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();
}
}
}
Otra solución opcional: NetPstExtractor
Esta es una .Net API para leer el archivo PST de Outlook sin Outlook instalado.
Puedes encontrar la versión demo here.
Puede usar pstsdk.net: puerto .NET de la biblioteca SDK de formato de archivo PST que es de código abierto para leer el archivo pst sin Outlook instalado.
Revisé e hice la refactorización de 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);
}
}
Sí, con Independentsoft PST .NET es posible leer / exportar archivos .pst protegidos con contraseña y encriptados.
Sí, puedes usar MS Access y luego importar tu contenido pst o simplemente vincularlo (¡lento!).
Vamos a usar esto para proporcionar una solución que no dependa de las perspectivas.
http://www.independentsoft.de/pst/index.html
Es muy costoso, pero esperamos que reduzca el tiempo de desarrollo y aumente la calidad.
This conector .NET para Outlook podría ayudarlo a comenzar.
Para aquellos que mencionan que no ven la colección de Tiendas:
La colección Stores se agregó en Outlook 2007. Por lo tanto, si usa una biblioteca de interoperabilidad creada a partir de una versión anterior (en un intento de ser independiente de la versión, esto es muy común), entonces esta sería la razón por la que no verá las tiendas. colección.
Sus únicas opciones para obtener las tiendas son hacer una de las siguientes cosas:
- Use una biblioteca de interoperabilidad para Outlook 2007 (esto significa que su código no funcionará para versiones anteriores de Outlook).
- Enumere todas las carpetas de nivel superior con el modelo de objetos de Outlook, extraiga el StoreID de cada carpeta y luego use las interfaces CDO o MAPI para obtener más información sobre cada tienda.
- Enumere la colección InfoStores del objeto de sesión CDO y luego use la colección de campos del objeto Almacén de información para obtener más información sobre cada tienda.
- O bien (la forma más difícil) use la llamada extendida de MAPI (en C ++): IMAPISession :: GetMsgStoresTable.