Trabalhando com Mensagens em um Arquivo PST
Adicionando Mensagens a Arquivos PST
Criar um Novo Arquivo PST e Adicionar Subpastas mostrou como criar um arquivo PST e adicionar uma subpasta a ele. Com Aspose.Email, você pode adicionar mensagens a subpastas de um arquivo PST que você criou ou carregou. Este artigo adiciona duas mensagens do disco à subpasta Caixa de Entrada de um PST. Use as classes PersonalStorage e FolderInfo para adicionar mensagens a arquivos PST. Para adicionar mensagens à pasta Caixa de Entrada de um arquivo PST:
- Crie uma instância da classe FolderInfo e carregue-a com o conteúdo da pasta Caixa de Entrada.
- Adicione mensagens do disco à pasta Caixa de Entrada chamando o método FolderInfo.AddMessage(). A classe FolderInfo expõe o método AddMessages que permite adicionar um grande número de mensagens à pasta, reduzindo as operações de entrada/saída para o disco e melhorando o desempenho. Um exemplo completo pode ser encontrado abaixo, em Adicionando Mensagens em Massa.
Os trechos de código abaixo mostram como adicionar mensagens a uma subpasta PST chamada Caixa de Entrada.
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")); |
Salvando Mensagens Diretamente de PST para Stream
Para salvar mensagens de um arquivo PST diretamente para um stream, sem extrair o MsgInfo para mensagens, use o método SaveMessageToStream(). O seguinte trecho de código mostra como salvar mensagens diretamente de PST para stream.
// 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); | |
} | |
} | |
} |
Extraindo n Número de Mensagens de um Arquivo PST
O seguinte trecho de código mostra como extrair um número especificado de mensagens de um PST. Basta fornecer o índice da primeira mensagem e o número total de mensagens a serem extraídas.
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); |
Pesquisar Mensagens e Pastas em um PST por Critério
Os arquivos de Armazenamento Pessoal (PST) podem conter uma enorme quantidade de dados e procurar dados que atendem a um critério específico em arquivos tão grandes precisa incluir vários pontos de verificação no código para filtrar a informação. Com a classe PersonalStorageQueryBuilder, a Aspose.Email torna possível pesquisar registros específicos em um PST com base em um critério de pesquisa especificado. Um PST pode ser pesquisado por mensagens com base em parâmetros de pesquisa como remetente, destinatário, assunto, importância da mensagem, presença de anexos, tamanho da mensagem e até mesmo ID da mensagem. A PersonalStorageQueryBuilder também pode ser utilizada para pesquisar subpastas.
Pesquisando Mensagens e Pastas em PST
O seguinte trecho de código mostra como usar a classe PersonalStorageQueryBuilder para pesquisar conteúdos em um PST com base em diferentes critérios de pesquisa. Por exemplo, mostra como pesquisar um PST com base em:
- Importância da mensagem.
- Classe da mensagem.
- Presença de anexos.
- Tamanho da mensagem.
- Mensagens não lidas.
- Mensagens não lidas com anexos, e
- pastas com nome de subpasta específico.
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()); | |
} |
Extrair Anexos sem Extrair Mensagem Completa
A API Aspose.Email pode ser utilizada para extrair anexos de mensagens PST sem extrair primeiro a mensagem completa. O método ExtractAttachments da classe IEWSClient pode ser utilizado para isso. O seguinte trecho de código mostra como extrair anexos sem extrair a mensagem completa.
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()); | |
} | |
} | |
} | |
} | |
} | |
} | |
} |
Adicionando Arquivos a PST
A funcionalidade principal do Microsoft Outlook é gerenciar e-mails, calendários, tarefas, contatos e entradas de diário. Além disso, arquivos também podem ser adicionados a uma pasta PST e o PST resultante mantém registro dos documentos adicionados. Aspose.Email fornece a facilidade de adicionar arquivos a uma pasta da mesma forma, além de adicionar mensagens, contatos, tarefas e entradas do diário ao PST. O seguinte trecho de código mostra como adicionar documentos a uma pasta PST usando 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); | |
} |