Работа с сообщениями в файле PST
Добавление сообщений в файлы PST
Создание нового файла PST и добавление подпапок показало, как создать файл PST и добавить подкаталог к нему. С помощью Aspose.Email вы можете добавлять сообщения в подпапки файла PST, который вы создали или загрузили. В этой статье добавляются два сообщения с диска в подпапку “Входящие” файла PST. Используйте классы PersonalStorage и FolderInfo, чтобы добавлять сообщения в файлы PST. Чтобы добавить сообщения в папку “Входящие” файла PST:
- Создайте экземпляр класса FolderInfo и загрузите его содержимое из папки “Входящие”.
- Добавьте сообщения с диска в папку “Входящие”, вызвав метод FolderInfo.add_message(). Класс FolderInfo предоставляет метод add_messages, который позволяет добавлять большое количество сообщений в папку, уменьшая операции ввода-вывода на диск и улучшая производительность. Полный пример можно найти ниже, в разделе Добавление массовых сообщений.
Приведенные ниже фрагменты кода показывают, как добавить сообщения в подпапку PST с названием “Входящие”.
Добавление массовых сообщений
Добавление отдельных сообщений в PST подразумевает больше операций ввода-вывода на диск и, следовательно, может замедлить производительность. Для повышения производительности сообщения могут добавляться в PST в пакетном режиме, чтобы минимизировать операции ввода-вывода. Метод add_messages позволяет определить диапазон сообщений, добавляемых в PST для улучшения производительности, и может использоваться в следующих сценариях.
Загрузка сообщений с диска
Следующий фрагмент кода показывает, как загружать сообщения с диска.
from aspose.email.storage.pst import PersonalStorage, StandardIpmFolder, FileFormatVersion
def add_messages_in_bulk_mode(file_name, msg_folder_name):
with PersonalStorage.from_file(file_name) as personal_storage:
folder = personal_storage.root_folder.get_sub_folder("myInbox")
folder.add_messages(message_collection(msg_folder_name))
# Использование
add_messages_in_bulk_mode("file.pst", "folder_with_messages")
Реализация MapiMessageCollection
Следующий фрагмент кода показывает, как реализовать MapiMessageCollection.
import os
from aspose.email.mapi import MapiMessage
class MapiMessageEnumerator:
def __init__(self, path):
self.files = os.listdir(path)
self.position = -1
def __next__(self):
self.position += 1
if self.position < len(self.files):
return MapiMessage.from_file(os.path.join(self.path, self.files[self.position]))
else:
raise StopIteration
def __iter__(self):
return self
class MapiMessageCollection:
def __init__(self, path):
self.path = path
def __iter__(self):
return MapiMessageEnumerator(self.path)
# Использование
msg_folder_name = "\\Files\\msg"
message_collection = MapiMessageCollection(msg_folder_name)
for message in message_collection:
# Сделать что-то с каждым MapiMessage
pass
Добавление сообщений из другого PST
Для добавления сообщений из другого PST используйте метод FolderInfo.enumerate_mapi_messages(). Следующий фрагмент кода показывает, как добавить сообщения из других PST.
Получение информации о сообщениях из файла Outlook PST
В разделе Чтение файла PST Outlook и получение информации о папках и подпапках мы обсудили загрузку файла PST Outlook и просмотр его папок для получения имен папок и количества сообщений в них. Эта статья объясняет, как прочитать все папки и подпапки в файле PST и отобразить информацию о сообщениях, например, тему, отправителя и получателей. Файл PST Outlook может содержать вложенные папки. Чтобы получить информацию о сообщениях из них, а также из папок верхнего уровня, используйте рекурсивный метод для чтения всех папок. Следующий фрагмент кода показывает, как читать файл PST Outlook и рекурсивно отображать содержимое папки и сообщений.
Извлечение сообщений из файлов PST
Эта статья показывает, как читать файлы PST Microsoft Outlook и извлекать сообщения. Ниже приведен фрагмент кода, показывающий, как извлечь сообщения из файла PST.
from aspose.email.storage.pst import *
from aspose.email.mapi import MapiMessage
pst = PersonalStorage.from_file("Outlook.pst")
folderInfo = pst.root_folder
messageInfoCollection = folderInfo.get_contents()
for messageInfo in messageInfoCollection:
mapi = pst.extract_message(messageInfo)
print("Тема: " + mapi.subject)
print("Имя отправителя: " + mapi.sender_name)
print("Электронная почта отправителя: " + mapi.sender_email_address)
print("Кому: ", mapi.display_to)
print("Копия: ", mapi.display_cc)
print("Скрытая копия: ", mapi.display_bcc)
print("Время доставки: ", str(mapi.delivery_time))
print("Тело: " + mapi.body)
Извлечение n количества сообщений из файла PST
Чтобы извлечь определенное количество сообщений из файла PST, используйте метод get_contents(start_index, count) класса FolderInfo. Он принимает два параметра:
- start_index - номер стартового сообщения, например, 10-е;
- count - общее количество сообщений для извлечения.
Извлечение только необходимого подмножества сообщений за один раз может быть полезным для управления большими объемами данных электронной почты. Следующий пример кода демонстрирует реализацию этой функции:
import aspose.email as ae
pst = ae.storage.pst.PersonalStorage.from_file("my.pst")
folder = pst.root_folder.get_sub_folder("Inbox")
# Извлекает сообщения, начиная с 10 индекса и извлекает всего 100 сообщений
messages = folder.get_contents(10, 100)
Получение общего количества элементов из файла PST
Чтобы получить общее количество элементов (таких как электронные письма, встречи, задачи, контакты и т. д.), присутствующих в хранилище сообщений, используйте метод get_total_items_count() класса MessageStore. Он предоставляет удобный способ быстро собирать информацию о размере и объеме данных внутри хранилища. Следующий фрагмент кода показывает, как получить общее количество элементов из файла PST:
import aspose.email as ae
pst = ae.storage.pst.PersonalStorage.from_file("my.pst")
count = pst.store.get_total_items_count()
Удаление сообщений из файлов PST
Добавление сообщений в файлы PST показало, как добавлять сообщения в файлы PST. Конечно, также возможно удалить элементы (содержимое) из файла PST, и может быть желательно удалить сообщения оптом. Элементы из файла PST можно удалить с помощью метода FolderInfo.delete_child_item(). API также предоставляет метод FolderInfo.delete_child_items() для удаления элементов оптом из файла PST.
Удаление сообщений из файлов PST
Эта статья показывает, как использовать класс FolderInfo для доступа к конкретным папкам в файле PST. Чтобы удалить сообщения из подпапки “Отправленные” ранее загруженного или созданного файла PST:
- Создайте экземпляр класса FolderInfo и загрузите его содержимое из подпапки “Отправленные”.
- Удалите сообщения из папки “Отправленные”, вызвав метод FolderInfo.delete_child_item() и передав в качестве параметра MessageInfo.entry_id. Следующий фрагмент кода показывает, как удалить сообщения из подпапки “Отправленные” файла PST.
Удаление папок из файлов PST
Вы можете удалить папку PST, переместив ее в папку “Удаленные элементы”.
import aspose.email as ae
pst = ae.storage.pst.PersonalStorage.from_file("my.pst")
deleted_items_folder = pst.get_predefined_folder(ae.storage.pst.StandardIpmFolder.DELETED_ITEMS)
empty_folder = pst.root_folder.get_sub_folder("Пустая папка")
some_folder = pst.root_folder.get_sub_folder("Некоторая папка")
pst.move_item(empty_folder, deleted_items_folder)
pst.move_item(some_folder, deleted_items_folder)
Преимущество этого метода заключается в том, что удаленная папка может быть легко восстановлена.
some_folder = pst.root_folder.get_sub_folder("Некоторая папка")
pst.move_item(some_folder, pst.root_folder)
Вы также можете навсегда удалить папку из папки “Удаленные элементы”, если это необходимо.
deleted_items_folder.delete_child_item(empty_folder.entry_id)
Метод delete_child_item можно использовать для любых папок, если вы хотите немедленно и навсегда удалить подпапку, обходя папку “Удаленные элементы”.
some_folder = pst.root_folder.get_sub_folder("Некоторая папка")
pst.root_folder.delete_child_item(some_folder.entry_id)
Удаление элементов из PST
Во многих системах обмена сообщениями или почтовых клиентах каждому элементу (например, электронному письму, встрече или задаче) присваивается уникальный идентификатор, называемый идентификатором записи. Метод delete_item(entry_id) класса FolderInfo принимает этот идентификатор записи в качестве параметра и удаляет соответствующий элемент из хранилища сообщений. Используйте следующий код для удаления элемента из хранилища сообщений:
import aspose.email as ae
pst = ae.storage.pst.PersonalStorage.from_file("my.pst")
# ...
pst.delete_item(entry_id)
# ...
Удаление элементов оптом из файла PST
API Aspose.Email может использоваться для удаления элементов оптом из файла PST. Это достигается с помощью метода delete_child_items(), который принимает список идентификаторов записи, относящихся к элементам, которые необходимо удалить. Следующий фрагмент кода показывает, как удалять элементы оптом из файла PST.
Поиск сообщений и папок в PST по критериям
Файлы личного хранилища (PST) могут содержать огромное количество данных, и поиск данных, которые соответствуют определенному критерию в таких крупных файлах, требует включения множества контрольных точек в код для фильтрации информации. С помощью класса PersonalStorageQueryBuilder Aspose.Email делает возможным поиск конкретных записей в PST на основе заданного критерия поиска. PST можно искать по сообщениям на основе такие параметры поиска, как отправитель, получатель, тема, важность сообщения, наличие вложений, размер сообщения и даже идентификатор сообщения. Класс PersonalStorageQueryBuilder также может использоваться для поиска подпапок.
Поиск сообщений и папок в PST
Следующий фрагмент кода показывает, как использовать класс PersonalStorageQueryBuilder для поиска содержимого в PST на основе различных критериев поиска. Например, он показывает поиск PST на основе:
- Важности сообщения.
- Класса сообщения.
- Наличия вложений.
- Размер сообщения.
- Непрочитанных сообщений.
- Непрочитанных сообщений с вложениями, и
- папок с конкретным названием подпапки.
from aspose.email.mapi import MapiMessageFlags
from aspose.email.storage.pst import PersonalStorage, PersonalStorageQueryBuilder, MapiImportance
with PersonalStorage.from_file(data_dir + "my.pst") as personal_storage:
folder = personal_storage.root_folder.get_sub_folder("Inbox")
builder = PersonalStorageQueryBuilder()
# Сообщения с высокой важностью
builder.importance.equals(2)
messages = folder.get_contents(builder.get_query())
print("Сообщения с высокой важностью:", messages.count)
builder = PersonalStorageQueryBuilder()
builder.message_class.equals("IPM.Note")
messages = folder.get_contents(builder.get_query())
print("Сообщения с IPM.Note:", messages.count)
builder = PersonalStorageQueryBuilder()
# Сообщения с вложениями И с высокой важностью
builder.importance.equals(2)
builder.has_flags(MapiMessageFlags.HASATTACH)
messages = folder.get_contents(builder.get_query())
print("Сообщения с вложениями:", messages.count)
builder = PersonalStorageQueryBuilder()
# Сообщения размером > 15 КБ
builder.message_size.greater(15000)
messages = folder.get_contents(builder.get_query())
print("Сообщения размером > 15 КБ:", messages.count)
builder = PersonalStorageQueryBuilder()
# Непрочитанные сообщения
builder.has_no_flags(MapiMessageFlags.READ)
messages = folder.get_contents(builder.get_query())
print("Непрочитанные:", messages.count)
builder = PersonalStorageQueryBuilder()
# Непрочитанные сообщения с вложениями
builder.has_no_flags(MapiMessageFlags.READ)
builder.has_flags(MapiMessageFlags.HASATTACH)
messages = folder.get_contents(builder.get_query())
print("Непрочитанные сообщения с вложениями:", messages.count)
# Папка с названием 'SubInbox'
builder = PersonalStorageQueryBuilder()
builder.folder_name.equals("SubInbox")
folders = folder.get_sub_folders(builder.get_query())
print("Папка, имеющая подпапку:", folders.count)
builder = PersonalStorageQueryBuilder()
# Папки с подпапками
builder.has_subfolders()
folders = folder.get_sub_folders(builder.get_query())
print("Папки с подпапками:", folders.count)
Поиск строки в PST с параметром игнорирования регистра
Следующий фрагмент кода показывает, как искать строку в PST с параметром игнорирования регистра.
Поиск тем сообщений по нескольким ключевым словам в файле PST
Извлечение конкретных сообщений или элементов из файла личного хранения (PST) или хранилища сообщений путем реализации метода either(query1, query2) класса PersonalStorageQueryBuilder в вашем проекте. Он принимает два параметра, позволяющих объединить два разных запроса: query1 и query2 и найти тему сообщения, соответствующую любому из двух указанных слов. См. пример кода ниже:
import aspose.email as ae
builder1 = ae.storage.pst.PersonalStorageQueryBuilder()
builder1.subject.contains("Review") # 'Review' - ключевое слово для поиска
builder2 = ae.storage.pst.PersonalStorageQueryBuilder()
builder2.subject.contains("Error") # 'Error' - также ключевое слово для поиска
builder = ae.storage.pst.PersonalStorageQueryBuilder()
# темы сообщений должны содержать слова 'Review' или 'Error'
builder.either(builder1.get_query(), builder2.get_query())
pst = ae.storage.pst.PersonalStorage.from_file("my.pst")
folder = pst.root_folder.get_sub_folder("Inbox")
messages = folder.get_contents(builder.get_query())
for message in messages:
print(f"Сообщение: {message.subject}")
Перемещение элементов в другие папки файла PST
Aspose.Email делает возможным перемещение элементов из одной папки в другую в том же файле личного хранилища (PST). Это включает:
- Перемещение указанной папки в новый родительский каталог.
- Перемещение указанных сообщений в новую папку.
- Перемещение содержимого в новую папку.
- Перемещение подпапок в новый родительский каталог.
Следующий фрагмент кода показывает, как перемещать элементы, такие как сообщения и папки, из одной папки в другую в том же файле PST.
Обновление свойств сообщений в файле PST
Иногда требуется обновить определенные свойства сообщений, такие как изменение темы, маркировка важности сообщений и аналогичные другие. Обновление сообщения в файле PST с такими изменениями в свойствах сообщения можно достичь с помощью метода FolderInfo.change_messages. Эта статья показывает, как обновить сообщения оптом в файле PST для изменений в свойствах. Следующий фрагмент кода показывает, как обновить свойства сообщений в пакетном режиме для нескольких сообщений в файле PST.
from aspose.email.storage.pst import PersonalStorage, PersonalStorageQueryBuilder
from aspose.email.mapi import MapiPropertyTag, MapiProperty, MapiPropertyCollection
pst_file_path = data_dir + "ya4demia04vb.pst"
# Загрузка файла PST Outlook
with PersonalStorage.from_file(pst_file_path) as personal_storage:
# Получите необходимую подпапку
inbox = personal_storage.root_folder.get_sub_folder("Inbox")
# Найти сообщения, у которых From = "someuser@domain.com"
query_builder = PersonalStorageQueryBuilder()
query_builder.from_address.contains("someuser@domain.com")
# Получить содержимое из запроса
messages = inbox.get_contents(query_builder.get_query())
# Сохраните (MessageInfo, EntryIdString) в список
change_list = [message_info.entry_id_string for message_info in messages]
# Составьте новые свойства
updated_properties = MapiPropertyCollection()
updated_properties.add(
MapiPropertyTag.SUBJECT_W,
MapiProperty(MapiPropertyTag.SUBJECT_W, "Новая тема".encode("utf-16le"))
)
updated_properties.add(
MapiPropertyTag.IMPORTANCE,
MapiProperty(MapiPropertyTag.IMPORTANCE, bytearray([0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]))
)
# Обновить сообщения с From = "someuser@domain.com" новыми свойствами
inbox.change_messages(change_list, updated_properties)
Обновление пользовательских свойств в файле PST
Иногда требуется отметить элементы, которые обработаны в файле PST. API Aspose.Email позволяет достичь этого с помощью MapiProperty и MapiNamedProperty. Следующие методы полезны для достижения этого.
- ctor MapiNamedProperty(long propertyTag, string nameIdentifier, UUID propertyGuid, bytearray[] propertyValue)
- ctor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, bytearray[] propertyValue)
- FolderInfo.change_messages(MapiPropertyCollection updatedProperties) - изменяет все сообщения в папке
- PersonalStorage.change_messages(string entryId, MapiPropertyCollection updatedProperties) - изменяет свойства сообщения
from uuid import UUID
from aspose.email.storage.pst import PersonalStorage
from aspose.email.mapi import MapiNamedProperty, MapiPropertyCollection
from aspose.email.mapi import MapiPropertyType, MapiProperty, MapiPropertyTag
def generate_named_property_tag(index, data_type):
return (((0x8000 | index) << 16) | data_type) & 0x00000000FFFFFFFF
def run():
# Загрузка файла Outlook
pst_file_path = data_dir + "my.pst"
with PersonalStorage.from_file(pst_file_path) as personal_storage:
test_folder = personal_storage.root_folder.get_sub_folder("Inbox")
# Создание коллекции свойств сообщения для добавления или обновления
new_properties = MapiPropertyCollection()
# Обычные, пользовательские и именованные свойства PidLidLogFlags
mapi_property = MapiProperty(
MapiPropertyTag.ORG_EMAIL_ADDR_W,
"test_address@org.com".encode("utf-16le")
)
named_property1 = MapiNamedProperty(
generate_named_property_tag(0, MapiPropertyType.LONG),
"ITEM_ID",
UUID("00000000-0000-0000-0000-000000000000"),
bytearray([0x7B, 0x00, 0x00, 0x00])
)
named_property2 = MapiNamedProperty(
generate_named_property_tag(1, MapiPropertyType.LONG),
0x0000870C,
UUID("0006200A-0000-0000-C000-000000000046"),
bytearray([0x00, 0x00, 0x00, 0x00])
)
new_properties.add(named_property1.tag, named_property1)
new_properties.add(named_property2.tag, named_property2)
new_properties.add(mapi_property.tag, mapi_property)
test_folder.change_messages(test_folder.enumerate_messages_entry_id(), new_properties)
# Использование
run()
Извлечение вложений без извлечения полного сообщения
API Aspose.Email можно использовать для извлечения вложений из сообщений PST без предварительного извлечения полного сообщения. Метод extract_attachments класса IEWSClient можно использовать для этого. Следующий фрагмент кода показывает, как извлечь вложения без извлечения полного сообщения.
from aspose.email.storage.pst import PersonalStorage
with PersonalStorage.from_file(data_dir + "my.pst") as personal_storage:
folder = personal_storage.root_folder.get_sub_folder("Inbox")
for message_info in folder.enumerate_messages_entry_id():
attachments = personal_storage.extract_attachments(message_info)
if attachments.count != 0:
for attachment in attachments:
if attachment.long_file_name is not None and attachment.long_file_name.endswith(".msg"):
continue
else:
attachment.save(data_dir + attachment.long_file_name)
Добавление файлов в PST
Ключевая функция Microsoft Outlook заключается в управлении электронной почтой, календарями, задачами, контактами и записями журнала. Кроме того, файлы также могут быть добавлены в папку PST, и полученный PST сохраняет учетные данные добавленных документов. Aspose.Email предоставляет возможность добавлять файлы в папку аналогично добавлению сообщений, контактов, задач и записей журнала в PST. Следующий фрагмент кода показывает, как добавлять документы в папку PST с помощью Aspose.Email.