Работа с сообщениями в файле PST

Добавление сообщений в файлы PST

Создание нового файла PST и добавление подпапок показало, как создать файл PST и добавить к нему подпапку. С помощью Aspose.Email вы можете добавлять сообщения в подпапки файла PST, который вы создали или загрузили. В данной статье добавляются два сообщения с диска в подпапку “Входящие” файла PST. Используйте классы PersonalStorage и FolderInfo, чтобы добавлять сообщения в файлы PST. Для добавления сообщений в папку “Входящие” файла PST:

  1. Создайте экземпляр класса FolderInfo и загрузите его содержимое папки “Входящие”.
  2. Добавьте сообщения с диска в папку “Входящие”, вызвав метод FolderInfo.AddMessage(). Класс FolderInfo предоставляет метод AddMessages, который позволяет добавлять большое количество сообщений в папку, уменьшая операции ввода-вывода на диск и улучшая производительность. Полный пример можно найти ниже, в разделе Добавление массовых сообщений.

Ниже приведены фрагменты кода, показывающие, как добавить сообщения в подпапку PST под названием “Входящие”.

For complete examples and data files, please go to https://github.com/kashifiqb/Aspose.Email-for-C
// Create new PST
System::SharedPtr<PersonalStorage> personalStorage = PersonalStorage::Create(dataDir, Aspose::Email::Outlook::Pst::FileFormatVersion::Unicode);
// Add new folder "Inbox"
personalStorage->get_RootFolder()->AddSubFolder(L"Inbox");
// Select the "Inbox" folder
System::SharedPtr<FolderInfo> inboxFolder = personalStorage->get_RootFolder()->GetSubFolder(L"Inbox");
// Add some messages to "Inbox" folder
inboxFolder->AddMessage(MapiMessage::FromFile(RunExamples::GetDataDir_Outlook() + L"MapiMsgWithPoll.msg"));

Сохранение сообщений напрямую из PST в поток

Чтобы сохранить сообщения из файла PST непосредственно в поток, не извлекая MsgInfo для сообщений, используйте метод SaveMessageToStream(). Следующий фрагмент кода показывает, как сохранить сообщения напрямую из PST в поток.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the file directory.
string dataDir = RunExamples.GetDataDir_Outlook();
// Load the Outlook file
string path = dataDir + "PersonalStorage.pst";
// Save message to MemoryStream
using (PersonalStorage personalStorage = PersonalStorage.FromFile(path))
{
FolderInfo inbox = personalStorage.RootFolder.GetSubFolder("Inbox");
foreach (MessageInfo messageInfo in inbox.EnumerateMessages())
{
using (MemoryStream memeorystream = new MemoryStream())
{
personalStorage.SaveMessageToStream(messageInfo.EntryIdString, memeorystream);
}
}
}
// Save message to file
using (PersonalStorage pst = PersonalStorage.FromFile(path))
{
FolderInfo inbox = pst.RootFolder.GetSubFolder("Inbox");
foreach (MessageInfo messageInfo in inbox.EnumerateMessages())
{
using (FileStream fs = File.OpenWrite(messageInfo.Subject + ".msg"))
{
pst.SaveMessageToStream(messageInfo.EntryIdString, fs);
}
}
}
using (PersonalStorage pst = PersonalStorage.FromFile(path))
{
FolderInfo inbox = pst.RootFolder.GetSubFolder("Inbox");
// To enumerate entryId of messages you may use FolderInfo.EnumerateMessagesEntryId() method:
foreach (string entryId in inbox.EnumerateMessagesEntryId())
{
using (MemoryStream ms = new MemoryStream())
{
pst.SaveMessageToStream(entryId, ms);
}
}
}

Извлечение n количества сообщений из файла PST

Следующий фрагмент кода показывает, как извлечь заданное количество сообщений из PST. Просто укажите индекс для первого сообщения и общее количество сообщений, которые необходимо извлечь.

For complete examples and data files, please go to https://github.com/kashifiqb/Aspose.Email-for-C
System::SharedPtr<FolderInfo> inbox = personalStorage->get_RootFolder()->GetSubFolder(L"Inbox");
// Extracts messages starting from 10th index top and extract total 100 messages
System::SharedPtr<MessageInfoCollection> messages = inbox->GetContents(10, 100);

Поиск сообщений и папок в PST по критерию

Файлы Личного Хранилища (PST) могут содержать огромное количество данных, и поиск данных, соответствующих определенному критерию, в таких больших файлах требует включения множества контрольных точек в код для фильтрации информации. С помощью класса PersonalStorageQueryBuilder Aspose.Email делает возможным поиск определенных записей в PST на основе заданного критерия поиска. В PST можно искать сообщения на основе параметров поиска, таких как отправитель, получатель, тема, важность сообщения, наличие вложений, размер сообщения и даже идентификатор сообщения. Класс PersonalStorageQueryBuilder также можно использовать для поиска подпапок.

Поиск сообщений и папок в PST

Следующий фрагмент кода показывает, как использовать класс PersonalStorageQueryBuilder для поиска содержимого в PST на основе различных критериев поиска. Например, он демонстрирует поиск в PST на основе:

  • Важности сообщения.
  • Класса сообщения.
  • Наличия вложений.
  • Размер сообщений.
  • Непрочитанных сообщений.
  • Непрочитанных сообщений с вложениями и
  • папок с определенным именем подпапки.
