Création et gestion des fichiers PST
En plus d’analyser un fichier PST existant, Aspose.Email offre la possibilité de créer un fichier PST à partir de zéro. Cet article montre comment créer des fichiers PST Outlook et y ajouter des sous-dossiers ou des messages.
Création de fichiers PST
Pour créer un nouveau fichier PST sur un disque local, vous devrez utiliser le PersonalStorage classe. Avec cette classe, vous pouvez créer, lire et manipuler des fichiers PST dans vos applications .NET. Créez un fichier de stockage à partir de zéro avec une seule ligne de code :
// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);
Ajouter des sous-dossiers au PST
Ajouter un sous-dossier à la racine du fichier PST en accédant au dossier Root puis en appelant le AddSubFolder méthode.
L’extrait de code suivant montre comment ajouter un sous-dossier appelé Inbox :
// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");
Vérifier la classe de conteneur du dossier
Lors de la création de nouveaux dossiers ou de l’ajout d’éléments à des dossiers existants, il est important de s’assurer que la classe de conteneur du nouvel élément ou dossier correspond à celle du dossier parent afin de maintenir la hiérarchie organisationnelle dans le fichier de stockage PST. À cette fin, Aspose.Email possède le EnforceContainerClassMatching propriété du FolderCreationOptions classe. La propriété indique s’il faut imposer la vérification de la classe de conteneur du dossier ajouté par rapport à la classe de conteneur du dossier parent. Si elle est définie sur ’true’, une exception sera levée si les classes de conteneur ne correspondent pas. La valeur par défaut est ‘false’.
L’exemple de code suivant démontre l’utilisation du EnforceContainerClassMatching propriété permettant de contrôler si une exception doit être levée lors de l’ajout de dossiers avec des classes conteneur non correspondantes :
using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
// Create a standard Contacts folder with the IPF.Contacts container class.
var contacts = pst.CreatePredefinedFolder("Contacts", StandardIpmFolder.Contacts);
// An exception will not arise. EnforceContainerClassMatching is false by default.
contacts.AddSubFolder("Subfolder1", "IPF.Note");
// An exception will occur as the container class of the subfolder being added (IPF.Note)
// does not match the container class of the parent folder (IPF.Contact).
contacts.AddSubFolder("Subfolder3", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}
Remarque : assurez-vous d’une gestion appropriée des exceptions lors de l’application de la correspondance des classes conteneur afin d’éviter un comportement inattendu lors de la création de dossiers dans un PST.
Changer la classe conteneur du dossier
Il arrive parfois qu’il soit nécessaire de changer la classe conteneur du dossier. Un exemple courant est lorsque des messages de différents types (rendez‑vous, messages, etc.) sont ajoutés au même dossier. Dans ces cas, la classe du dossier doit être modifiée pour que tous les éléments du dossier s’affichent correctement. Le fragment de code suivant montre comment changer la classe conteneur d’un dossier dans un PST à cette fin.
using var pst = PersonalStorage.FromFile("PersonalStorage1.pst);
var folder = pst.RootFolder.GetSubFolder("Inbox");
folder.ChangeContainerClass("IPF.Note");
Ajout de fichiers au PST
La fonctionnalité clé de Microsoft Outlook est la gestion des e‑mails, calendriers, tâches, contacts et entrées de journal. De plus, des fichiers peuvent également être ajoutés à un dossier PST et le PST résultant conserve une trace des documents ajoutés. Aspose.Email offre la possibilité d’ajouter des fichiers à un dossier de la même manière que l’ajout de messages, contacts, tâches et entrées de journal à un PST. Le fragment de code suivant montre comment ajouter des documents à un dossier PST à l’aide d’Aspose.Email.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
var folder = personalStorage.RootFolder.AddSubFolder("Files");
// Add Document.doc file with the "IPM.Document" message class by default.
folder.AddFile(dataDir + "attachment_1.doc", null);
}
Ajout de messages aux fichiers PST
Avec Aspose.Email, vous pouvez ajouter des messages aux sous‑dossiers d’un fichier PST que vous avez créé ou chargé. Cet article ajoute deux messages depuis le disque au sous‑dossier Inbox d’un PST. Utilisez le PersonalStorage et FolderInfo classes pour ajouter des messages aux fichiers PST. Pour ajouter des messages au dossier Inbox d’un fichier PST :
- Créez une instance de la classe FolderInfo et chargez‑la avec le contenu du dossier Inbox.
- Ajoutez des messages depuis un disque au dossier Inbox en appelant le FolderInfo.AddMessage() méthode. Le FolderInfo La classe expose le AddMessages méthode qui permet d’ajouter un grand nombre de messages au dossier, réduisant les opérations d’E/S sur le disque et améliorant les performances.
Le fragment de code ci‑dessous montre comment ajouter des messages à un sous‑dossier PST appelé Inbox.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create new PST
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);
// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");
// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");
// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));
Ajouter des messages en masse avec performance améliorée
Ajouter des messages individuels à un PST implique davantage d’opérations d’E/S sur le disque et peut ralentir les performances. Pour améliorer les performances, les messages peuvent être ajoutés au PST en mode groupé afin de minimiser les opérations d’E/S. Le AddMessages la méthode vous permet d’ajouter des messages en masse et peut être utilisée comme dans les scénarios suivants. De plus, le MessageAdded événement qui se produit lorsqu’un message est ajouté au dossier.
Ajouter des messages depuis un autre PST
Pour ajouter des messages depuis un autre PST, utilisez le FolderInfo.EnumerateMapiMessages méthode qui renvoie IEnumerable<MapiMessage>:
using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");
// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");
destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());
// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine($"Added: {e.EntryId}");
}
Ajouter des messages depuis un répertoire
Pour ajouter des messages depuis un répertoire, créez le GetMessages(string pathToDir) méthode d’itérateur nommée qui renvoie IEnumerable<MapiMessage>:
using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));
// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
string[] files = Directory.GetFiles(pathToDir, "*.msg");
foreach (var file in files)
{
yield return MapiMessage.Load(file);
}
}
// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine($"Added: {e.EntryId}");
}
Charger des messages depuis le disque
Le fragment de code suivant montre comment charger des messages depuis un disque.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
{
FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(new MapiMessageCollection(msgFolderName));
}
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
Console.WriteLine(e.EntryId);
Console.WriteLine(e.Message.Subject);
}
Implémentation IEnumerable
Le fragment de code suivant montre comment l’implémentation IEnumerable peut être utilisée.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class MapiMessageCollection : IEnumerable<MapiMessage>
{
private string path;
public MapiMessageCollection(string path)
{
this.path = path;
}
public IEnumerator<MapiMessage> GetEnumerator()
{
return new MapiMessageEnumerator(path);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
private readonly string[] files;
private int position = -1;
public MapiMessageEnumerator(string path)
{
string path1 = RunExamples.GetDataDir_Outlook();
files = Directory.GetFiles(path1);
}
public bool MoveNext()
{
position++;
return (position < files.Length);
}
public void Reset()
{
position = -1;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public MapiMessage Current
{
get
{
try
{
return MapiMessage.FromFile(files[position]);
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
public void Dispose()
{
}
}