Trabajar con mensajes en un archivo PST
Agregar Mensajes a Archivos PST
Crear un Nuevo Archivo PST y Agregar Subcarpetas mostró cómo crear un archivo PST y agregarle una subcarpeta. Con Aspose.Email puede agregar mensajes a subcarpetas de un archivo PST que haya creado o cargado. Este artículo agrega dos mensajes desde el disco a la subcarpeta Inbox de un PST. Utilice el PersonalStorage y FolderInfo clases para agregar mensajes a archivos PST. Para agregar mensajes a la carpeta Inbox de un archivo PST:
- Cree una instancia de la clase FolderInfo y cárguela con el contenido de la carpeta Inbox.
- Agregar mensajes desde el disco a la carpeta Inbox llamando al FolderInfo.addMessage() método. El FolderInfo La clase expone el addMessages Método que permite agregar una gran cantidad de mensajes a la carpeta, reduciendo las operaciones de E/S al disco y mejorando el rendimiento. Un ejemplo completo se encuentra a continuación, en Agregar Mensajes en Bloque.
Los fragmentos de código a continuación muestran cómo agregar mensajes a una subcarpeta PST llamada Inbox.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Create new PST
PersonalStorage personalStorage = PersonalStorage.create(dataDir, FileFormatVersion.Unicode);
// Add new folder "Inbox"
personalStorage.getRootFolder().addSubFolder("Inbox");
// Select the "Inbox" folder
FolderInfo inboxFolder = personalStorage.getRootFolder().getSubFolder("Inbox");
// Add some messages to "Inbox" folder
inboxFolder.addMessage(MapiMessage.fromFile(dataDir + "MapiMsgWithPoll.msg"));
Agregar Mensajes en Bloque
Agregar mensajes individuales a un PST implica más operaciones de E/S al disco y, por lo tanto, puede ralentizar el rendimiento. Para mejorar el rendimiento, los mensajes pueden agregarse al PST en modo masivo para minimizar las operaciones de E/S. El addMessages(Iterable
Cargando Mensajes desde el Disco
El siguiente fragmento de código muestra cómo cargar mensajes desde el disco.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void addMessagesInBulkMode(String fileName, String msgFolderName) {
try (PersonalStorage personalStorage = PersonalStorage.fromFile(fileName)) {
FolderInfo folder = personalStorage.getRootFolder().getSubFolder("myInbox");
folder.MessageAdded.add(new MessageAddedEventHandler() {
public void invoke(Object sender, MessageAddedEventArgs e) {
onMessageAdded(sender, e);
}
});
folder.addMessages(new MapiMessageCollection(msgFolderName));
}
}
static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
System.out.println(e.getEntryId());
System.out.println(e.getMessage().getSubject());
}
Implementación Iterable
El siguiente fragmento de código muestra cómo crear una implementación Iterable.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public class MapiMessageCollection implements Iterable<MapiMessage> {
private final File folder;
public MapiMessageCollection(String folder) {
this.folder = new File(folder);
}
public Iterator<MapiMessage> iterator() {
return new MapiMessageIterator(folder.listFiles());
}
}
public class MapiMessageIterator implements Iterator<MapiMessage> {
private Queue<String> queue = new LinkedList<String>();
public MapiMessageIterator(File[] listOfFiles) {
for (File file : listOfFiles) {
queue.offer(file.getAbsolutePath());
}
}
public boolean hasNext() {
return !queue.isEmpty();
}
public MapiMessage next() {
return MapiMessage.fromFile(queue.poll());
}
}
Agregar mensajes de otro PST
Para agregar mensajes de otro PST, use el FolderInfo.enumerateMapiMessages() método que devuelve Iterable
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void bulkAddFromAnotherPst(String source) {
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage pst = PersonalStorage.fromFile(source, false)) {
try (PersonalStorage pstDest = PersonalStorage.fromFile(dataDir + "PersonalStorageFile1.pst")) {
// Get the folder by name
FolderInfo folderInfo = pst.getRootFolder().getSubFolder("Contacts");
MessageInfoCollection ms = folderInfo.getContents();
// Get the folder by name
FolderInfo f = pstDest.getRootFolder().getSubFolder("myInbox");
f.MessageAdded.add(new MessageAddedEventHandler() {
public void invoke(Object sender, MessageAddedEventArgs e) {
onMessageAdded(sender, e);
}
});
f.addMessages(folderInfo.enumerateMapiMessages());
FolderInfo fi = pstDest.getRootFolder().getSubFolder("myInbox");
MessageInfoCollection msgs = fi.getContents();
}
}
}
// Handles the MessageAdded event.
static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
System.out.println(e.getEntryId());
System.out.println(e.getMessage().getSubject());
}
Obtener información de mensajes de un archivo PST de Outlook
En Leer archivo PST de Outlook y obtener información de carpetas y subcarpetas, discutimos cómo cargar un archivo PST de Outlook y explorar sus carpetas para obtener los nombres de las carpetas y la cantidad de mensajes en ellas. Este artículo explica cómo leer todas las carpetas y subcarpetas del archivo PST y mostrar la información de los mensajes, por ejemplo, asunto, remitente y destinatarios. El FolderInfo.getContents() método se usa para mostrar información breve del mensaje como asunto, remitente, destinatarios. En términos de rendimiento, esta es la opción más adecuada para obtener información primaria sobre los mensajes. Para extraer datos completos del mensaje, el PersonalStorage.extractMessage() se proporciona un método. El archivo PST de Outlook puede contener carpetas anidadas. Para obtener información de los mensajes de estas, así como de las carpetas de nivel superior, use un método recursivo para leer todas las carpetas. El siguiente fragmento de código le muestra cómo leer un archivo PST de Outlook y mostrar el contenido de carpetas y mensajes de forma recursiva.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
try {
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(path);
// Get the Display Format of the PST file
System.out.println("Display Format: " + personalStorage.getFormat());
// Get the folders and messages information
FolderInfo folderInfo = personalStorage.getRootFolder();
// Call the recursive method to display the folder contents
displayFolderContents(folderInfo, personalStorage);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
// This is a recursive method to display contents of a folder
private static void displayFolderContents(FolderInfo folderInfo, PersonalStorage pst) {
// Display the folder name
System.out.println("Folder: " + folderInfo.getDisplayName());
System.out.println("==================================");
// Display information about messages inside this folder
MessageInfoCollection messageInfoCollection = folderInfo.getContents();
for (MessageInfo messageInfo : messageInfoCollection) {
System.out.println("Subject: " + messageInfo.getSubject());
System.out.println("Sender: " + messageInfo.getSenderRepresentativeName());
System.out.println("Recipients: " + messageInfo.getDisplayTo());
System.out.println("------------------------------");
}
// Call this method recursively for each subfolder
if (folderInfo.hasSubFolders() == true) {
for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
displayFolderContents(subfolderInfo, pst);
}
}
}
Extracción de mensajes de archivos PST
Este artículo muestra cómo leer archivos PST de Microsoft Outlook y extraer mensajes. Los mensajes se guardan luego en disco en formato MSG. El artículo también muestra cómo extraer un número específico de mensajes desde un archivo PST. Use un método recursivo para explorar todas las carpetas (incluyendo las anidadas) y llame al PersonalStorage.extractMessage() método para obtener mensajes de Outlook en una instancia de la MapiMessage clase. Después de eso, llame al MapiMessage.save() método para guardar el mensaje en disco o en un flujo en formato MSG. El siguiente fragmento de código le muestra cómo extraer mensajes de un archivo PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
try {
// load the Outlook PST file
PersonalStorage pst = PersonalStorage.fromFile(path);
// get the Display Format of the PST file
System.out.println("Display Format: " + pst.getFormat());
// get the folders and messages information
FolderInfo folderInfo = pst.getRootFolder();
// Call the recursive method to extract msg files from each folder
extractMsgFiles(folderInfo, pst);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
// This is a recursive method to display contents of a folder
private static void extractMsgFiles(FolderInfo folderInfo, PersonalStorage pst) {
// display the folder name
System.out.println("Folder: " + folderInfo.getDisplayName());
System.out.println("==================================");
// loop through all the messages in this folder
MessageInfoCollection messageInfoCollection = folderInfo.getContents();
for (MessageInfo messageInfo : messageInfoCollection) {
System.out.println("Saving message {0} ...." + messageInfo.getSubject());
// get the message in MapiMessage instance
MapiMessage message = pst.extractMessage(messageInfo);
// save this message to disk in msg format
message.save(message.getSubject().replace(":", " ") + ".msg");
// save this message to stream in msg format
ByteArrayOutputStream messageStream = new ByteArrayOutputStream();
message.save(messageStream);
}
// Call this method recursively for each subfolder
if (folderInfo.hasSubFolders() == true) {
for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
extractMsgFiles(subfolderInfo, pst);
}
}
}
Guardar mensajes directamente de PST a un flujo
Para guardar mensajes de un archivo PST directamente a un flujo, sin extraer el MsgInfo de los mensajes, use el saveMessageToStream() método. El siguiente fragmento de código le muestra cómo guardar mensajes directamente de PST a un flujo.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
// Save message to MemoryStream
try (PersonalStorage personalStorage = PersonalStorage.fromFile(path)) {
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
for (MessageInfo messageInfo : inbox.enumerateMessages()) {
try (ByteArrayOutputStream memeorystream = new ByteArrayOutputStream()) {
personalStorage.saveMessageToStream(messageInfo.getEntryIdString(), memeorystream);
}
}
}
// Save message to file
try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");
for (MessageInfo messageInfo : inbox.enumerateMessages()) {
try (FileOutputStream fs = new FileOutputStream(new File(dataDir + messageInfo.getSubject() + ".msg"))) {
pst.saveMessageToStream(messageInfo.getEntryIdString(), fs);
}
}
}
try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");
// To enumerate entryId of messages you may use FolderInfo.EnumerateMessagesEntryId() method:
for (String entryId : inbox.enumerateMessagesEntryId()) {
try (ByteArrayOutputStream ms = new ByteArrayOutputStream()) {
pst.saveMessageToStream(entryId, ms);
}
}
}
Extracción de n mensajes de un archivo PST
El siguiente fragmento de código le muestra cómo extraer un número determinado de mensajes de un PST. Simplemente proporcione el índice del primer mensaje y el número total de mensajes a extraer.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// Extracts messages starting from 10th index top and extract total 100 messages
MessageInfoCollection messages = inbox.getContents(10, 100);
Obtener el número total de elementos de un archivo PST
Aspose.Email proporciona el GetTotalItemsCount() método del PersonalStorage.Store propiedad. Devuelve el número total de elementos de mensaje contenidos en el PST.
El siguiente ejemplo de código muestra cómo obtener el recuento total de elementos (mensajes, citas, contactos, etc.) almacenados dentro del archivo PST:
try (PersonalStorage pst = PersonalStorage.fromFile("my.pst", false)) {
int count = pst.getStore().getTotalItemsCount();
}
Eliminar elementos de archivos PST
Agregar mensajes a archivos PST mostró cómo agregar mensajes a archivos PST. Por supuesto, también es posible eliminar elementos (contenidos) de un archivo PST y puede ser deseable eliminar mensajes en bloque. Los elementos de un archivo PST pueden eliminarse usando la FolderInfo.deleteChildItem() método. La API también proporciona FolderInfo.deleteChildItems() método para eliminar elementos en bloque del archivo PST.
Eliminar mensajes de archivos PST
Este artículo muestra cómo usar el FolderInfo clase para acceder a carpetas específicas en un archivo PST. Para eliminar mensajes de la subcarpeta Enviados de un archivo PST previamente cargado o creado:
- Cree una instancia de la FolderInfo clase y cargue su contenido con la subcarpeta Enviados.
- Eliminar mensajes de la carpeta Enviados llamando al FolderInfo.deleteChildItem() método y pasando el MessageInfo.EntryId como parámetro. El siguiente fragmento de código le muestra cómo eliminar mensajes de la subcarpeta Enviados de un archivo PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);
// Get the Sent items folder
FolderInfo folderInfo = personalStorage.getPredefinedFolder(StandardIpmFolder.SentItems);
MessageInfoCollection msgInfoColl = folderInfo.getContents();
for (MessageInfo msgInfo : msgInfoColl) {
System.out.println(msgInfo.getSubject() + ": " + msgInfo.getEntryIdString());
if (msgInfo.getSubject().equals("some delete condition")) {
// Delete this item
folderInfo.deleteChildItem(msgInfo.getEntryId());
System.out.println("Deleted this message");
}
}
Eliminar carpetas de archivos PST
Puede eliminar una carpeta PST moviéndola a la carpeta Elementos eliminados.
try (PersonalStorage pst = PersonalStorage.fromFile("test.pst")) {
FolderInfo deletedItemsFolder = pst.getPredefinedFolder(StandardIpmFolder.DeletedItems);
FolderInfo emptyFolder = pst.getRootFolder().getSubFolder("Empty folder");
FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
pst.moveItem(emptyFolder, deletedItemsFolder);
pst.moveItem(someFolder, deletedItemsFolder);
}
La ventaja de este método es que la carpeta eliminada puede recuperarse fácilmente.
FolderInfo someFolder = deletedItemsFolder.getSubFolder("Some folder");
pst.moveItem(someFolder, pst.getRootFolder());
También puede eliminar permanentemente una carpeta de la carpeta Elementos eliminados, si es necesario.
deletedItemsFolder.deleteChildItem(emptyFolder.getEntryId());
El deleteChildItem() el método puede usarse para cualquier carpeta si desea eliminar inmediatamente y de forma permanente una subcarpeta, evitando la carpeta Elementos eliminados.
FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
pst.getRootFolder().deleteChildItem(someFolder.getEntryId());
Eliminar elementos en bloque de un archivo PST
La API de Aspose.Email puede usarse para eliminar elementos en bloque de un archivo PST. Esto se logra usando la deleteChildItems() método que acepta una lista de elementos Entry ID que hacen referencia a los elementos a eliminar. El siguiente fragmento de código le muestra cómo eliminar elementos en bloque de un archivo PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
// Get Inbox SubFolder from Outlook file
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// Create instance of PersonalStorageQueryBuilder
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("someuser@domain.com");
MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());
List<String> deleteList = new ArrayList<String>();
for (MessageInfo messageInfo : messages) {
deleteList.add(messageInfo.getEntryIdString());
}
// delete messages having From = "someuser@domain.com"
inbox.deleteChildItems(deleteList);
}
Enumerar y recuperar mensajes eliminados suavemente de PST
Es posible recuperar mensajes eliminados permanentemente con Aspose.Email para Java. Su API permite enumerar mensajes eliminados suavemente en archivos PST. Los elementos eliminados suavemente son mensajes que se han eliminado dos veces: primero se movieron a la carpeta Elementos eliminados y luego se eliminaron de allí. Estos mensajes siguen siendo recuperables, y Aspose.Email proporciona una manera conveniente de acceder a ellos. El PersonalStorage.findAndEnumerateSoftDeletedItems() método devuelve una colección de RestoredItemEntry objetos. Cada entrada contiene:
- MapiMessage elemento — el mensaje recuperado.
- String FolderId - el identificador de la carpeta a la que originalmente pertenecía el mensaje.
El siguiente ejemplo de código demuestra cómo enumerar elementos de correo electrónico eliminados suavemente (recuperables) en archivos PST:
// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
// Enumerate soft-deleted items
for (RestoredItemEntry entry : pst.findAndEnumerateSoftDeletedItems()) {
MapiMessage message = entry.getItem();
String folderId = entry.getFolderId();
System.out.println("Subject: " + message.getSubject());
System.out.println("Deleted from Folder ID: " + folderId);
System.out.println("-----------------------------------");
}
}
Buscar mensajes y carpetas en un PST por criterio
Los archivos de Almacenamiento Personal (PST) pueden contener una gran cantidad de datos y buscar datos que cumplan un criterio específico en archivos tan grandes requiere incluir múltiples puntos de verificación en el código para filtrar la información. Con el PersonalStorageQueryBuilder clase, Aspose.Email permite buscar registros específicos en un PST basándose en un criterio de búsqueda especificado. Un PST puede buscarse por mensajes usando parámetros de búsqueda como remitente, destinatario, asunto, importancia del mensaje, presencia de archivos adjuntos, tamaño del mensaje e incluso ID del mensaje. El PersonalStorageQueryBuilder también puede usarse para buscar subcarpetas.
Buscar mensajes y carpetas en PST
El siguiente fragmento de código muestra cómo usar el PersonalStorageQueryBuilder clase para buscar contenidos en un PST basándose en diferentes criterios de búsqueda. Por ejemplo, muestra la búsqueda en un PST basada en:
- Importancia del mensaje.
- Clase del mensaje.
- Presencia de archivos adjuntos.
- Tamaño del mensaje.
- Fecha del mensaje.
- Mensajes no leídos.
- Mensajes no leídos con archivos adjuntos, y
- carpetas con un nombre de subcarpeta específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
FolderInfo folder = personalStorage.getRootFolder().getSubFolder("Inbox");
PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
// High importance messages
builder.getImportance().equals((int) MapiImportance.High);
MessageInfoCollection messages = folder.getContents(builder.getQuery());
System.out.println("Messages with High Imp:" + messages.size());
builder = new PersonalStorageQueryBuilder();
builder.getMessageClass().equals("IPM.Note");
messages = folder.getContents(builder.getQuery());
System.out.println("Messages with IPM.Note:" + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages with attachments AND high importance
builder.getImportance().equals((int) MapiImportance.High);
builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
messages = folder.getContents(builder.getQuery());
System.out.println("Messages with atts: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages with size > 15 KB
builder.getMessageSize().greater(15000);
messages = folder.getContents(builder.getQuery());
System.out.println("messags size > 15Kb:" + messages.size());
java.util.Calendar c = java.util.Calendar.getInstance();
builder = new PersonalStorageQueryBuilder();
// Messages by Current Date
// (Note that queries by date are not supported for Calendar Items in the Appointments folder)
builder.getSentDate().on(c.getTime(), DateComparisonType.ByDate);
messages = folder.getContents(builder.getQuery());
System.out.println("Messages by Current Date: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages between Dates
// (Note that queries by date are not supported for Calendar Items in the Appointments folder)
c.set(2020, 0, 1, 0, 0, 0);
builder.getSentDate().since(c.getTime());
c.set(2021, 0, 1, 0, 0, 0);
builder.getSentDate().before(c.getTime());
messages = folder.getContents(builder.getQuery());
System.out.println("Messages between Dates: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Unread messages
builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
messages = folder.getContents(builder.getQuery());
System.out.println("Unread:" + messages.size());
builder = new PersonalStorageQueryBuilder();
// Unread messages with attachments
builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
messages = folder.getContents(builder.getQuery());
System.out.println("Unread msgs with atts: " + messages.size());
// Folder with name of 'SubInbox'
builder = new PersonalStorageQueryBuilder();
builder.getFolderName().equals("SubInbox");
FolderInfoCollection folders = folder.getSubFolders(builder.getQuery());
System.out.println("Folder having subfolder: " + folders.size());
builder = new PersonalStorageQueryBuilder();
// Folders with subfolders
builder.hasSubfolders();
folders = folder.getSubFolders(builder.getQuery());
System.out.println(folders.size());
}
Buscar una cadena en PST con el parámetro Ignorar mayúsculas/minúsculas
El siguiente fragmento de código le muestra cómo buscar una cadena en PST con el parámetro de ignorar mayúsculas/minúsculas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "CaseSensitivity.pst", FileFormatVersion.Unicode)) {
FolderInfo folderinfo = personalStorage.createPredefinedFolder("Inbox", StandardIpmFolder.Inbox);
folderinfo.addMessage(MapiMessage.fromMailMessage(MailMessage.load("Sample.eml")));
PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
// IgnoreCase is True
builder.getFrom().contains("automated", true);
MailQuery query = builder.getQuery();
MessageInfoCollection coll = folderinfo.getContents(query);
System.out.println(coll.size());
}
Buscar asuntos de mensajes por múltiples palabras clave en un archivo PST
Puede usar MailQueryBuilder.or método para encontrar mensajes con un asunto que contenga al menos una de las palabras especificadas, como se muestra a continuación:
PersonalStorageQueryBuilder builder1 = new PersonalStorageQueryBuilder();
builder1.getSubject().contains("Review"); // 'Review' is key word for the search
PersonalStorageQueryBuilder builder2 = new PersonalStorageQueryBuilder();
builder2.getSubject().contains("Error"); // 'Error' is also key word for the search
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.or(builder1.getQuery(), builder2.getQuery()); // message subjects must contain 'Review' or 'Error' words
try (PersonalStorage storage = PersonalStorage.fromFile("example.pst"))
{
FolderInfo folderInfo = storage.getRootFolder().getSubFolder("Inbox");
MessageInfoCollection messageInfos = folderInfo.getContents(queryBuilder.getQuery());
for (MessageInfo messageInfo : messageInfos)
{
System.out.println(messageInfo.getSubject());
}
}
Recuperación paginada del contenido de carpetas PST
Mejore el rendimiento y el control de su aplicación al navegar por carpetas grandes. Recupere el contenido de la carpeta de forma paginada usando la sobrecarga de Aspose.Email del getContents método. Este método - FolderInfo.getContents(MailQuery query, int startIndex, int count) - recupera un subconjunto de mensajes que coinciden con la consulta especificada, comenzando desde un índice dado y limitado por una cantidad. El siguiente ejemplo de código demuestra la recuperación paginada y el procesamiento de mensajes filtrados de una carpeta PST:
// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
// Access a specific subfolder
FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");
// Build a query to filter messages by sender address
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("report-service", true);
// Define the page size
int pageSize = 5;
// Retrieve and process messages in pages
for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
int startIndex = pageIndex * pageSize;
// Get a page of messages
MessageInfoCollection messages = folder.getContents(queryBuilder.getQuery(), startIndex, pageSize);
for (MessageInfo messageInfo : messages) {
// Output basic info about each message
System.out.println("Subject: " + messageInfo.getSubject() + ", Sender: " + messageInfo.getSenderRepresentativeName());
}
}
}
Mover elementos a otras carpetas del archivo PST
Aspose.Email permite mover elementos desde una carpeta de origen a otra carpeta en el mismo archivo de Almacenamiento Personal (PST). Esto incluye:
- Moviendo una carpeta especificada a una nueva carpeta padre.
- Moviendo un mensaje especificado a una nueva carpeta.
- Moviendo el contenido a una nueva carpeta.
- Moviendo subcarpetas a una nueva carpeta padre.
El siguiente fragmento de código le muestra cómo mover elementos como mensajes y carpetas desde una carpeta de origen a otra carpeta en el mismo archivo PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
try (PersonalStorage personalStorage = PersonalStorage.fromFile("test.pst")) {
FolderInfo inbox = personalStorage.getPredefinedFolder(StandardIpmFolder.Inbox);
FolderInfo deleted = personalStorage.getPredefinedFolder(StandardIpmFolder.DeletedItems);
FolderInfo subfolder = inbox.getSubFolder("Subfolder");
// Move folder and message to the Deleted Items
personalStorage.moveItem(subfolder, deleted);
MessageInfoCollection contents = subfolder.getContents();
personalStorage.moveItem(contents.get(0), deleted);
// Move all inbox subfolders and subfolder contents to the Deleted Items
inbox.moveSubfolders(deleted);
subfolder.moveContents(deleted);
}
Actualizando propiedades del mensaje en un archivo PST
A veces es necesario actualizar ciertas propiedades de los mensajes, como cambiar el asunto, marcar la importancia del mensaje y otras similares. Actualizar un mensaje en un archivo PST con dichos cambios en las propiedades del mensaje puede lograrse usando el FolderInfo.changeMessages método. Este artículo muestra cómo actualizar mensajes en bloque en un archivo PST para cambios en las propiedades. El siguiente fragmento de código muestra cómo actualizar las propiedades de los mensajes en modo masivo para múltiples mensajes en un archivo PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);
// Get Requierd Subfolder
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// find messages having From = "someuser@domain.com"
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("someuser@domain.com");
// Get Contents from Query
MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());
// Save (MessageInfo,EntryIdString) in List
List<String> changeList = new ArrayList<String>();
for (MessageInfo messageInfo : messages) {
changeList.add(messageInfo.getEntryIdString());
}
// Compose the new properties
MapiPropertyCollection updatedProperties = new MapiPropertyCollection();
updatedProperties.add(MapiPropertyTag.PR_SUBJECT_W, new MapiProperty(MapiPropertyTag.PR_SUBJECT_W, "New Subject".getBytes(Charset.forName("utf-16le"))));
updatedProperties.add(MapiPropertyTag.PR_IMPORTANCE, new MapiProperty(MapiPropertyTag.PR_IMPORTANCE, BitConverter.getBytesInt64(2)));
// update messages having From = "someuser@domain.com" with new properties
inbox.changeMessages(changeList, updatedProperties);
Actualizar propiedades personalizadas en un archivo PST
A veces es necesario marcar elementos que se han procesado dentro del archivo PST. La API de Aspose.Email permite lograr esto usando MapiProperty y MapiNamedProperty. Los siguientes métodos son útiles para lograrlo.
- constructor MapiNamedProperty(long propertyTag, String nameIdentifier, UUID propertyGuid, byte[] propertyValue)
- constructor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, byte[] propertyValue)
- FolderInfo.changeMessages(MapiPropertyCollection updatedProperties) - changes all messages in folder
- PersonalStorage.changeMessage(String entryId, MapiPropertyCollection updatedProperties) - change message properties
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
FolderInfo testFolder = personalStorage.getRootFolder().getSubFolder("Inbox");
// Create the collection of message properties for adding or updating
MapiPropertyCollection newProperties = new MapiPropertyCollection();
// Normal, Custom and PidLidLogFlags named property
MapiProperty property = new MapiProperty(MapiPropertyTag.PR_ORG_EMAIL_ADDR_W, "test_address@org.com".getBytes(Charset.forName("utf-16le")));
MapiProperty namedProperty1 = new MapiNamedProperty(generateNamedPropertyTag(0L, MapiPropertyType.PT_LONG), "ITEM_ID", UUID.randomUUID(),
BitConverter.getBytesInt64(123));
MapiProperty namedProperty2 = new MapiNamedProperty(generateNamedPropertyTag(1L, MapiPropertyType.PT_LONG), 0x0000870C,
UUID.fromString("0006200A-0000-0000-C000-000000000046"), BitConverter.getBytesInt64(0));
newProperties.add(namedProperty1.getTag(), namedProperty1);
newProperties.add(namedProperty2.getTag(), namedProperty2);
newProperties.add(property.getTag(), property);
testFolder.changeMessages(testFolder.enumerateMessagesEntryId(), newProperties);
}
}
private static long generateNamedPropertyTag(long index, int dataType) {
return (((0x8000 | index) << 16) | (long) dataType) & 0x00000000FFFFFFFFL;
}
Extraer adjuntos sin extraer el mensaje completo
La API de Aspose.Email puede usarse para extraer adjuntos de mensajes PST sin extraer primero el mensaje completo. El ExtractAttachments método de PersonalStorage puede usarse para hacer esto. El siguiente fragmento de código muestra cómo extraer adjuntos sin extraer el mensaje completo.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalstorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
FolderInfo folder = personalstorage.getRootFolder().getSubFolder("Inbox");
for (String messageInfo : folder.enumerateMessagesEntryId()) {
MapiAttachmentCollection attachments = personalstorage.extractAttachments(messageInfo);
if (attachments.size() != 0) {
for (MapiAttachment attachment : attachments) {
if (attachment.getLongFileName() != null && !attachment.getLongFileName().isEmpty()) {
if (attachment.getLongFileName().contains(".msg")) {
continue;
} else {
attachment.save(dataDir + "Attachments/" + attachment.getLongFileName());
}
}
}
}
}
}
Agregar archivos al PST
La funcionalidad clave de Microsoft Outlook es gestionar correos electrónicos, calendarios, tareas, contactos y entradas de diario. Además, se pueden añadir archivos a una carpeta PST y el PST resultante mantiene un registro de los documentos añadidos. Aspose.Email permite agregar archivos a una carpeta de la misma manera que agrega mensajes, contactos, tareas y entradas de diario al PST. El siguiente fragmento de código muestra cómo agregar documentos a una carpeta PST usando Aspose.Email.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode)) {
FolderInfo folder = personalStorage.getRootFolder().addSubFolder("Files");
// Add Document.doc file with the "IPM.Document" message class by default.
folder.addFile(dataDir + "attachment_1.doc", null);
}