For complete examples and data files, please go to https://github.com/kashifiqb/Aspose.Email-for-C
// The path to the File directory.
System::String dataDir = RunExamples::GetDataDir_Outlook();
{
System::SharedPtr<PersonalStorage> personalStorage = PersonalStorage::FromFile(dataDir + L"Outlook.pst");
System::SharedPtr<FolderInfo> folder = personalStorage->get_RootFolder()->GetSubFolder(L"Inbox");
System::SharedPtr<PersonalStorageQueryBuilder> builder = System::MakeObject<PersonalStorageQueryBuilder>();
// High importance messages
builder->get_Importance()->Equals((int32_t)Aspose::Email::Outlook::Pst::MapiImportance::High);
System::SharedPtr<MessageInfoCollection> messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"Messages with High Imp:") + messages->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
builder->get_MessageClass()->Equals(L"IPM.Note");
messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"Messages with IPM.Note:") + messages->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
// Messages with attachments AND high importance
builder->get_Importance()->Equals((int32_t)Aspose::Email::Outlook::Pst::MapiImportance::High);
builder->HasFlags(Aspose::Email::Outlook::MapiMessageFlags::MSGFLAG_HASATTACH);
messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"Messages with atts: ") + messages->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
// Messages with size > 15 KB
builder->get_MessageSize()->Greater(15000);
messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"messags size > 15Kb:") + messages->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
// Unread messages
builder->HasNoFlags(Aspose::Email::Outlook::MapiMessageFlags::MSGFLAG_READ);
messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"Unread:") + messages->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
// Unread messages with attachments
builder->HasNoFlags(Aspose::Email::Outlook::MapiMessageFlags::MSGFLAG_READ);
builder->HasFlags(Aspose::Email::Outlook::MapiMessageFlags::MSGFLAG_HASATTACH);
messages = folder->GetContents(builder->GetQuery());
System::Console::WriteLine(System::String(L"Unread msgs with atts: ") + messages->get_Count());
// Folder with name of 'SubInbox'
builder = System::MakeObject<PersonalStorageQueryBuilder>();
builder->get_FolderName()->Equals(L"SubInbox");
System::SharedPtr<FolderInfoCollection> folders = folder->GetSubFolders(builder->GetQuery());
System::Console::WriteLine(System::String(L"Folder having subfolder: ") + folders->get_Count());
builder = System::MakeObject<PersonalStorageQueryBuilder>();
// Folders with subfolders
builder->HasSubfolders();
folders = folder->GetSubFolders(builder->GetQuery());
System::Console::WriteLine(folders->get_Count());
}

Извлечение вложений без извлечения полного сообщения

API Aspose.Email может быть использован для извлечения вложений из сообщений PST без предварительного извлечения полного сообщения. Метод ExtractAttachments класса IEWSClient можно использовать для этого. Следующий фрагмент кода показывает, как извлекать вложения, не извлекая полное сообщение.

For complete examples and data files, please go to https://github.com/kashifiqb/Aspose.Email-for-C
System::String dataDir = RunExamples::GetDataDir_Outlook();
{
System::SharedPtr<PersonalStorage> personalstorage = PersonalStorage::FromFile(dataDir + L"Outlook.pst");
System::SharedPtr<FolderInfo> folder = personalstorage->get_RootFolder()->GetSubFolder(L"Inbox");
{
auto messageInfo_enumerator = (folder->EnumerateMessagesEntryId())->GetEnumerator();
decltype(messageInfo_enumerator->get_Current()) messageInfo;
while (messageInfo_enumerator->MoveNext() && (messageInfo = messageInfo_enumerator->get_Current(), true))
{
System::SharedPtr<MapiAttachmentCollection> attachments = personalstorage->ExtractAttachments(messageInfo);
if (attachments->get_Count() != 0)
{
auto attachment_enumerator = (attachments)->GetEnumerator();
decltype(attachment_enumerator->get_Current()) attachment;
while (attachment_enumerator->MoveNext() && (attachment = attachment_enumerator->get_Current(), true))
{
if (!System::String::IsNullOrEmpty(attachment->get_LongFileName()))
{
if (attachment->get_LongFileName().Contains(L".msg"))
{
continue;
}
else
{
attachment->Save(dataDir + L"\\Attachments\\" + attachment->get_LongFileName());
}
}
}
}
}
}
}

Добавление файлов в PST

Основная функция Microsoft Outlook заключается в управлении электронной почтой, календарями, задачами, контактами и записями в журнале. Кроме того, файлы также могут быть добавлены в папку PST, и в результате PST сохраняет учетные записи добавленных документов. Aspose.Email предоставляет возможность добавлять файлы в папку так же, как и добавлять сообщения, контакты, задачи и записи в журнал в PST. Следующий фрагмент кода показывает, как добавлять документы в папку PST с использованием Aspose.Email.

For complete examples and data files, please go to https://github.com/kashifiqb/Aspose.Email-for-C
{
System::SharedPtr<PersonalStorage> personalStorage = PersonalStorage::Create(dataDir + L"Ps1_out.pst", Aspose::Email::Outlook::Pst::FileFormatVersion::Unicode);
System::SharedPtr<FolderInfo> folder = personalStorage->get_RootFolder()->AddSubFolder(L"Files");
// Add Document.doc file with the "IPM.Document" message class by default.
folder->AddFile(dataDir + L"attachment_1.doc", nullptr);
}