mailbox — Управление почтовыми ящиками в различных форматах
Исходный код: Lib/mailbox.py
Этот модуль определяет два класса, Mailbox и Message, для доступа и управления почтовыми ящиками на диске и сообщениями, которые они содержат. Mailbox предлагает отображение, подобное словарю, из ключей в сообщения. Message расширяет класс email.message модуля Message с состоянием и поведением, специфичным для формата. Поддерживаемые форматы почтовых ящиков: Maildir, mbox, MH, Babyl и MMDF.
См. также
-
Moduleemail -
Представление и манипулирование сообщениями.
Объекты почтовых ящиков
-
class mailbox.Mailbox -
Почтовый ящик, который можно просматривать и изменять.
Класс
Mailboxопределяет интерфейс и не предназначен для создания экземпляров. Вместо этого подклассы, специфичные для формата, должны наследоваться отMailbox, а ваш код должен создавать экземпляр конкретного подкласса.Интерфейс
Mailboxпохож на словарь, с небольшими ключами, соответствующими сообщениям. Ключи выдаются экземпляромMailbox, с которым они будут использоваться, и имеют смысл только для этого экземпляраMailbox. Ключ продолжает идентифицировать сообщение, даже если соответствующее сообщение изменено, например, заменено другим сообщением.Сообщения можно добавить в экземпляр
Mailboxс помощью метода, похожего на множество,add(), и удалить с помощью оператораdelили методов, похожих на множество,remove()иdiscard().Семантика интерфейса
Mailboxотличается от семантики словаря в нескольких важных аспектах. Каждый раз, когда запрашивается сообщение, генерируется новая представленность (обычно экземплярMessage) на основе текущего состояния почтового ящика. Аналогично, при добавлении сообщения в экземплярMailboxсодержимое предоставленного представления сообщения копируется. В обоих случаях экземплярMailboxне сохраняет ссылку на представление сообщения.Итератор
Mailboxпо умолчанию итерируется по представлениям сообщений, а не по ключам, как делает итератор словаря по умолчанию. Более того, модификация почтового ящика во время итерации безопасна и хорошо определена. Сообщения, добавленные в почтовый ящик после создания итератора, не будут видны итератору. Сообщения, удалённые из почтового ящика до того, как итератор их выдал, будут пропущены, хотя использование ключа из итератора может привести к исключениюKeyError, если соответствующее сообщение впоследствии будет удалено.Предупреждение
Будьте очень осторожны, изменяя почтовые ящики, которые могут одновременно изменяться другим процессом. Наиболее безопасный формат почтового ящика для таких задач — Maildir; старайтесь избегать использования форматов с единственным файлом, таких как mbox, для одновременной записи. Если вы изменяете почтовый ящик, вы обязательно должны заблокировать его, вызвав методы
lock()иunlock()перед чтением каких-либо сообщений в файле или внесением каких-либо изменений путём добавления или удаления сообщения. Отсутствие блокировки почтового ящика несёт риск потери сообщений или повреждения всего почтового ящика.Экземпляры
Mailboxимеют следующие методы:-
add(message) -
Добавить message в почтовый ящик и вернуть назначенный ему ключ.
Параметр message может быть экземпляром
Message, экземпляромemail.message.Message, строкой, строкой байтов или объектом, подобным файлу (который должен быть открыт в двоичном режиме). Если message является экземпляром соответствующего подклассаMessage, специфичного для формата (например, если это экземплярmboxMessage, а это экземплярmbox), используется его информация, специфичная для формата. В противном случае используются разумные значения по умолчанию для информации, специфичной для формата.Изменено в версии 3.2: Добавлена поддержка двоичного ввода.
-
remove(key) -
__delitem__(key) -
discard(key) -
Удалить сообщение, соответствующее key, из почтового ящика.
Если такого сообщения не существует, генерируется исключение
KeyError, если метод был вызван какremove()или__delitem__(), но исключение не генерируется, если метод был вызван какdiscard(). Поведениеdiscard()может быть предпочтительнее, если формат почтового ящика поддерживает одновременную модификацию другими процессами.
-
__setitem__(key, message) -
Заменить сообщение, соответствующее key, на message. Вызвать исключение
KeyError, если сообщение, соответствующее key, ещё не существует.Как и в случае с
add(), параметр message может быть экземпляромMessage, экземпляромemail.message.Message, строкой, строкой байтов или объектом, подобным файлу (который должен быть открыт в двоичном режиме). Если message является экземпляром соответствующего подклассаMessage, специфичного для формата (например, если это экземплярmboxMessage, а это экземплярmbox), используется его информация, специфичная для формата. В противном случае информация о формате сообщения, которое в настоящее время соответствует key, остаётся без изменений.
-
iterkeys() -
keys() -
Возвращает итератор по всем ключам, если вызвано как
iterkeys(), или возвращает список ключей, если вызвано какkeys().
-
itervalues() -
__iter__() -
values() -
Возвращает итератор по представлениям всех сообщений, если вызвано как
itervalues()или__iter__(), или возвращает список таких представлений, если вызвано какvalues(). Сообщения представлены как экземпляры соответствующего подклассаMessage, специфичного для формата, если при инициализации экземпляраMailboxне был указан пользовательский фабричный метод сообщений.Примечание
Поведение
__iter__()отличается от поведения словарей, которые итерируются по ключам.
-
iteritems() -
items() -
Возвращает итератор по парам (ключ, сообщение), где ключ — ключ, а сообщение — представление сообщения, если вызвано как
iteritems(), или возвращает список таких пар, если вызвано какitems(). Сообщения представлены как экземпляры соответствующего подклассаMessage, специфичного для формата, если при инициализации экземпляраMailboxне был указан пользовательский фабричный метод сообщений.
-
-
get(key, default=None) -
__getitem__(key) -
Возвращает представление сообщения, соответствующего ключу key. Если такого сообщения не существует, возвращается default, если метод был вызван как
get(), и возникает исключениеKeyError, если метод был вызван как__getitem__(). Сообщение представляется как экземпляр соответствующего подклассаMessageспецифичного для формата, если при инициализации экземпляраMailboxне был указан пользовательский фабричный метод для создания сообщения.
-
get_message(key) -
Возвращает представление сообщения, соответствующего ключу key, как экземпляр соответствующего подкласса
Message, специфичного для формата, или генерирует исключениеKeyError, если такого сообщения не существует.
-
get_bytes(key) -
Возвращает байтовое представление сообщения, соответствующего ключу key, или генерирует исключение
KeyError, если такого сообщения не существует.Новое в версии 3.2.
-
get_string(key) -
Возвращает строковое представление сообщения, соответствующего ключу key, или генерирует исключение
KeyError, если такого сообщения не существует. Сообщение обрабатывается черезemail.message.Messageдля преобразования в представление с 7-битным кодированием.
-
get_file(key) -
Возвращает файлоподобное представление сообщения, соответствующего ключу key, или генерирует исключение
KeyError, если такого сообщения не существует. Файлоподобный объект ведет себя так, как будто открыт в двоичном режиме. Этот файл должен быть закрыт, когда он больше не нужен.Изменено в версии 3.2: Объект файла действительно является двоичным файлом; ранее он неправильно возвращался в текстовом режиме. Также, файлоподобный объект теперь поддерживает протокол управления контекстом: вы можете использовать оператор
with, чтобы автоматически закрыть его.Примечание
В отличие от других представлений сообщений, файлоподобные представления не обязательно независимы от экземпляра
Mailbox, который их создал, или от базового почтового ящика. Более подробная документация предоставлена каждым подклассом.
-
__contains__(key) -
Возвращает
True, если ключ key соответствует сообщению,Falseв противном случае.
-
__len__() -
Возвращает количество сообщений в почтовом ящике.
-
clear() -
Удаляет все сообщения из почтового ящика.
-
pop(key, default=None) -
Возвращает представление сообщения, соответствующего ключу key, и удаляет сообщение. Если такого сообщения не существует, возвращает default. Сообщение представляется как экземпляр соответствующего подкласса
Messageспецифичного для формата, если при инициализации экземпляраMailboxне был указан пользовательский фабричный метод для создания сообщения.
-
popitem() -
Возвращает произвольную пару (key, message), где key — ключ, а message — представление сообщения, и удаляет соответствующее сообщение. Если почтовый ящик пуст, генерирует исключение
KeyError. Сообщение представляется как экземпляр соответствующего подклассаMessageспецифичного для формата, если при инициализации экземпляраMailboxне был указан пользовательский фабричный метод для создания сообщения.
-
update(arg) -
Параметр arg должен быть сопоставлением «ключ-значение» или итерируемым набором пар «ключ-значение». Обновляет почтовый ящик так, что для каждого заданного ключа и значения сообщение, соответствующее ключу, устанавливается в значение, как если бы использовалось
__setitem__(). Как и с__setitem__(), каждый ключ должен уже соответствовать сообщению в почтовом ящике, иначе будет генерироваться исключениеKeyError, поэтому в общем случае некорректно, чтобы arg был экземпляромMailbox.Примечание
В отличие от словарей, ключевые аргументы не поддерживаются.
-
flush() -
Записывает все ожидающие изменения в файловую систему. Для некоторых подклассов
Mailboxизменения всегда записываются немедленно, иflush()ничего не делает, но все равно следует привыкнуть вызывать этот метод.
-
lock() -
Приобретает эксклюзивную консультативную блокировку почтового ящика, чтобы другие процессы знали, что не должны его изменять.
ExternalClashErrorгенерируется, если блокировка недоступна. Конкретные механизмы блокировки зависят от формата почтового ящика. Вы всегда должны блокировать почтовый ящик перед внесением каких-либо изменений в его содержимое.
-
unlock() -
Освобождает блокировку почтового ящика, если таковая имеется.
-
close() -
Очищает почтовый ящик, разблокирует его при необходимости и закрывает все открытые файлы. Для некоторых подклассов
Mailboxэтот метод ничего не делает.
-
Maildir
-
class mailbox.Maildir(dirname, factory=None, create=True) -
Подкласс
Mailboxдля почтовых ящиков в формате Maildir. Параметр factory — вызываемый объект, принимающий представление сообщения в виде файлоподобного объекта (который ведет себя так, как будто открыт в двоичном режиме) и возвращающий пользовательское представление. Если factory —None, по умолчанию используетсяMaildirMessage. Если create —True, почтовый ящик создаётся, если он не существует.Если create —
Trueи путь dirname существует, он будет обрабатываться как существующий Maildir, без проверки структуры каталога.Имя dirname используется по историческим причинам вместо path.
Maildir — это основанный на каталогах формат почтового ящика, изобретённый для qmail mail transfer agent и теперь широко поддерживается другими программами. Сообщения в почтовом ящике Maildir хранятся в отдельных файлах внутри общей структуры каталогов. Эта конструкция позволяет нескольким независимым программам получать доступ к почтовым ящикам Maildir и изменять их без повреждения данных, поэтому блокировка файлов не требуется.
Почтовые ящики Maildir содержат три подкаталога:
tmp,new, иcur. Сообщения временно создаются в подкаталогеtmpи затем перемещаются в подкаталогnewдля завершения доставки. Пользовательский почтовый агент может затем переместить сообщение в подкаталогcurи сохранить информацию о состоянии сообщения в специальном разделе «info», добавленном к имени файла.Поддерживаются также папки, подобные тем, которые были введены Courier mail transfer agent. Любой подкаталог основного почтового ящика считается папкой, если первый символ его имени —
'.'. Имена папок представлены объектамиMaildirбез лидирующего'.'. Каждая папка сама по себе является почтовым ящиком Maildir, но не должна содержать других папок. Вместо этого логическое вложение обозначается через'.'для разделения уровней, например, «Archived.2005.07».Примечание
Спецификация Maildir требует использования двоеточия (
':') в некоторых именах файлов сообщений. Однако некоторые операционные системы не допускают этого символа в именах файлов. Если вы хотите использовать формат Maildir на такой операционной системе, вы должны указать другой символ. Знак восклицания ('!') — популярный выбор. Например:import mailbox mailbox.Maildir.colon = '!'
Атрибут
colonтакже может быть установлен на основе экземпляра.Экземпляры
Maildirимеют все методыMailbox, а также следующие:-
list_folders() -
Возвращает список имён всех папок.
-
get_folder(folder) -
Возвращает экземпляр
Maildir, представляющий папку с именем folder. Если папка не существует, возникает исключениеNoSuchMailboxError.
-
add_folder(folder) -
Создаёт папку с именем folder и возвращает экземпляр
Maildir, представляющий её.
-
remove_folder(folder) -
Удаляет папку с именем folder. Если папка содержит сообщения, возникает исключение
NotEmptyErrorи папка не удаляется.
-
clean() -
Удаляет временные файлы из почтового ящика, которые не использовались в течение последних 36 часов. Спецификация Maildir гласит, что программы чтения почты должны делать это время от времени.
Некоторые методы
Mailbox, реализованные вMaildir, заслуживают особого внимания:-
add(message) -
__setitem__(key, message) -
update(arg) -
Предупреждение
Эти методы генерируют уникальные имена файлов на основе текущего идентификатора процесса. При использовании нескольких потоков могут произойти незамеченные конфликты имён и привести к повреждению почтового ящика, если потоки не скоординированы для предотвращения одновременного использования этих методов для манипулирования одним и тем же почтовым ящиком.
-
flush() -
Все изменения в почтовых ящиках Maildir применяются немедленно, поэтому этот метод ничего не делает.
-
lock() -
unlock() -
Почтовые ящики Maildir не поддерживают (и не требуют) блокировки, поэтому эти методы ничего не делают.
-
close() -
Экземпляры
Maildirне сохраняют открытые файлы, а почтовые ящики не поддерживают блокировку, поэтому этот метод ничего не делает.
-
get_file(key) -
В зависимости от платформы может быть невозможно изменить или удалить базовое сообщение, пока возвращенный файл остаётся открытым.
-
См. также
- maildir man page from Courier
-
Спецификация формата. Описывает распространенное расширение для поддержки папок.
- Использование формата maildir
-
Заметки о формате Maildir автором, включая обновлённую схему создания имен и подробности об «info».
mbox
-
class mailbox.mbox(path, factory=None, create=True) -
Подкласс
Mailboxдля почтовых ящиков в формате mbox. Параметр factory — вызываемый объект, принимающий представление сообщения в виде файлоподобного объекта (который ведет себя так, как будто открыт в двоичном режиме) и возвращающий пользовательское представление. Если factory —None, по умолчанию используетсяmboxMessage. Если create —True, почтовый ящик создаётся, если он не существует.Формат mbox — это классический формат хранения почты на системах Unix. Все сообщения в почтовом ящике mbox хранятся в одном файле, начало каждого сообщения обозначается строкой, первые пять символов которой — «From «.
Существует несколько вариаций формата mbox для устранения предполагаемых недостатков оригинального. В интересах совместимости
mboxреализует оригинальный формат, иногда называемый mboxo. Это означает, что заголовок Content-Length, если он присутствует, игнорируется, а все вхождения «From » в начале строки в теле сообщения преобразуются в «>From » при сохранении сообщения, хотя вхождения «>From » не преобразуются обратно в «From » при чтении сообщения.Некоторые методы
Mailbox, реализованные вmbox, заслуживают особого внимания:-
get_file(key) -
Использование файла после вызова
flush()илиclose()на экземпляреmboxможет привести к непредсказуемым результатам или возникновению исключения.
-
lock() -
unlock() -
Используются три механизма блокировки: блокировка с точкой и, если доступно, системные вызовы
flock()иlockf().
-
См. также
- mbox man page from tin
-
Спецификация формата, с подробностями о блокировке.
- Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad
-
Аргументы в пользу использования оригинального формата mbox вместо его вариаций.
- “mbox” is a family of several mutually incompatible mailbox formats
-
История вариаций mbox.
MH
-
class mailbox.MH(path, factory=None, create=True) -
Подкласс
Mailboxдля почтовых ящиков в формате MH. Параметр factory — вызываемый объект, принимающий представление сообщения, подобное файлу (как если бы оно было открыто в двоичном режиме), и возвращающий пользовательское представление. Если factory —None, в качестве стандартного представления сообщения используетсяMHMessage. Если create —True, почтовый ящик создаётся, если он не существует.MH — это основанный на каталогах формат почтовых ящиков, разработанный для системы обработки почты MH, почтового агента пользователя. Каждое сообщение в почтовом ящике MH хранится в собственном файле. Почтовый ящик MH может содержать другие почтовые ящики MH (называемые папками) помимо сообщений. Папки могут быть вложены неограниченно. Почтовые ящики MH также поддерживают последовательности, которые представляют собой именованные списки, используемые для логической группировки сообщений без перемещения их в подпапки. Последовательности определяются в файле, названном
.mh_sequencesв каждой папке.Класс
MHобрабатывает почтовые ящики MH, но не пытается эмулировать все поведения mh. В частности, он не изменяет и не подвержен влиянию файловcontextили.mh_profile, которые используются mh для хранения своего состояния и конфигурации.Экземпляры класса
MHимеют все методы классаMailboxв дополнение к следующим:-
list_folders() -
Возвращает список имён всех папок.
-
get_folder(folder) -
Возвращает экземпляр
MH, представляющий папку с именем folder. Если папка не существует, генерируется исключениеNoSuchMailboxError.
-
add_folder(folder) -
Создаёт папку с именем folder и возвращает экземпляр
MH, представляющий её.
-
remove_folder(folder) -
Удаляет папку с именем folder. Если папка содержит сообщения, будет выброшено исключение
NotEmptyError, и папка не будет удалена.
-
get_sequences() -
Возвращает словарь имён последовательностей, сопоставленных со списками ключей. Если последовательностей нет, возвращается пустой словарь.
-
set_sequences(sequences) -
Переопределяет последовательности, существующие в почтовом ящике, на основе sequences — словаря имён, сопоставленных со списками ключей, как возвращается методом
get_sequences().
-
pack() -
Переименовывает сообщения в почтовом ящике по мере необходимости, чтобы устранить пробелы в нумерации. Элементы в списке последовательностей обновляются соответственно.
Примечание
Уже выданные ключи становятся недействительными в результате этой операции и не должны использоваться в дальнейшем.
Некоторые методы
Mailbox, реализованные классомMH, заслуживают особого упоминания:-
remove(key) -
__delitem__(key) -
discard(key) -
Эти методы немедленно удаляют сообщение. Конвенция MH помечать сообщение для удаления, добавляя запятую перед его именем, не используется.
-
lock() -
unlock() -
Используются три механизма блокировки — точечная блокировка и, если доступны, системные вызовы
flock()иlockf(). Для почтовых ящиков MH блокировка почтового ящика означает блокировку файла.mh_sequencesи, только на время выполнения операций, затрагивающих их, блокировку отдельных файлов сообщений.
-
get_file(key) -
В зависимости от платформы может быть невозможно удалить основное сообщение, пока возвращаемый файл остаётся открытым.
-
flush() -
Все изменения в почтовых ящиках MH применяются немедленно, поэтому этот метод ничего не делает.
-
См. также
- nmh - Система обработки сообщений
-
Главная страница nmh, обновлённой версии оригинального mh.
- MH & nmh: Почта для пользователей и программистов
-
Книга под лицензией GPL о mh и nmh, содержащая информацию о формате почтовых ящиков.
Babyl
-
class mailbox.Babyl(path, factory=None, create=True) -
Подкласс
Mailboxдля почтовых ящиков в формате Babyl. Параметр factory — вызываемый объект, принимающий представление сообщения, подобное файлу (как если бы оно было открыто в двоичном режиме), и возвращающий пользовательское представление. Если factory —None, используется стандартное представление сообщенияBabylMessage. Если create —True, почтовый ящик создаётся, если он не существует.Babyl — это формат почтовых ящиков с одним файлом, используемый почтовым агентом Rmail, включённым в Emacs. Начало сообщения обозначается строкой, содержащей два символа Control-Underscore (
'\037') и Control-L ('\014'). Конец сообщения обозначается началом следующего сообщения или, в случае последнего сообщения, строкой, содержащей символ Control-Underscore ('\037').Сообщения в почтовом ящике Babyl имеют два набора заголовков: исходные заголовки и так называемые видимые заголовки. Видимые заголовки обычно являются подмножеством исходных заголовков, которые были отформатированы или сокращены для большей привлекательности. Каждое сообщение в почтовом ящике Babyl также имеет сопутствующий список метки, или короткие строки, которые записывают дополнительную информацию о сообщении, а список всех пользовательских меток, найденных в почтовом ящике, хранится в разделе опций Babyl.
Экземпляры
Babylимеют все методыMailboxплюс следующие:-
get_labels() -
Возвращает список имён всех пользовательских меток, используемых в почтовом ящике.
Примечание
Реальные сообщения проверяются, чтобы определить, какие метки существуют в почтовом ящике, а не список меток в разделе опций Babyl, но раздел Babyl обновляется всякий раз, когда почтовый ящик изменяется.
Некоторые методы
Mailbox, реализованные классомBabyl, заслуживают особого упоминания:-
get_file(key) -
В почтовых ящиках Babyl заголовки сообщения не хранятся непрерывно с телом сообщения. Для генерации представления, подобного файлу, заголовки и тело копируются вместе в экземпляр
io.BytesIO, который имеет API, идентичный API файла. В результате, файлоподобный объект действительно независим от базового почтового ящика, но не экономит память по сравнению с строковым представлением.
-
lock() -
unlock() -
Используются три механизма блокировки — точечная блокировка и, если доступны, системные вызовы
flock()иlockf().
-
См. также
- Формат файлов Babyl версии 5
-
Спецификация формата Babyl.
- Чтение почты с помощью Rmail
-
Справочник Rmail, содержащий информацию о семантике Babyl.
MMDF
-
class mailbox.MMDF(path, factory=None, create=True) -
Подкласс
Mailboxдля почтовых ящиков в формате MMDF. Параметр factory — вызываемый объект, принимающий представление сообщения в виде файла (как если бы оно было открыто в двоичном режиме) и возвращающий пользовательское представление. Если factory равенNone, по умолчанию используется представлениеMMDFMessage. Если create равноTrue, почтовый ящик создаётся, если он не существует.MMDF — формат почтового ящика, используемый в системе Multichannel Memorandum Distribution Facility (системе пересылки почты). Каждое сообщение имеет тот же формат, что и в формате mbox, но заключено в строки, содержащие четыре символа Control-A (
'\001') до и после сообщения. Как и в формате mbox, начало каждого сообщения обозначено строкой, первые пять символов которой — «From «, но дополнительные вхождения «From » не преобразуются в «>From » при сохранении сообщений, поскольку дополнительные разделительные строки сообщений предотвращают ошибочное принятие таких вхождений за начало последующих сообщений.Некоторые методы
Mailbox, реализованные вMMDF, заслуживают особого внимания:-
get_file(key) -
Использование файла после вызова
flush()илиclose()для экземпляраMMDFможет привести к непредсказуемым результатам или исключениям.
-
lock() -
unlock() -
Используются три механизма блокировки — точечная блокировка и, при наличии, системные вызовы
flock()иlockf().
-
См. также
- Страница руководства mmdf от tin
-
Спецификация формата MMDF из документации tin, программы просмотра новостей.
- MMDF
-
Статья Википедии, описывающая Multichannel Memorandum Distribution Facility.
Объекты сообщений
-
class mailbox.Message(message=None) -
Подкласс
email.messageмодуляMessage. Подклассыmailbox.Messageдобавляют состояние и поведение, специфичные для формата почтового ящика.Если message опущено, новый экземпляр создается в стандартном пустом состоянии. Если message является экземпляром
email.message.Message, его содержимое копируется; кроме того, любая информация, специфичная для формата, преобразуется, насколько это возможно, если message является экземпляромMessage. Если message представляет собой строку, байтовую строку или файл, он должен содержать сообщение, совместимое со спецификацией RFC 2822, которое читается и парсится. Файлы должны быть открыты в двоичном режиме, но файлы в текстовом режиме принимаются для обратной совместимости.Состояние и поведение, специфичные для формата, предлагаемые подклассами, варьируются, но в общем случае поддерживаются только те свойства, которые не специфичны для конкретного почтового ящика (хотя, предположительно, свойства специфичны для определённого формата почтового ящика). Например, смещения файлов для почтовых ящиков с одним файлом и имена файлов для почтовых ящиков на основе каталогов не сохраняются, потому что они применимы только к исходному почтовому ящику. Но сохраняется состояние, такое как прочитан ли пользователь сообщение или отмечен ли он как важный, потому что это относится к самому сообщению.
Нет требования, чтобы экземпляры
Messageиспользовались для представления сообщений, извлечённых с помощью экземпляровMailbox. В некоторых ситуациях время и память, необходимые для генерации представленийMessage, могут быть неприемлемыми. В таких ситуациях экземплярыMailboxтакже предлагают строковые и файловые представления, и при инициализации экземпляраMailboxможет быть указана пользовательская фабрика сообщений.
MaildirMessage
-
class mailbox.MaildirMessage(message=None) -
Сообщение со специфичным для Maildir поведением. Параметр message имеет такое же значение, как и в конструкторе
Message.Обычно приложение почтового клиента перемещает все сообщения в подкаталоге
newв подкаталогcurпосле первого открытия и закрытия почтового ящика, записывая, что сообщения являются старыми, независимо от того, были ли они прочитаны фактически. Каждое сообщение вcurимеет добавлена секцию «info» в имя файла для хранения информации о его состоянии. (Некоторые почтовые клиенты также могут добавлять секцию «info» к сообщениям вnew.) Секция «info» может принимать одну из двух форм: она может содержать «2», за которым следует список стандартных флагов (например, «2,FR»), или она может содержать «1», за которым следует так называемая экспериментальная информация. Стандартные флаги для сообщений Maildir следующие:Флаг
Значение
Описание
D
Черновик
В процессе написания
F
Помечено
Отмечено как важное
P
Обработано
Переслано, переотправлено или возвращено
R
Ответ
Написан ответ
S
Просмотрено
Прочитано
T
Удалено
Отмечено для последующего удаления
Экземпляры
MaildirMessageпредлагают следующие методы:-
get_subdir() -
Возвращает либо «new» (если сообщение должно храниться в подкаталоге
new), либо «cur» (если сообщение должно храниться в подкаталогеcur).Примечание
Сообщение обычно перемещается из
newвcurпосле доступа к почтовому ящику, независимо от того, было ли сообщение прочитано. Сообщениеmsgбыло прочитано, если"S" in msg.get_flags()равноTrue.
-
set_subdir(subdir) -
Устанавливает подкаталог, в котором должно храниться сообщение. Параметр subdir должен быть либо «new», либо «cur».
-
get_flags() -
Возвращает строку, определяющую установленные в настоящее время флаги. Если сообщение соответствует стандартному формату Maildir, результат является конкатенацией в алфавитном порядке нуля или одного появления каждого из
'D','F','P','R','S', и'T'. Если флаги не установлены или «info» содержит экспериментальные семантику, возвращается пустая строка.
-
set_flags(flags) -
Устанавливает флаги, указанные в flags, и сбрасывает все остальные.
-
add_flag(flag) -
Устанавливает флаги, указанные в flag, не изменяя других флагов. Для добавления нескольких флагов одновременно, flag может быть строкой, содержащей более одного символа. Текущее значение «info» перезаписывается независимо от того, содержит ли оно экспериментальную информацию или флаги.
-
remove_flag(flag) -
Сбрасывает флаги, указанные в flag, не изменяя других флагов. Для удаления нескольких флагов одновременно, flag может быть строкой, содержащей более одного символа. Если «info» содержит экспериментальную информацию, а не флаги, текущее значение «info» не изменяется.
-
get_date() -
Возвращает дату доставки сообщения как число с плавающей запятой, представляющее секунды с эпохи.
-
set_date(date) -
Устанавливает дату доставки сообщения на date, число с плавающей запятой, представляющее секунды с эпохи.
-
get_info() -
Возвращает строку, содержащую «info» для сообщения. Это полезно для доступа к и изменения «info», которые являются экспериментальными (то есть не являются списком флагов).
-
set_info(info) -
Устанавливает «info» на info, которое должно быть строкой.
-
При создании экземпляра MaildirMessage на основе экземпляра mboxMessage или MMDFMessage, заголовки Status и X-Status опускаются, и происходят следующие преобразования:
Результат | Состояние |
|---|---|
Подкаталог «cur» | Флаг O |
Флаг F | Флаг F |
Флаг R | Флаг A |
Флаг S | Флаг R |
Флаг T | Флаг D |
При создании экземпляра MaildirMessage на основе экземпляра MHMessage, происходят следующие преобразования:
Результат | Состояние |
|---|---|
Подкаталог «cur» | Последовательность «unseen» |
Подкаталог «cur» и флаг S | нет последовательности «unseen» |
Флаг F | Последовательность «flagged» |
Флаг R | Последовательность «replied» |
При создании экземпляра MaildirMessage на основе экземпляра BabylMessage, происходят следующие преобразования:
Результат | Состояние |
|---|---|
Подкаталог «cur» | Метка «unseen» |
Подкаталог «cur» и флаг S | нет метки «unseen» |
Флаг P | метка «forwarded» или «resent» |
Флаг R | метка «answered» |
Флаг T | метка «deleted» |
mboxMessage
-
class mailbox.mboxMessage(message=None) -
Сообщение с особенностями, специфичными для mbox. Параметр message имеет то же значение, что и у конструктора
Message.Сообщения в почтовом ящике mbox хранятся вместе в одном файле. Адрес отправителя из конверта и время доставки обычно хранятся в строке, начинающейся с «From », которая используется для обозначения начала сообщения, хотя точный формат этих данных сильно варьируется в разных реализациях mbox. Флаги, указывающие состояние сообщения, такие как прочитано или помечено как важное, обычно хранятся в заголовках Status и X-Status.
Условные флаги для сообщений mbox следующие:
Флаг
Значение
Описание
R
Прочитано
Прочитано
O
Старое
Ранее обнаружено MUA
D
Удалено
Помечено для последующего удаления
F
Помечено
Помечено как важное
A
Ответ
На него ответили
Флаги «R» и «O» хранятся в заголовке Status, а флаги «D», «F» и «A» — в заголовке X-Status. Флаги и заголовки обычно появляются в указанном порядке.
mboxMessageэкземпляры предлагают следующие методы:-
get_from() -
Возвращает строку, представляющую строку «From », которая отмечает начало сообщения в почтовом ящике mbox. В результатах исключаются «From » и конечная новая строка.
-
set_from(from_, time_=None) -
Устанавливает строку «From » в from_, которая должна быть указана без «From » или конечной новой строки. Для удобства можно указать time_, которое будет отформатировано соответствующим образом и добавлен к from_. Если time_ указан, он должен быть экземпляром
time.struct_time, кортежем, подходящим для передачи вtime.strftime(), илиTrue(для использованияtime.gmtime()).
-
get_flags() -
Возвращает строку, задающую установленные в данный момент флаги. Если сообщение соответствует стандартному формату, результат представляет собой конкатенацию нулевого или одного вхождения каждого из
'R','O','D','F', и'A'в указанном порядке.
-
set_flags(flags) -
Устанавливает флаги, указанные в flags, и сбрасывает все остальные. Параметр flags должен быть конкатенацией нулевого или более вхождений каждого из
'R','O','D','F', и'A'в любом порядке.
-
add_flag(flag) -
Устанавливает указанный(ые) флаг(и) в flag, не изменяя другие флаги. Для добавления более одного флага одновременно, flag может быть строкой более чем из одного символа.
-
remove_flag(flag) -
Сбрасывает указанный(ые) флаг(и) в flag, не изменяя другие флаги. Для удаления более одного флага одновременно, flag может быть строкой более чем из одного символа.
-
При создании экземпляра mboxMessage на основе экземпляра MaildirMessage, строка «From » генерируется на основе даты доставки экземпляра MaildirMessage, и происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаг R | Флаг S |
Флаг O | Подкаталог «cur» |
Флаг D | Флаг T |
Флаг F | Флаг F |
Флаг A | Флаг R |
При создании экземпляра mboxMessage на основе экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаги R и O | Нет последовательности «unseen» |
Флаг O | Последовательность «unseen» |
Флаг F | Последовательность «flagged» |
Флаг A | Последовательность «replied» |
При создании экземпляра mboxMessage на основе экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаги R и O | Нет метки «unseen» |
Флаг O | Метка «unseen» |
Флаг D | Метка «deleted» |
Флаг A | Метка «answered» |
При создании экземпляра Message на основе экземпляра MMDFMessage, строка «From » копируется, и все флаги соответствуют напрямую:
Результирующее состояние | Состояние |
|---|---|
Флаг R | Флаг R |
Флаг O | Флаг O |
Флаг D | Флаг D |
Флаг F | Флаг F |
Флаг A | Флаг A |
MHMessage
-
class mailbox.MHMessage(message=None) -
Сообщение с поведением, специфичным для MH. Параметр message имеет то же значение, что и в конструкторе
Message.Сообщения MH не поддерживают метки или флаги в традиционном смысле, но поддерживают последовательности, которые представляют собой логические группировки произвольных сообщений. Некоторые программы чтения почты (хотя и не стандартные mh и nmh) используют последовательности аналогично тому, как флаги используются в других форматах, как показано ниже:
Последовательность
Описание
непрочитанное
Не прочитано, но ранее обнаружено MUA
отвечено
На него ответили
отмечено
Отмечено как важное
MHMessageэкземпляры предлагают следующие методы:-
get_sequences() -
Возвращает список имён последовательностей, включающих это сообщение.
-
set_sequences(sequences) -
Устанавливает список последовательностей, включающих это сообщение.
-
add_sequence(sequence) -
Добавляет sequence в список последовательностей, включающих это сообщение.
-
remove_sequence(sequence) -
Удаляет sequence из списка последовательностей, включающих это сообщение.
-
При создании экземпляра MHMessage на основе экземпляра MaildirMessage происходят следующие преобразования:
Результирующее состояние | состояние |
|---|---|
Последовательность “непрочитанное” | нет флага S |
Последовательность “отвечено” | флаг R |
Последовательность “отмечено” | флаг F |
При создании экземпляра MHMessage на основе экземпляра mboxMessage или MMDFMessage заголовки Status и X-Status пропускаются, и происходят следующие преобразования:
Результирующее состояние | состояние |
|---|---|
Последовательность “непрочитанное” | нет флага R |
Последовательность “отвечено” | флаг A |
Последовательность “отмечено” | флаг F |
При создании экземпляра MHMessage на основе экземпляра BabylMessage происходят следующие преобразования:
Результирующее состояние | состояние |
|---|---|
Последовательность “непрочитанное” | метка “непрочитанное” |
Последовательность “отвечено” | метка “ответ” |
BabylMessage
-
class mailbox.BabylMessage(message=None) -
Сообщение со специфичным для Babyl поведением. Параметр message имеет тот же смысл, что и у конструктора
Message.Определенные метки сообщений, называемые атрибутами, по соглашению имеют специальное значение. Атрибуты следующие:
Метка
Описание
unseen
Не прочитанное, но ранее обнаруженное MUA
deleted
Отмечено для последующего удаления
filed
Скопировано в другой файл или почтовый ящик
answered
На него был дан ответ
forwarded
Переслано
edited
Изменено пользователем
resent
Переотправлено
По умолчанию Rmail отображает только видимые заголовки. Однако класс
BabylMessageиспользует исходные заголовки, поскольку они более полные. Видимые заголовки могут быть доступны явно, если это необходимо.BabylMessageэкземпляры предлагают следующие методы:-
get_labels() -
Возвращает список меток сообщения.
-
set_labels(labels) -
Устанавливает список меток сообщения на labels.
-
add_label(label) -
Добавляет label в список меток сообщения.
-
remove_label(label) -
Удаляет label из списка меток сообщения.
-
get_visible() -
Возвращает экземпляр
Message, у которого заголовки — видимые заголовки сообщения, а тело пустое.
-
set_visible(visible) -
Устанавливает видимые заголовки сообщения такими же, как заголовки в message. Параметр visible должен быть экземпляром
Message, экземпляромemail.message.Message, строкой или объектом, подобным файлу (который должен быть открыт в текстовом режиме).
-
update_visible() -
Когда исходные заголовки экземпляра
BabylMessageизменяются, видимые заголовки не обновляются автоматически. Этот метод обновляет видимые заголовки следующим образом: каждый видимый заголовок с соответствующим исходным заголовком устанавливается в значение исходного заголовка, каждый видимый заголовок без соответствующего исходного заголовка удаляется, и любые из Date, From, Reply-To, To, CC и Subject, которые присутствуют в исходных заголовках, но отсутствуют в видимых заголовках, добавляются к видимым заголовкам.
-
Когда экземпляр BabylMessage создаётся на основе экземпляра MaildirMessage, происходят следующие преобразования:
Результат | Состояние |
|---|---|
Метка “unseen” | Флаг S отсутствует |
Метка “deleted” | Флаг T присутствует |
Метка “answered” | Флаг R присутствует |
Метка “forwarded” | Флаг P присутствует |
Когда экземпляр BabylMessage создаётся на основе экземпляра mboxMessage или MMDFMessage, заголовки Status и X-Status пропускаются, и происходят следующие преобразования:
Результат | Состояние |
|---|---|
Метка “unseen” | Флаг R отсутствует |
Метка “deleted” | Флаг D присутствует |
Метка “answered” | Флаг A присутствует |
Когда экземпляр BabylMessage создаётся на основе экземпляра MHMessage, происходят следующие преобразования:
Результат | Состояние |
|---|---|
Метка “unseen” | Последовательность “unseen” |
Метка “answered” | Последовательность “replied” |
MMDFMessage
-
class mailbox.MMDFMessage(message=None) -
Сообщение со специфичным для MMDF поведением. Параметр message имеет то же значение, что и в конструкторе
Message.Как и сообщения в почтовом ящике mbox, сообщения MMDF хранятся с адресом отправителя и датой доставки в начальной строке, начинающейся с «From ». Также флаги, указывающие состояние сообщения, обычно хранятся в заголовках Status и X-Status.
Стандартные флаги для сообщений MMDF идентичны флагам сообщений mbox и приведены ниже:
Флаг
Значение
Описание
R
Прочитано
Прочитано
O
Старое
Ранее обнаружено MUA
D
Удалено
Отмечено для последующего удаления
F
Отмечено
Отмечено как важное
A
Ответ
На него ответили
Флаги «R» и «O» хранятся в заголовке Status, а флаги «D», «F» и «A» — в заголовке X-Status. Флаги и заголовки обычно появляются в указанном порядке.
MMDFMessageэкземпляры предлагают следующие методы, которые идентичны методамmboxMessage:-
get_from() -
Возвращает строку, представляющую строку «From », которая отмечает начало сообщения в почтовом ящике mbox. Ведущие «From » и завершающий символ новой строки исключены.
-
set_from(from_, time_=None) -
Устанавливает строку «From » в from_, которая должна быть указана без ведущих «From » или завершающего символа новой строки. Для удобства можно указать time_, которое будет отформатировано соответствующим образом и добавлено к from_. Если time_ указано, то это должен быть экземпляр
time.struct_time, кортеж, подходящий для передачи вtime.strftime(), илиTrue(чтобы использоватьtime.gmtime()).
-
get_flags() -
Возвращает строку, определяющую установленные в настоящее время флаги. Если сообщение соответствует стандартному формату, результат представляет собой конкатенацию в следующем порядке нуля или одного вхождения каждого из
'R','O','D','F', и'A'.
-
set_flags(flags) -
Устанавливает флаги, указанные в flags, и сбрасывает все остальные. Параметр flags должен быть конкатенацией в любом порядке нуля или более вхождений каждого из
'R','O','D','F', и'A'.
-
add_flag(flag) -
Устанавливает указанный(ые) флаг(и) flag без изменения других флагов. Чтобы добавить несколько флагов одновременно, flag может быть строкой из более чем одного символа.
-
remove_flag(flag) -
Сбрасывает указанный(ые) флаг(и) flag без изменения других флагов. Чтобы удалить несколько флагов одновременно, flag может быть строкой из более чем одного символа.
-
При создании экземпляра MMDFMessage на основе экземпляра MaildirMessage, строка «From » генерируется на основе даты доставки экземпляра MaildirMessage, и происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаг R | Флаг S |
Флаг O | Поддиректория «cur» |
Флаг D | Флаг T |
Флаг F | Флаг F |
Флаг A | Флаг R |
При создании экземпляра MMDFMessage на основе экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаги R и O | нет последовательности «unseen» |
Флаг O | последовательность «unseen» |
Флаг F | последовательность «flagged» |
Флаг A | последовательность «replied» |
При создании экземпляра MMDFMessage на основе экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние | Состояние |
|---|---|
Флаги R и O | нет метки «unseen» |
Флаг O | метка «unseen» |
Флаг D | метка «deleted» |
Флаг A | метка «answered» |
При создании экземпляра MMDFMessage на основе экземпляра mboxMessage, строка «From » копируется, и все флаги соответствуют напрямую:
Результирующее состояние | Состояние |
|---|---|
Флаг R | Флаг R |
Флаг O | Флаг O |
Флаг D | Флаг D |
Флаг F | Флаг F |
Флаг A | Флаг A |
Исключения
В модуле mailbox определены следующие классы исключений:
-
exception mailbox.Error -
Базовый класс для всех остальных модульных исключений.
-
exception mailbox.NoSuchMailboxError -
Вызывается, когда ожидается почтовый ящик, но он не найден, например, при создании подкласса
Mailboxс путем, которого не существует (и параметр create установлен вFalse), или при открытии папки, которой не существует.
-
exception mailbox.NotEmptyError -
Вызывается, когда почтовый ящик не пуст, но ожидается, что он пуст, например, при удалении папки, содержащей сообщения.
-
exception mailbox.ExternalClashError -
Вызывается, когда какое-либо условие, связанное с почтовым ящиком и не зависящее от программы, приводит к невозможности продолжения работы, например, при невозможности получить блокировку, которую уже держит другая программа, или когда уже существует уникальное сгенерированное имя файла.
-
exception mailbox.FormatError -
Вызывается, когда данные в файле не могут быть обработаны, например, когда экземпляр
MHпытается прочитать поврежденный.mh_sequencesфайл.
Примеры
Простой пример печати заголовков всех сообщений в почтовом ящике, которые кажутся интересными:
import mailbox
for message in mailbox.mbox('~/mbox'):
subject = message['subject'] # Could possibly be None.
if subject and 'python' in subject.lower():
print(subject)
Для копирования всех писем из почтового ящика Babyl в почтовый ящик MH, преобразуя всю информацию, специфичную для формата, которая может быть преобразована:
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
В этом примере почта из нескольких рассылок сортируется в разные почтовые ящики, при этом используются меры предосторожности, чтобы избежать повреждения почты из-за одновременного изменения другими программами, потери почты из-за прерывания программы или преждевременной остановки из-за некорректных сообщений в почтовом ящике:
import mailbox
import email.errors
list_names = ('python-list', 'python-dev', 'python-bugs')
boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
inbox = mailbox.Maildir('~/Maildir', factory=None)
for key in inbox.iterkeys():
try:
message = inbox[key]
except email.errors.MessageParseError:
continue # The message is malformed. Just leave it.
for name in list_names:
list_id = message['list-id']
if list_id and name in list_id:
# Get mailbox to use
box = boxes[name]
# Write copy to disk before removing original.
# If there's a crash, you might duplicate a message, but
# that's better than losing a message completely.
box.lock()
box.add(message)
box.flush()
box.unlock()
# Remove original message
inbox.lock()
inbox.discard(key)
inbox.flush()
inbox.unlock()
break # Found destination, so stop looking.
for box in boxes.itervalues():
box.close()
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/mailbox.html