Est-il possible de lire un fichier .PST en utilisant C# ? J'aimerais le faire en tant qu'application autonome, et non en tant qu'addin Outlook (si c'est possible).
Si vous avez vu autres SO questions similaire à cette mention MailNavigator mais je cherche à le faire de manière programmatique en C#.
J'ai examiné le Microsoft.Office.Interop.Outlook mais il semble que ce soit uniquement pour les modules complémentaires d'Outlook. LibPST semble pouvoir lire les fichiers PST, mais c'est en C (désolé Joel, je ne l'ai pas fait). apprendre le C avant d'être diplômé ).
Toute aide serait grandement appréciée, merci !
EDIT :
Merci à tous pour vos réponses ! J'ai accepté la réponse de Matthew Ruston comme réponse parce qu'elle m'a finalement conduit au code que je cherchais. Voici un exemple simple de ce que j'ai réussi à faire fonctionner (vous devrez ajouter une référence à 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;
}
}
}
Remarque : Ce code suppose qu'Outlook est installé et déjà configuré pour l'utilisateur actuel. Il utilise le profil par défaut (vous pouvez modifier le profil par défaut en allant dans Courrier dans le Panneau de configuration). Une amélioration majeure de ce code serait de créer un profil temporaire à utiliser à la place du profil par défaut, puis de le détruire une fois terminé.
0 votes
Je n'avais aucune idée que les listes AddStores et Stores existaient dans l'API Outlook. Bon article !
0 votes
Ai-je oublié quelque chose ? Pourquoi ne puis-je pas accéder à la collection Stores de outlookNS ? Ce n'est pas dans intellisense.
0 votes
Avez-vous inclus "using Microsoft.Office.Interop.Outlook ;" dans votre code ?
0 votes
Je l'ai fait, et je peux voir tout le reste. Je ne peux juste pas voir la collection de magasins de l'espace de noms outlook. Je viens de penser à quelque chose... quelle version de Microsoft.Office.Interop.Outlook avez-vous référencée ? J'utilise 11.
0 votes
Vous pouvez également essayer Aspose.Network for .NET pour lire et extraire les fichiers msg du fichier Outlook PST. Visitez le site http://www.aspose.com/documentation/.net-components/aspose.network-for-.net/read-outlook-pst-file-and-get-folders-and-subfolders-information.html pour plus d'informations.
0 votes
C'est une question tout à fait légitime. Je sais que c'est un très vieux message, mais pourquoi est-il fermé parce qu'il n'est pas constructif ?
0 votes
Excellente question @l46kok ... Vous pouvez voter pour sa réouverture si vous le souhaitez.
0 votes
Bloqué sur Outlook MAPI - Vous ne pouvez pas fermer la boîte aux lettres qui contient votre calendrier, vos contacts et votre boîte de réception. Je ne peux pas fermer la boîte aux lettres qui contient votre calendrier, vos contacts et votre boîte de réception.
0 votes
Qu'est-ce que pstName ? Vous passez déjà le pstFilePath, pourquoi avez-vous besoin de pstName ?