Работа с сообщениями в файле PST
Добавление сообщений в файлы PST
Создание нового файла PST и добавление подпапок показало, как создать файл PST и добавить к нему подпапку. С помощью Aspose.Email вы можете добавлять сообщения в подпапки файла PST, который вы создали или загрузили. В данной статье добавляются два сообщения с диска в подпапку “Входящие” файла PST. Используйте классы PersonalStorage и FolderInfo, чтобы добавлять сообщения в файлы PST. Для добавления сообщений в папку “Входящие” файла PST:
- Создайте экземпляр класса FolderInfo и загрузите его содержимое папки “Входящие”.
- Добавьте сообщения с диска в папку “Входящие”, вызвав метод 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); | |
} |