Документация Python неофициальный перевод

mailbox.md

1586 строк · 93.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/mailbox.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.4. `mailbox` – Работа с почтовыми ящиками в различных форматах89Этот модуль определяет два класса: [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) и [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), для доступа к почтовым ящикам на диске и содержащимся в них сообщениям и управления ими. [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) предоставляет отображение в стиле словаря, связывающее ключи с сообщениями. [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message) расширяет класс `email.Message` модуля [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), добавляя состояние и поведение, зависящие от формата. Поддерживаемые форматы почтовых ящиков: Maildir, mbox, MH, Babyl и MMDF.1011> **См. также**12>13> **Модуль [`email`](https://python-all.ru/3.1/library/email.html#module-email)**14>15> Представление сообщений и управление ими.1617## 18.4.1. [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) объекты1819#### `class mailbox.Mailbox`2021Почтовый ящик, который можно просматривать и изменять.2223Класс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) определяет интерфейс и не предназначен для создания экземпляров. Вместо этого от [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) должны наследоваться подклассы, специфичные для формата, а код должен создавать экземпляры конкретного подкласса.2425Интерфейс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) напоминает словарь: небольшие ключи соответствуют сообщениям. Ключи выдаются экземпляром [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), с которым они будут использоваться, и имеют смысл только для этого экземпляра [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox). Ключ продолжает идентифицировать сообщение, даже если соответствующее сообщение изменяется, например, заменяется другим сообщением.2627Сообщения можно добавлять в экземпляр [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) с помощью метода, подобного set, [`add()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.add), и удалять с помощью инструкции `del` или методов, подобных set, [`remove()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.remove) и [`discard()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.discard).2829Семантика интерфейса [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) отличается от семантики словаря в некоторых важных аспектах. При каждом запросе сообщения создаётся новое представление (обычно экземпляр [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)) на основе текущего состояния почтового ящика. Аналогично, при добавлении сообщения в экземпляр [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) содержимое переданного представления сообщения копируется. Ни в одном из случаев экземпляр [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) не хранит ссылку на представление сообщения.3031Итератор по умолчанию [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) перебирает представления сообщений, а не ключи, как это делает итератор словаря по умолчанию. Более того, изменение почтового ящика во время итерации безопасно и имеет чётко определённое поведение. Сообщения, добавленные в почтовый ящик после создания итератора, не будут видны итератору. Сообщения, удалённые из почтового ящика до того, как итератор вернёт их, будут молча пропущены, хотя использование ключа от итератора может привести к исключению [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError), если соответствующее сообщение будет впоследствии удалено.3233> **Предупреждение**34>35> Следует соблюдать осторожность при изменении почтовых ящиков, которые могут одновременно изменяться другим процессом. Самый безопасный формат почтового ящика для таких задач – Maildir; следует избегать использования однофайловых форматов, таких как mbox, для одновременной записи. При изменении почтового ящика *необходимо* заблокировать его, вызвав методы [`lock()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.lock) и [`unlock()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.unlock) *перед* чтением любых сообщений в файле или внесением любых изменений путём добавления или удаления сообщения. Неблокировка почтового ящика может привести к потере сообщений или повреждению всего почтового ящика.3637Экземпляры [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) имеют следующие методы:3839#### `add(message)`4041Добавляет *сообщение* в почтовый ящик и возвращает ключ, который был ему присвоен.4243Параметр *message* может быть экземпляром [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), экземпляром `email.Message.Message`, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если *message* является экземпляром соответствующего подкласса [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), специфичного для формата (например, если это экземпляр [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage), а текущий объект – экземпляр [`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox)), то используется информация, специфичная для формата. В противном случае используются разумные значения по умолчанию.4445#### `remove(key)`4647#### `__delitem__(key)`4849#### `discard(key)`5051Удаляет сообщение, соответствующее *ключу*, из почтового ящика.5253Если такого сообщения не существует, исключение [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError) возбуждается, если метод был вызван как [`remove()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.remove) или [`__delitem__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__delitem__), но исключение не возбуждается, если метод был вызван как [`discard()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.discard). Поведение [`discard()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.discard) может быть предпочтительнее, если базовый формат почтового ящика поддерживает одновременное изменение другими процессами.5455#### `__setitem__(key, message)`5657Заменяет сообщение, соответствующее *key*, на *message*. Возбуждает исключение [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError), если сообщение, соответствующее *key*, ещё не существует.5859Как и для [`add()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.add), параметр *message* может быть экземпляром [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), экземпляром `email.Message.Message`, строкой или файлоподобным объектом (открытым в текстовом режиме). Если *message* является экземпляром соответствующего подкласса [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), специфичного для формата (например, если это экземпляр [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage), а текущий объект – экземпляр [`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox)), то используется информация, специфичная для формата. В противном случае информация, специфичная для формата сообщения, соответствующего ключу *key*, остаётся без изменений.6061#### `iterkeys()`6263#### `keys()`6465Возвращает итератор по всем ключам, если вызван как6667[`iterkeys()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.iterkeys)6869, или возвращает список ключей, если вызван как7071[`keys()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.keys)7273.7475#### `itervalues()`7677#### `__iter__()`7879#### `values()`8081Возвращает итератор по представлениям всех сообщений, если вызван как [`itervalues()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.itervalues) или [`__iter__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__iter__), или возвращает список таких представлений, если вызван как [`values()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.values). Сообщения представляются как экземпляры соответствующего формат-специфичного подкласса [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.8283> **Примечание**84>85> Поведение [`__iter__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__iter__) отличается от поведения словарей, которые перебирают ключи.8687#### `iteritems()`8889#### `items()`9091Возвращает итератор по парам (9293*ключ*9495,9697*сообщение*9899), где100101*ключ*102103– это ключ, а104105*сообщение*106107– представление сообщения, если метод вызван как108109[`iteritems()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.iteritems)110111, или возвращает список таких пар, если вызван как112113[`items()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.items)114115. Сообщения представляются как экземпляры соответствующего подкласса116117[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)118119, зависящего от формата, если только при инициализации экземпляра120121[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)122123не была указана пользовательская фабрика сообщений.124125#### `get(key, default=None)`126127#### `__getitem__(key)`128129Возвращает представление сообщения, соответствующего130131*ключу*132133. Если такое сообщение отсутствует, возвращается134135*значение по умолчанию*136137, если метод был вызван как138139[`get()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.get)140141, и возбуждается исключение142143[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)144145, если метод был вызван как146147[`__getitem__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__getitem__)148149. Сообщение представляется как экземпляр соответствующего подкласса150151[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)152153, зависящего от формата, если только при инициализации экземпляра154155[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)156157не была указана пользовательская фабрика сообщений.158159#### `get_message(key)`160161Возвращает представление сообщения, соответствующего162163*ключу*164165, в виде экземпляра соответствующего подкласса166167[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)168169, зависящего от формата, или возбуждает исключение170171[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)172173, если такое сообщение отсутствует.174175#### `get_string(key)`176177Возвращает строковое представление сообщения, соответствующего ключу178179*key*180181, или возбуждает исключение182183[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)184185, если такого сообщения нет.186187#### `get_file(key)`188189Возвращает файлоподобное представление сообщения, соответствующего ключу *key*, или возбуждает исключение [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError), если такого сообщения нет. Файлоподобный объект ведёт себя так, как если бы он был открыт в двоичном режиме. Этот файл следует закрыть, когда он больше не нужен.190191> **Примечание**192>193> В отличие от других представлений сообщений, файлоподобные представления не обязательно независимы от экземпляра [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), создавшего их, или от базового почтового ящика. Более подробная документация приведена в каждом подклассе.194195#### `__contains__(key)`196197Возвращает198199`True`200201, если202203*ключ*204205соответствует сообщению, и206207`False`208209в противном случае.210211#### `__len__()`212213Возвращает количество сообщений в почтовом ящике.214215#### `clear()`216217Удаляет все сообщения из почтового ящика.218219#### `pop(key, default=None)`220221Возвращает представление сообщения, соответствующего222223*ключу*224225, и удаляет сообщение. Если такое сообщение отсутствует, возвращает226227*значение по умолчанию*228229. Сообщение представляется как экземпляр соответствующего подкласса230231[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)232233, зависящего от формата, если только при инициализации экземпляра234235[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)236237не была указана пользовательская фабрика сообщений.238239#### `popitem()`240241Возвращает произвольную пару (242243*ключ*244245,246247*сообщение*248249), где250251*ключ*252253– это ключ, а254255*сообщение*256257– представление сообщения, и удаляет соответствующее сообщение. Если почтовый ящик пуст, возбуждает исключение258259[`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError)260261. Сообщение представляется как экземпляр соответствующего подкласса262263[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)264265, зависящего от формата, если только при инициализации экземпляра266267[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)268269не была указана пользовательская фабрика сообщений.270271#### `update(arg)`272273Параметр *arg* должен быть отображением *ключ**сообщение* или итерируемым объектом из пар (*ключ*, *сообщение*). Обновляет почтовый ящик так, что для каждого заданного *ключа* и *сообщения* сообщение, соответствующее *ключу*, устанавливается в *сообщение*, как если бы это было сделано с помощью [`__setitem__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__setitem__). Как и в случае с [`__setitem__()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.__setitem__), каждый *ключ* уже должен соответствовать сообщению в почтовом ящике, иначе будет возбуждено исключение [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError), поэтому в общем случае неверно, чтобы *arg* был экземпляром [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox).274275> **Примечание**276>277> В отличие от словарей, именованные аргументы не поддерживаются.278279#### `flush()`280281Записывает все ожидающие изменения в файловую систему. Для некоторых подклассов282283[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)284285изменения всегда записываются немедленно, и286287[`flush()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox.flush)288289ничего не делает, но всё равно стоит выработать привычку вызывать этот метод.290291#### `lock()`292293Захватывает монопольную рекомендательную блокировку почтового ящика, чтобы другие процессы не изменяли его. Если блокировка недоступна, возбуждается исключение294295[`ExternalClashError`](https://python-all.ru/3.1/library/mailbox.html#mailbox.ExternalClashError)296297. Конкретные механизмы блокировки зависят от формата почтового ящика. Следует298299*всегда*300301блокировать почтовый ящик перед внесением любых изменений в его содержимое.302303#### `unlock()`304305Освобождает блокировку почтового ящика, если она установлена.306307#### `close()`308309Сбрасывает почтовый ящик, разблокирует его при необходимости и закрывает все открытые файлы. Для некоторых подклассов310311[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)312313этот метод ничего не делает.314315### 18.4.1.1. [`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir)316317#### `class mailbox.Maildir(dirname, factory=None, create=True)`318319Подкласс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Maildir. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) используется как представление сообщения по умолчанию. Если *create* равно `True`, почтовый ящик создаётся, если он не существует.320321По историческим причинам *dirname* назван так, а не *path*.322323Maildir – это почтовый формат на основе каталогов, разработанный для агента передачи почты qmail и ныне широко поддерживаемый другими программами. Сообщения в почтовом ящике Maildir хранятся в отдельных файлах в общей структуре каталогов. Такая архитектура позволяет нескольким независимым программам получать доступ и изменять почтовые ящики Maildir без повреждения данных, поэтому файловая блокировка не требуется.324325Почтовые ящики Maildir содержат три подкаталога: `tmp`, `new` и `cur`. Сообщения сперва создаются в подкаталоге `tmp`, а затем перемещаются в подкаталог `new` для завершения доставки. Почтовый клиент может затем переместить сообщение в подкаталог `cur` и сохранить информацию о состоянии сообщения в специальном разделе «info», добавляемом к его имени файла.326327Также поддерживаются папки в стиле, введённом почтовым транспортным агентом Courier. Любой подкаталог основного почтового ящика считается папкой, если `'.'` является первым символом в его имени. Имена папок представляются объектами [`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir) без ведущего `'.'`. Каждая папка сама является почтовым ящиком Maildir, но не должна содержать другие папки. Вместо этого логическая вложенность указывается с помощью `'.'` для разделения уровней, например «Archived.2005.07».328329> **Примечание**330>331> Спецификация Maildir требует использования двоеточия (`':'`) в некоторых именах файлов сообщений. Однако некоторые операционные системы не допускают этот символ в именах файлов. Если вы хотите использовать формат, подобный Maildir, в такой операционной системе, следует указать другой символ для замены. Восклицательный знак (`'!'`) – популярный выбор. Например:332>333> ```python334> import mailbox335> mailbox.Maildir.colon = '!'336> ```337>338> Атрибут `colon` также может быть установлен для каждого экземпляра отдельно.339340Экземпляры [`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir) обладают всеми методами [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), а также следующими:341342#### `list_folders()`343344Возвращает список имён всех папок.345346#### `get_folder(folder)`347348Возвращает экземпляр349350[`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir)351352, представляющий папку с именем353354*folder*355356. Если папка не существует, возбуждается исключение357358[`NoSuchMailboxError`](https://python-all.ru/3.1/library/mailbox.html#mailbox.NoSuchMailboxError)359360.361362#### `add_folder(folder)`363364Создаёт папку с именем365366*folder*367368и возвращает экземпляр369370[`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir)371372, представляющий её.373374#### `remove_folder(folder)`375376Удаляет папку с именем377378*folder*379380. Если папка содержит какие-либо сообщения, будет выброшено исключение381382[`NotEmptyError`](https://python-all.ru/3.1/library/mailbox.html#mailbox.NotEmptyError)383384, и папка не будет удалена.385386#### `clean()`387388Удаляет временные файлы из почтового ящика, к которым не было обращений за последние 36 часов. Спецификация Maildir утверждает, что программы чтения почты должны делать это время от времени.389390Некоторые методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), реализованные в [`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir), заслуживают особых замечаний:391392#### `add(message)`393394#### `__setitem__(key, message)`395396#### `update(arg)`397398> **Предупреждение**399>400> Эти методы генерируют уникальные имена файлов на основе идентификатора текущего процесса. При использовании нескольких потоков возможны незамеченные конфликты имен, которые могут привести к повреждению почтового ящика, если потоки не скоординированы, чтобы избежать одновременного использования этих методов для управления одним и тем же почтовым ящиком.401402#### `flush()`403404Все изменения в почтовых ящиках Maildir применяются немедленно, поэтому этот метод ничего не делает.405406#### `lock()`407408#### `unlock()`409410Почтовые ящики Maildir не поддерживают (и не требуют) блокировку, поэтому эти методы ничего не делают.411412#### `close()`413414Экземпляры415416[`Maildir`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Maildir)417418не держат открытых файлов, а базовые почтовые ящики не поддерживают блокировку, поэтому этот метод ничего не делает.419420#### `get_file(key)`421422В зависимости от платформы может быть невозможно изменить или удалить нижележащее сообщение, пока возвращенный файл остается открытым.423424> **См. также**425>426> **[Страница руководства maildir из qmail](https://python-all.ru/3.1/library/mailbox.html)**427>428> Оригинальная спецификация формата.429>430> **[Использование формата maildir](https://python-all.ru/3.1/library/mailbox.html)**431>432> Заметки о Maildir от его создателя. Включают обновлённую схему создания имён и детали семантики «info».433>434> **[man-страница maildir из Courier](https://python-all.ru/3.1/library/mailbox.html)**435>436> Другая спецификация формата. Описывает распространённое расширение для поддержки папок.437438### 18.4.1.2. [`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox)439440#### `class mailbox.mbox(path, factory=None, create=True)`441442Подкласс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате mbox. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведёт себя как открытое в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) используется как представление сообщения по умолчанию. Если *create* равно `True`, почтовый ящик создаётся, если он не существует.443444Формат mbox – это классический формат хранения почты в системах Unix. Все сообщения в почтовом ящике mbox хранятся в одном файле, при этом начало каждого сообщения обозначается строкой, первые пять символов которой – «From ».445446Существует несколько вариантов формата mbox, призванных устранить предполагаемые недостатки оригинала. Ради совместимости [`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox) реализует оригинальный формат, который иногда называют *mboxo*. Это означает, что заголовок *Content-Length*, если он присутствует, игнорируется, а любые вхождения «From » в начале строки тела сообщения преобразуются в «\>From » при сохранении сообщения, хотя вхождения «\>From » не преобразуются обратно в «From » при чтении сообщения.447448Некоторые методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), реализованные в [`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox), заслуживают особых замечаний:449450#### `get_file(key)`451452Использование файла после вызова453454`flush()`455456или457458`close()`459460на экземпляре461462[`mbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mbox)463464может привести к непредсказуемым результатам или возбудить исключение.465466#### `lock()`467468#### `unlock()`469470Используются три механизма блокировки: точечная блокировка и, если доступны, системные вызовы471472`flock()`473474и475476`lockf()`477478.479480> **См. также**481>482> **[Страница руководства mbox из qmail](https://python-all.ru/3.1/library/mailbox.html)**483>484> Спецификация формата и его разновидностей.485>486> **[Страница man mbox из tin](https://python-all.ru/3.1/library/mailbox.html)**487>488> Другая спецификация формата, с подробностями о блокировке.489>490> **[Настройка Netscape Mail в Unix: почему формат Content-Length плох](https://python-all.ru/3.1/library/mailbox.html)**491>492> Аргумент в пользу использования оригинального формата mbox, а не его вариации.493>494> **[«mbox» – это семейство нескольких взаимно несовместимых форматов почтовых ящиков](https://python-all.ru/3.1/library/mailbox.html)**495>496> История вариаций mbox.497498### 18.4.1.3. [`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH)499500#### `class mailbox.MH(path, factory=None, create=True)`501502Подкласс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MH. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведёт себя так, как если бы было открыто в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, в качестве представления сообщения по умолчанию используется [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage). Если *create* равно `True`, почтовый ящик создаётся, если он не существует.503504MH – это формат почтового ящика, основанный на каталогах, разработанный для системы обработки сообщений MH (почтового клиента). Каждое сообщение в почтовом ящике MH находится в собственном файле. Почтовый ящик MH может содержать другие почтовые ящики MH (называемые *папками*) в дополнение к сообщениям. Папки могут быть вложены неограниченно. Почтовые ящики MH также поддерживают *последовательности*, которые представляют собой именованные списки, используемые для логической группировки сообщений без перемещения их в подпапки. Последовательности определяются в файле `.mh_sequences` в каждой папке.505506Класс [`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH) управляет почтовыми ящиками MH, но не пытается эмулировать все поведения **mh**. В частности, он не изменяет и не зависит от файлов `context` или `.mh_profile`, которые используются **mh** для хранения своего состояния и конфигурации.507508Экземпляры [`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH) имеют все методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) в дополнение к следующим:509510#### `list_folders()`511512Возвращает список имён всех папок.513514#### `get_folder(folder)`515516Возвращает экземпляр517518[`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH)519520, представляющий папку с именем521522*folder*523524. Исключение525526[`NoSuchMailboxError`](https://python-all.ru/3.1/library/mailbox.html#mailbox.NoSuchMailboxError)527528выбрасывается, если папка не существует.529530#### `add_folder(folder)`531532Создаёт папку с именем533534*folder*535536и возвращает экземпляр537538[`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH)539540, представляющий её.541542#### `remove_folder(folder)`543544Удаляет папку с именем545546*folder*547548. Если папка содержит какие-либо сообщения, будет выброшено исключение549550[`NotEmptyError`](https://python-all.ru/3.1/library/mailbox.html#mailbox.NotEmptyError)551552, и папка не будет удалена.553554#### `get_sequences()`555556Возвращает словарь, где имена последовательностей сопоставлены со списками ключей. Если последовательностей нет, возвращается пустой словарь.557558#### `set_sequences(sequences)`559560Переопределяет последовательности, существующие в почтовом ящике, на основе561562*sequences*563564, словаря имён, сопоставленных со списками ключей, как возвращаемый565566[`get_sequences()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH.get_sequences)567568.569570#### `pack()`571572Переименовывает сообщения в почтовом ящике по мере необходимости для устранения пропусков в нумерации. Записи в списке последовательностей обновляются соответствующим образом.573574> **Примечание**575>576> Ранее выданные ключи становятся недействительными в результате этой операции и не должны использоваться в дальнейшем.577578Некоторые методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), реализованные в [`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH), заслуживают особых замечаний:579580#### `remove(key)`581582#### `__delitem__(key)`583584#### `discard(key)`585586Эти методы немедленно удаляют сообщение. Соглашение MH помечать сообщение на удаление добавлением запятой к его имени не используется.587588#### `lock()`589590#### `unlock()`591592Используются три механизма блокировки – dot-блокировка и, если доступны,593594`flock()`595596и597598`lockf()`599600системные вызовы. Для почтовых ящиков MH блокировка почтового ящика означает блокировку файла601602`.mh_sequences`603604и, только на время любых операций, которые на них влияют, блокировку отдельных файлов сообщений.605606#### `get_file(key)`607608В зависимости от платформы может быть невозможно удалить базовое сообщение, пока возвращённый файл остаётся открытым.609610#### `flush()`611612Все изменения в почтовых ящиках MH применяются немедленно, поэтому этот метод ничего не делает.613614#### `close()`615616Экземпляры617618[`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH)619620не хранят открытых файлов, поэтому этот метод эквивалентен621622[`unlock()`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH.unlock)623624.625626> **См. также**627>628> **[nmh – система обработки сообщений](https://python-all.ru/3.1/library/mailbox.html)**629>630> Домашняя страница631>632> **nmh**633>634> , обновлённой версии исходного635>636> **mh**637>638> .639>640> **[MH и nmh: электронная почта для пользователей и программистов](https://python-all.ru/3.1/library/mailbox.html)**641>642> Книга, лицензированная под GPL, о643>644> **mh**645>646> и647>648> **nmh**649>650> , с некоторой информацией о формате почтового ящика.651652### 18.4.1.4. [`Babyl`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Babyl)653654#### `class mailbox.Babyl(path, factory=None, create=True)`655656Подкласс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Babyl. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведет себя так, как если бы было открыто в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то в качестве представления сообщения по умолчанию используется [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage). Если *create* равно `True`, почтовый ящик создается, если он не существует.657658Babyl – это однофайловый формат почтового ящика, используемый почтовым клиентом Rmail, входящим в состав Emacs. Начало сообщения обозначается строкой, содержащей два символа: Control-Подчёркивание (`'\037'`) и Control-L (`'\014'`). Конец сообщения обозначается началом следующего сообщения или, в случае последнего сообщения, строкой, содержащей символ Control-Подчёркивание (`'\037'`).659660Сообщения в почтовом ящике Babyl имеют два набора заголовков: исходные заголовки и так называемые видимые заголовки. Видимые заголовки обычно являются подмножеством исходных заголовков, которые были переформатированы или сокращены для большей привлекательности. Каждое сообщение в почтовом ящике Babyl также имеет сопутствующий список *меток* (коротких строк, которые записывают дополнительную информацию о сообщении), а список всех определённых пользователем меток, найденных в почтовом ящике, хранится в разделе параметров Babyl.661662Экземпляры [`Babyl`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Babyl) имеют все методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), а также следующие:663664#### `get_labels()`665666Возвращает список имён всех определённых пользователем меток, используемых в почтовом ящике.667668> **Примечание**669>670> Фактические сообщения проверяются для определения того, какие метки существуют в почтовом ящике, вместо обращения к списку меток в разделе параметров Babyl, но раздел Babyl обновляется при каждом изменении почтового ящика.671672Некоторые методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), реализованные в [`Babyl`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Babyl), заслуживают отдельных замечаний:673674#### `get_file(key)`675676В почтовых ящиках Babyl заголовки сообщения хранятся не последовательно с телом сообщения. Чтобы создать файлоподобное представление, заголовки и тело копируются вместе в экземпляр677678`StringIO`679680(из модуля681682`StringIO`683684), API которого идентичен файловому. В результате файлоподобный объект полностью независим от базового почтового ящика, но не экономит память по сравнению со строковым представлением.685686#### `lock()`687688#### `unlock()`689690Используются три механизма блокировки: точечная блокировка и, если доступны, системные вызовы691692`flock()`693694и695696`lockf()`697698.699700> **См. также**701>702> **[Формат файлов Babyl версии 5](https://python-all.ru/3.1/library/mailbox.html)**703>704> Спецификация формата Babyl.705>706> **[Чтение почты с помощью Rmail](https://python-all.ru/3.1/library/mailbox.html)**707>708> Руководство по Rmail, содержащее некоторую информацию о семантике Babyl.709710### 18.4.1.5. [`MMDF`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDF)711712#### `class mailbox.MMDF(path, factory=None, create=True)`713714Подкласс [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MMDF. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведет себя так, как если бы было открыто в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то в качестве представления сообщения по умолчанию используется [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage). Если *create* равно `True`, почтовый ящик создается, если он не существует.715716MMDF – это однофайловый формат почтового ящика, разработанный для Multichannel Memorandum Distribution Facility – агента пересылки почты. Каждое сообщение имеет ту же форму, что и сообщение mbox, но обрамляется строками, содержащими четыре символа Control-A (`'\001'`). Как и в формате mbox, начало каждого сообщения обозначается строкой, первые пять символов которой – «From », но дополнительные вхождения «From » не преобразуются в «\>From » при сохранении сообщений, так как дополнительные строки-разделители сообщений предотвращают ошибочный прием таких вхождений за начала последующих сообщений.717718Некоторые методы [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox), реализованные в [`MMDF`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDF), заслуживают отдельных замечаний:719720#### `get_file(key)`721722Использование файла после вызова723724`flush()`725726или727728`close()`729730на экземпляре731732[`MMDF`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDF)733734может привести к непредсказуемым результатам или вызвать исключение.735736#### `lock()`737738#### `unlock()`739740Используются три механизма блокировки: точечная блокировка и, если доступны, системные вызовы741742`flock()`743744и745746`lockf()`747748.749750> **См. также**751>752> **[страница руководства mmdf из tin](https://python-all.ru/3.1/library/mailbox.html)**753>754> Спецификация формата MMDF из документации tin, программы для чтения новостей.755>756> **[MMDF](https://python-all.ru/3.1/library/mailbox.html)**757>758> Статья в Википедии, описывающая Multichannel Memorandum Distribution Facility.759760## 18.4.2. объекты [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)761762#### `class mailbox.Message(message=None)`763764Подкласс `email.Message` модуля [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message). Подклассы [`mailbox.Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message) добавляют состояние и поведение, специфичные для формата почтового ящика.765766Если *message* опущен, новый экземпляр создаётся в состоянии по умолчанию, пустом. Если *message* является экземпляром `email.Message.Message`, его содержимое копируется; кроме того, любая информация, специфичная для формата, по возможности преобразуется, если *message* является экземпляром [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message). Если *message* является строкой или файлом, он должен содержать сообщение, соответствующее [**RFC 2822**](https://python-all.ru/3.1/library/mailbox.html), которое читается и разбирается.767768Формат-специфичные состояния и поведение, предоставляемые подклассами, различаются, но в целом поддерживаются только те свойства, которые не привязаны к конкретному почтовому ящику (хотя, предположительно, эти свойства специфичны для конкретного формата почтового ящика). Например, смещения в файлах для однофайловых форматов почтовых ящиков и имена файлов для форматов на основе каталогов не сохраняются, так как они применимы только к исходному почтовому ящику. Но такие состояния, как было ли сообщение прочитано пользователем или помечено как важное, сохраняются, поскольку они относятся к самому сообщению.769770Нет требования, чтобы экземпляры [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message) использовались для представления сообщений, полученных с помощью экземпляров [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox). В некоторых ситуациях время и память, необходимые для создания представлений [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message), могут оказаться неприемлемыми. Для таких ситуаций экземпляры [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox) также предоставляют строковые и файлоподобные представления, а также может быть указана пользовательская фабрика сообщений при инициализации экземпляра [`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox).771772### 18.4.2.1. [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage)773774#### `class mailbox.MaildirMessage(message=None)`775776Сообщение с поведением, специфичным для Maildir. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message).777778Обычно почтовый клиент перемещает все сообщения из подкаталога `new` в подкаталог `cur` после первого открытия и закрытия почтового ящика пользователем, отмечая, что сообщения устарели, независимо от того, были ли они прочитаны. Каждое сообщение в `cur` имеет раздел «info», добавленный к его имени файла, для хранения информации о его состоянии. (Некоторые почтовые программы могут также добавлять раздел «info» к сообщениям в `new`.) Раздел «info» может принимать одну из двух форм: он может содержать «2,» с последующим списком стандартизированных флагов (например, «2,FR») или может содержать «1,» с последующей так называемой экспериментальной информацией. Стандартные флаги для сообщений Maildir следующие:779780| Флаг | Значение | Пояснение |781| --- | --- | --- |782| D | Черновик | В процессе составления |783| F | Помечено | Помечено как важное |784| P | Передан | Переслано, отправлено повторно или возвращено |785| R | Отвечено | Получен ответ |786| S | Просмотрено | Прочитано |787| T | Удалено | Помечено для последующего удаления |788789Экземпляры [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) предоставляют следующие методы:790791#### `get_subdir()`792793Возвращает либо «new» (если сообщение должно храниться в подкаталоге `new`), либо «cur» (если сообщение должно храниться в подкаталоге `cur`).794795> **Примечание**796>797> Сообщение обычно перемещается из `new` в `cur` после обращения к его почтовому ящику, независимо от того, было ли сообщение прочитано. Сообщение `msg` считается прочитанным, если `"S" in msg.get_flags()` равно `True`.798799#### `set_subdir(subdir)`800801Устанавливает подкаталог, в котором должно храниться сообщение. Параметр802803*subdir*804805должен быть либо «new», либо «cur».806807#### `get_flags()`808809Возвращает строку с указанием установленных в данный момент флагов. Если сообщение соответствует стандартному формату Maildir, результатом будет конкатенация в алфавитном порядке не более одного вхождения каждого из810811`'D'`812813,814815`'F'`816817,818819`'P'`820821,822823`'R'`824825,826827`'S'`828829и830831`'T'`832833. Пустая строка возвращается, если флаги не установлены или если «info» содержит экспериментальную семантику.834835#### `set_flags(flags)`836837Устанавливает флаги, указанные838839*flags*840841, и сбрасывает все остальные.842843#### `add_flag(flag)`844845Устанавливает флаг(и), указанные846847*flag*848849, не изменяя остальные флаги. Чтобы добавить более одного флага за раз,850851*flag*852853может быть строкой из более чем одного символа. Текущий «info» перезаписывается, независимо от того, содержит ли он экспериментальную информацию вместо флагов.854855#### `remove_flag(flag)`856857Сбрасывает флаг(и), указанные в858859*flag*860861, не изменяя другие флаги. Чтобы удалить несколько флагов за раз,862863*flag*864865может быть строкой из более чем одного символа. Если «info» содержит экспериментальную информацию, а не флаги, текущий «info» не изменяется.866867#### `get_date()`868869Возвращает дату доставки сообщения в виде числа с плавающей запятой, представляющего количество секунд с начала эпохи.870871#### `set_date(date)`872873Устанавливает дату доставки сообщения в874875*date*876877, число с плавающей запятой, представляющее количество секунд с начала эпохи.878879#### `get_info()`880881Возвращает строку, содержащую «info» для сообщения. Это полезно для доступа к экспериментальному «info» и его изменения (т.е. не являющегося списком флагов).882883#### `set_info(info)`884885Устанавливает «info» в886887*info*888889, которое должно быть строкой.890891Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются, и выполняются следующие преобразования:892893| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) состояние |894| --- | --- |895| Подкаталог «cur» | Флаг O |896| Флаг F | Флаг F |897| Флаг R | Флаг A |898| Флаг S | Флаг R |899| Флаг T | Флаг D |900901Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:902903| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) состояние |904| --- | --- |905| Подкаталог «cur» | последовательность «unseen» |906| подкаталог «cur» и флаг S | нет последовательности «unseen» |907| Флаг F | последовательность «flagged» |908| Флаг R | последовательность «replied» |909910Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:911912| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) состояние |913| --- | --- |914| Подкаталог «cur» | метка «unseen» |915| подкаталог «cur» и флаг S | нет метки «unseen» |916| Флаг P | метка «forwarded» или «resent» |917| Флаг R | метка «отвечено» |918| Флаг T | метка «удалено» |919920### 18.4.2.2. [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage)921922#### `class mailbox.mboxMessage(message=None)`923924Сообщение с поведением, специфичным для mbox. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message).925926Сообщения в почтовом ящике mbox хранятся вместе в одном файле. Адрес отправителя (envelope address) и время доставки обычно хранятся в строке, начинающейся с «From », которая используется для обозначения начала сообщения, хотя точный формат этих данных сильно различается в разных реализациях mbox. Флаги, указывающие на состояние сообщения, такие как прочитано или помечено как важное, обычно хранятся в заголовках *Status* и *X-Status*.927928Обычные флаги для сообщений mbox:929930| Флаг | Значение | Пояснение |931| --- | --- | --- |932| R | Прочитано | Прочитано |933| O | Старое | Ранее обнаружено почтовым клиентом |934| D | Удалено | Помечено для последующего удаления |935| F | Помечено | Помечено как важное |936| A | Отвечено | Получен ответ |937938Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.939940Экземпляры [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) предоставляют следующие методы:941942#### `get_from()`943944Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.945946#### `set_from(from_, time_=None)`947948Устанавливает строку «From » в949950*from\_*951952, которая должна быть указана без ведущего «From » или завершающего символа новой строки. Для удобства можно указать953954*time\_*955956; он будет отформатирован соответствующим образом и добавлен к957958*from\_*959960. Если961962*time\_*963964указан, он должен быть экземпляром965966`struct_time`967968, кортежем, подходящим для передачи в969970[`time.strftime()`](https://python-all.ru/3.1/library/time.html#time.strftime)971972, или973974`True`975976(для использования977978[`time.gmtime()`](https://python-all.ru/3.1/library/time.html#time.gmtime)979980).981982#### `get_flags()`983984Возвращает строку, указывающую флаги, которые в данный момент установлены. Если сообщение соответствует обычному формату, результатом является конкатенация в следующем порядке: ноль или одно вхождение каждого из985986`'R'`987988,989990`'O'`991992,993994`'D'`995996,997998`'F'`9991000и10011002`'A'`10031004.10051006#### `set_flags(flags)`10071008Устанавливает флаги, указанные параметром10091010*flags*10111012, и сбрасывает все остальные. Параметр10131014*flags*10151016должен быть конкатенацией в любом порядке нуля или более вхождений каждого из10171018`'R'`10191020,10211022`'O'`10231024,10251026`'D'`10271028,10291030`'F'`10311032и10331034`'A'`10351036.10371038#### `add_flag(flag)`10391040Устанавливает флаг(и), указанные в10411042*flag*10431044, не изменяя другие флаги. Чтобы добавить более одного флага за раз,10451046*flag*10471048может быть строкой из более чем одного символа.10491050#### `remove_flag(flag)`10511052Снимает флаг(и), указанные в10531054*flag*10551056, не изменяя другие флаги. Чтобы снять несколько флагов одновременно,10571058*flag*10591060может быть строкой из более чем одного символа.10611062Когда экземпляр [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) создается на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), и выполняются следующие преобразования:10631064| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) состояние |1065| --- | --- |1066| Флаг R | Флаг S |1067| Флаг O | Подкаталог «cur» |1068| Флаг D | Флаг T |1069| Флаг F | Флаг F |1070| Флаг A | Флаг R |10711072Когда экземпляр [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:10731074| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) состояние |1075| --- | --- |1076| Флаг R и флаг O | нет последовательности «unseen» |1077| Флаг O | последовательность «unseen» |1078| Флаг F | последовательность «flagged» |1079| Флаг A | последовательность «replied» |10801081Когда экземпляр [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:10821083| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) состояние |1084| --- | --- |1085| Флаг R и флаг O | нет метки «unseen» |1086| Флаг O | метка «unseen» |1087| Флаг D | метка «удалено» |1088| Флаг A | метка «отвечено» |10891090Когда экземпляр [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message) создаётся на основе экземпляра [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) , строка «From » копируется, и все флаги напрямую соответствуют:10911092| Результирующее состояние | состояние [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) |1093| --- | --- |1094| Флаг R | Флаг R |1095| Флаг O | Флаг O |1096| Флаг D | Флаг D |1097| Флаг F | Флаг F |1098| Флаг A | Флаг A |10991100### 18.4.2.3. [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage)11011102#### `class mailbox.MHMessage(message=None)`11031104Сообщение с поведением, специфичным для MH. Параметр *message* имеет тот же смысл, что и в конструкторе [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message).11051106Сообщения MH не поддерживают метки и флаги в традиционном понимании, но поддерживают последовательности – логические группировки произвольных сообщений. Некоторые почтовые программы (хотя не стандартные **mh** и **nmh**) используют последовательности примерно так же, как флаги используются в других форматах:11071108| Последовательность | Пояснение |1109| --- | --- |1110| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |1111| отвечено | Получен ответ |1112| помечено | Помечено как важное |11131114Экземпляры [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) предоставляют следующие методы:11151116#### `get_sequences()`11171118Возвращает список имен последовательностей, которые включают это сообщение.11191120#### `set_sequences(sequences)`11211122Устанавливает список последовательностей, которые включают это сообщение.11231124#### `add_sequence(sequence)`11251126Добавляет11271128*sequence*11291130в список последовательностей, которые включают это сообщение.11311132#### `remove_sequence(sequence)`11331134Удаляет11351136*sequence*11371138из списка последовательностей, которые включают это сообщение.11391140Когда экземпляр [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), выполняются следующие преобразования:11411142| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) состояние |1143| --- | --- |1144| последовательность «unseen» | нет флага S |1145| последовательность «replied» | Флаг R |1146| последовательность «flagged» | Флаг F |11471148Когда экземпляр [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются, и выполняются следующие преобразования:11491150| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) состояние |1151| --- | --- |1152| последовательность «unseen» | нет флага R |1153| последовательность «replied» | Флаг A |1154| последовательность «flagged» | Флаг F |11551156Когда экземпляр [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:11571158| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) состояние |1159| --- | --- |1160| последовательность «unseen» | метка «unseen» |1161| последовательность «replied» | метка «отвечено» |11621163### 18.4.2.4. [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage)11641165#### `class mailbox.BabylMessage(message=None)`11661167Сообщение с поведением, специфичным для Babyl. Параметр *message* имеет тот же смысл, что и в конструкторе [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message).11681169Некоторые метки сообщений, называемые *attributes*, по соглашению имеют специальное значение. Атрибуты следующие:11701171| Метка | Пояснение |1172| --- | --- |1173| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |1174| удалено | Помечено для последующего удаления |1175| архивировано | Скопировано в другой файл или почтовый ящик |1176| отвечено | Получен ответ |1177| переслано | Переслано |1178| изменено | Изменено пользователем |1179| переотправлено | Отправлено повторно |11801181По умолчанию Rmail отображает только видимые заголовки. Класс [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) , однако, использует оригинальные заголовки, поскольку они более полны. К видимым заголовкам можно обратиться явно при желании.11821183Экземпляры [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) предоставляют следующие методы:11841185#### `get_labels()`11861187Возвращает список меток сообщения.11881189#### `set_labels(labels)`11901191Устанавливает список меток сообщения равным11921193*labels*11941195.11961197#### `add_label(label)`11981199Добавляет метку12001201*label*12021203в список меток сообщения.12041205#### `remove_label(label)`12061207Удаляет метку12081209*label*12101211из списка меток сообщения.12121213#### `get_visible()`12141215Возвращает экземпляр12161217[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)12181219, заголовки которого являются видимыми заголовками сообщения, а тело пусто.12201221#### `set_visible(visible)`12221223Устанавливает видимые заголовки сообщения такими же, как заголовки в12241225*message*12261227. Параметр12281229*visible*12301231должен быть экземпляром12321233[`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message)12341235, экземпляром12361237`email.Message.Message`12381239, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме).12401241#### `update_visible()`12421243Когда изменяются исходные заголовки экземпляра12441245[`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage)12461247, видимые заголовки не изменяются автоматически для соответствия. Этот метод обновляет видимые заголовки следующим образом: каждый видимый заголовок, имеющий соответствующий исходный заголовок, устанавливается в значение исходного заголовка; каждый видимый заголовок, не имеющий соответствующего исходного заголовка, удаляется; а любые из12481249*Date*12501251,12521253*From*12541255,12561257*Reply-To*12581259,12601261*To*12621263,12641265*CC*12661267и12681269*Subject*12701271, которые присутствуют в исходных заголовках, но отсутствуют среди видимых, добавляются к видимым заголовкам.12721273Когда экземпляр [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), выполняются следующие преобразования:12741275| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) состояние |1276| --- | --- |1277| метка «unseen» | нет флага S |1278| метка «удалено» | Флаг T |1279| метка «отвечено» | Флаг R |1280| Метка «forwarded» | Флаг P |12811282Когда экземпляр [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются и выполняются следующие преобразования:12831284| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) состояние |1285| --- | --- |1286| метка «unseen» | нет флага R |1287| метка «удалено» | Флаг D |1288| метка «отвечено» | Флаг A |12891290Когда экземпляр [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:12911292| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) состояние |1293| --- | --- |1294| метка «unseen» | последовательность «unseen» |1295| метка «отвечено» | последовательность «replied» |12961297### 18.4.2.5. [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage)12981299#### `class mailbox.MMDFMessage(message=None)`13001301Сообщение с поведением, специфичным для MMDF. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Message).13021303Как и сообщения в почтовом ящике mbox, сообщения MMDF хранятся с адресом отправителя и датой доставки в начальной строке, начинающейся с «From ». Аналогично, флаги, указывающие на состояние сообщения, обычно хранятся в заголовках *Status* и *X-Status*.13041305Стандартные флаги для сообщений MMDF совпадают с флагами сообщений mbox и перечислены ниже:13061307| Флаг | Значение | Пояснение |1308| --- | --- | --- |1309| R | Прочитано | Прочитано |1310| O | Старое | Ранее обнаружено почтовым клиентом |1311| D | Удалено | Помечено для последующего удаления |1312| F | Помечено | Помечено как важное |1313| A | Отвечено | Получен ответ |13141315Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.13161317Экземпляры [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) предоставляют следующие методы, идентичные методам, предоставляемым [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage):13181319#### `get_from()`13201321Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.13221323#### `set_from(from_, time_=None)`13241325Устанавливает строку «From » в13261327*from\_*13281329, которая должна быть указана без ведущего «From » или завершающего символа новой строки. Для удобства можно указать13301331*time\_*13321333; он будет отформатирован соответствующим образом и добавлен к13341335*from\_*13361337. Если13381339*time\_*13401341указан, он должен быть экземпляром13421343`struct_time`13441345, кортежем, подходящим для передачи в13461347[`time.strftime()`](https://python-all.ru/3.1/library/time.html#time.strftime)13481349, или13501351`True`13521353(для использования13541355[`time.gmtime()`](https://python-all.ru/3.1/library/time.html#time.gmtime)13561357).13581359#### `get_flags()`13601361Возвращает строку, указывающую флаги, которые в данный момент установлены. Если сообщение соответствует обычному формату, результатом является конкатенация в следующем порядке: ноль или одно вхождение каждого из13621363`'R'`13641365,13661367`'O'`13681369,13701371`'D'`13721373,13741375`'F'`13761377и13781379`'A'`13801381.13821383#### `set_flags(flags)`13841385Устанавливает флаги, указанные параметром13861387*flags*13881389, и сбрасывает все остальные. Параметр13901391*flags*13921393должен быть конкатенацией в любом порядке нуля или более вхождений каждого из13941395`'R'`13961397,13981399`'O'`14001401,14021403`'D'`14041405,14061407`'F'`14081409и14101411`'A'`14121413.14141415#### `add_flag(flag)`14161417Устанавливает флаг(и), указанные в14181419*flag*14201421, не изменяя другие флаги. Чтобы добавить более одного флага за раз,14221423*flag*14241425может быть строкой из более чем одного символа.14261427#### `remove_flag(flag)`14281429Снимает флаг(и), указанные в14301431*flag*14321433, не изменяя другие флаги. Чтобы снять несколько флагов одновременно,14341435*flag*14361437может быть строкой из более чем одного символа.14381439Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage), и выполняются следующие преобразования:14401441| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MaildirMessage) состояние |1442| --- | --- |1443| Флаг R | Флаг S |1444| Флаг O | Подкаталог «cur» |1445| Флаг D | Флаг T |1446| Флаг F | Флаг F |1447| Флаг A | Флаг R |14481449Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:14501451| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MHMessage) состояние |1452| --- | --- |1453| Флаг R и флаг O | нет последовательности «unseen» |1454| Флаг O | последовательность «unseen» |1455| Флаг F | последовательность «flagged» |1456| Флаг A | последовательность «replied» |14571458Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:14591460| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.BabylMessage) состояние |1461| --- | --- |1462| Флаг R и флаг O | нет метки «unseen» |1463| Флаг O | метка «unseen» |1464| Флаг D | метка «удалено» |1465| Флаг A | метка «отвечено» |14661467Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage), строка «From » копируется и все флаги напрямую соответствуют:14681469| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.1/library/mailbox.html#mailbox.mboxMessage) состояние |1470| --- | --- |1471| Флаг R | Флаг R |1472| Флаг O | Флаг O |1473| Флаг D | Флаг D |1474| Флаг F | Флаг F |1475| Флаг A | Флаг A |14761477## 18.4.3. Исключения14781479В модуле `mailbox` определены следующие классы исключений:14801481#### `exception mailbox.Error`14821483Базовый класс для всех остальных исключений, специфичных для модуля.14841485#### `exception mailbox.NoSuchMailboxError`14861487Возникает, когда ожидается почтовый ящик, но он не найден, например, при создании экземпляра подкласса14881489[`Mailbox`](https://python-all.ru/3.1/library/mailbox.html#mailbox.Mailbox)14901491с несуществующим путём (и с параметром14921493*create*14941495, установленным в14961497`False`14981499), или при открытии несуществующей папки.15001501#### `exception mailbox.NotEmptyError`15021503Вызывается, когда почтовый ящик не пуст, но ожидается пустым, например, при удалении папки, содержащей сообщения.15041505#### `exception mailbox.ExternalClashError`15061507Возникает, когда не зависящее от программы условие, связанное с почтовым ящиком, не позволяет продолжить работу, например, когда не удаётся получить блокировку, которая уже удерживается другой программой, или когда сгенерированное уникальное имя файла уже существует.15081509#### `exception mailbox.FormatError`15101511Возникает, когда данные в файле не могут быть разобраны, например, когда экземпляр15121513[`MH`](https://python-all.ru/3.1/library/mailbox.html#mailbox.MH)15141515пытается прочитать повреждённый файл15161517`.mh_sequences`15181519.15201521## 18.4.4. Примеры15221523Простой пример вывода тем всех сообщений в почтовом ящике, которые кажутся интересными:15241525```python1526import mailbox1527for message in mailbox.mbox('~/mbox'):1528    subject = message['subject']       # Может быть None.1529    if subject and 'python' in subject.lower():1530        print(subject)1531```15321533Чтобы скопировать все письма из почтового ящика Babyl в почтовый ящик MH, преобразуя всю форматно-специфичную информацию, которую можно преобразовать:15341535```python1536import mailbox1537destination = mailbox.MH('~/Mail')1538destination.lock()1539for message in mailbox.Babyl('~/RMAIL'):1540    destination.add(mailbox.MHMessage(message))1541destination.flush()1542destination.unlock()1543```15441545Этот пример сортирует письма из нескольких списков рассылки по разным почтовым ящикам, стараясь избежать повреждения писем из-за одновременного изменения другими программами, потери писем из-за прерывания программы или преждевременного завершения из-за повреждённых сообщений в почтовом ящике:15461547```python1548import mailbox1549import email.Errors15501551list_names = ('python-list', 'python-dev', 'python-bugs')15521553boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}1554inbox = mailbox.Maildir('~/Maildir', factory=None)15551556for key in inbox.iterkeys():1557    try:1558        message = inbox[key]1559    except email.Errors.MessageParseError:1560        continue                # Сообщение повреждено. Просто оставьте его.15611562    for name in list_names:1563        list_id = message['list-id']1564        if list_id and name in list_id:1565            # Получить почтовый ящик для использования.1566            box = boxes[name]15671568            # Записать копию на диск перед удалением оригинала.1569            # Если произошёл сбой, возможно дублирование сообщения, но1570            # это лучше, чем полная потеря сообщения.1571            box.lock()1572            box.add(message)1573            box.flush()1574            box.unlock()15751576            # Удалить исходное сообщение1577            inbox.lock()1578            inbox.discard(key)1579            inbox.flush()1580            inbox.unlock()1581            break               # Целевой получатель найден, поиск прекращён.15821583for box in boxes.itervalues():1584    box.close()1585```1586