Створення і керування файлами PST
Окрім аналізу існуючого PST‑файлу, Aspose.Email надає засоби для створення PST‑файлу з нуля. У цій статті демонструється, як створювати Outlook PST‑файли та додавати до них підпапки або повідомлення.
Створення PST‑файлів
Щоб створити новий PST‑файл на локальному диску, вам потрібно використати PersonalStorage class. За допомоги цього класу ви можете створювати, читати та маніпулювати PST‑файлами у ваших .NET‑застосунках. Створіть файл сховища з нуля за допомогою одного рядка коду:
// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);
Додавання підпапок до PST
Додайте підпапку у корені файлу PST, отримавши доступ до кореневої папки, а потім викликавши AddSubFolder метод.
Наступний фрагмент коду показує, як додати підпапку під назвою Inbox:
// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");
Перевірка класу контейнера папки
При створенні нових папок або додаванні елементів до існуючих папок важливо переконатися, що клас контейнера нового елемента або папки відповідає класу контейнера батьківської папки, щоб зберегти ієрархічну структуру в PST‑файлі. Для цього Aspose.Email має. EnforceContainerClassMatching властивість FolderCreationOptions class. Властивість визначає, чи слід примусово перевіряти клас контейнера додаємої папки щодо класу контейнера батьківської папки. Якщо встановити ’true’, буде викинуто виняток, якщо класи контейнерів не збігаються. За замовчуванням — ‘false’.
Наведений зразок коду демонструє використання EnforceContainerClassMatching властивість для контролю, чи має бути виняток при додаванні тек з несумісними класами контейнерів:
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"});
}
Примітка: Забезпечте правильну обробку винятків при примусовому відповідності класу контейнера, щоб запобігти непередбачуваній поведінці під час створення тек у PST.
Змінити клас контейнера теки
Іноді необхідно змінити клас контейнера теки. Поширений приклад — коли повідомлення різних типів (зустрічі, листи тощо) додаються до однієї теки. У таких випадках клас теки потрібно змінити для всіх елементів, щоб вони відображалися правильно. Наведений фрагмент коду показує, як змінити клас контейнера теки у PST з цією метою.
using var pst = PersonalStorage.FromFile("PersonalStorage1.pst");
var folder = pst.RootFolder.GetSubFolder("Inbox");
folder.ChangeContainerClass("IPF.Note");
Додавання файлів до PST
Ключова функціональність Microsoft Outlook — це управління електронними листами, календарями, завданнями, контактами та журналами. Крім того, файли також можна додавати до теки PST, і отриманий PST зберігає запис доданих документів. Aspose.Email надає можливість додавати файли до теки так само, як і повідомлення, контакти, завдання та журнали до PST. Наведений фрагмент коду показує, як додати документи до теки PST за допомогою Aspose.Email.
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);
}
Додавання повідомлень до файлів PST
За допомогою Aspose.Email ви можете додавати повідомлення до підтеки файлу PST, який ви створили або завантажили. У цій статті додаються два повідомлення з диска до підтеки Inbox у PST. Використайте PersonalStorage і FolderInfo класи для додавання повідомлень до файлів PST. Щоб додати повідомлення до папки Inbox у файлі PST:
- Створіть екземпляр класу FolderInfo і завантажте його вмістом теки Inbox.
- Додайте повідомлення з диска до теки Inbox, викликавши FolderInfo.AddMessage() метод. FolderInfo клас надає AddMessages метод, який дозволяє додавати велику кількість повідомлень у теку, зменшуючи операції вводу/виводу на диск і підвищуючи продуктивність.
Фрагмент коду нижче показує, як додати повідомлення до підтеки PST під назвою Inbox.
// 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"));
Додати повідомлення пакетно з підвищеною продуктивністю
Додавання окремих повідомлень до PST передбачає більше операцій вводу/виводу на диск і може сповільнити продуктивність. Щоб підвищити продуктивність, повідомлення можна додавати до PST пакетно, мінімізуючи операції вводу/виводу. The AddMessages метод дозволяє додавати повідомлення пакетно і може бути використаний у наступних сценаріях. Крім того, MessageAdded подія виникає, коли повідомлення додається до папки.
Додати повідомлення з іншого PST
Щоб додати повідомлення з іншого PST, використовуйте FolderInfo.EnumerateMapiMessages метод, який повертає 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}");
}
Додати повідомлення з каталогу
Щоб додати повідомлення з каталогу, створіть GetMessages(string pathToDir) іменований метод-ітератор, який повертає 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}");
}
Завантаження повідомлень з диска
Наведений фрагмент коду показує, як завантажити повідомлення з диска.
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);
}
Реалізація IEnumerable
Наведений фрагмент коду показує, як можна використати реалізацію IEnumerable.
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()
{
}
}