mailbox.md
1> **Источник:** https://python-all.ru/3.0/library/mailbox.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `mailbox` – Управление почтовыми ящиками в различных форматах89Этот модуль определяет два класса: [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) и [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), для доступа к почтовым ящикам на диске и содержащимся в них сообщениям и управления ими. [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) предоставляет отображение в стиле словаря, связывающее ключи с сообщениями. [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message) расширяет класс `email.Message` модуля [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), добавляя состояние и поведение, зависящие от формата. Поддерживаемые форматы почтовых ящиков: Maildir, mbox, MH, Babyl и MMDF.1011> **См. также**12>13> **Модуль [`email`](https://python-all.ru/3.0/library/email.html#module-email)**14>15> Представление сообщений и управление ими.1617## [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) объекты1819#### `[mailbox.Mailbox]class mailbox.Mailbox`2021Почтовый ящик, который можно просматривать и изменять.2223Класс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) определяет интерфейс и не предназначен для создания экземпляров. Вместо этого от [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) должны наследоваться подклассы, специфичные для формата, а код должен создавать экземпляры конкретного подкласса.2425Интерфейс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) напоминает словарь: небольшие ключи соответствуют сообщениям. Ключи выдаются экземпляром [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), с которым они будут использоваться, и имеют смысл только для этого экземпляра [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox). Ключ продолжает идентифицировать сообщение, даже если соответствующее сообщение изменяется, например, заменяется другим сообщением.2627Сообщения можно добавлять в экземпляр [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) с помощью метода, подобного set, [`add()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.add), и удалять с помощью инструкции `del` или методов, подобных set, [`remove()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.remove) и [`discard()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.discard).2829Семантика интерфейса [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) отличается от семантики словаря в некоторых важных аспектах. При каждом запросе сообщения создаётся новое представление (обычно экземпляр [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)) на основе текущего состояния почтового ящика. Аналогично, при добавлении сообщения в экземпляр [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) содержимое переданного представления сообщения копируется. Ни в одном из случаев экземпляр [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) не хранит ссылку на представление сообщения.3031Итератор по умолчанию [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) перебирает представления сообщений, а не ключи, как это делает итератор словаря по умолчанию. Более того, изменение почтового ящика во время итерации безопасно и имеет чётко определённое поведение. Сообщения, добавленные в почтовый ящик после создания итератора, не будут видны итератору. Сообщения, удалённые из почтового ящика до того, как итератор вернёт их, будут молча пропущены, хотя использование ключа от итератора может привести к исключению [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), если соответствующее сообщение будет впоследствии удалено.3233> **Предупреждение**34>35> Следует соблюдать осторожность при изменении почтовых ящиков, которые могут одновременно изменяться другим процессом. Самый безопасный формат почтового ящика для таких задач – Maildir; следует избегать использования однофайловых форматов, таких как mbox, для одновременной записи. При изменении почтового ящика *необходимо* заблокировать его, вызвав методы [`lock()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.lock) и [`unlock()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.unlock) *перед* чтением любых сообщений в файле или внесением любых изменений путём добавления или удаления сообщения. Неблокировка почтового ящика может привести к потере сообщений или повреждению всего почтового ящика.3637Экземпляры [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) имеют следующие методы:3839#### `[mailbox.Mailbox.add]add(message)`4041Добавляет *сообщение* в почтовый ящик и возвращает ключ, который был ему присвоен.4243Параметр *message* может быть экземпляром [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), экземпляром `email.Message.Message`, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если *message* является экземпляром соответствующего подкласса [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), специфичного для формата (например, если это экземпляр [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage), а текущий объект – экземпляр [`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox)), то используется информация, специфичная для формата. В противном случае используются разумные значения по умолчанию.4445#### `[mailbox.Mailbox.remove]remove(key)`4647#### `__delitem__(key)`4849#### `discard(key)`5051Удаляет сообщение, соответствующее *ключу*, из почтового ящика.5253Если такого сообщения не существует, исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError) возбуждается, если метод был вызван как [`remove()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.remove) или [`__delitem__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__delitem__), но исключение не возбуждается, если метод был вызван как [`discard()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.discard). Поведение [`discard()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.discard) может быть предпочтительнее, если базовый формат почтового ящика поддерживает одновременное изменение другими процессами.5455#### `[mailbox.Mailbox.__setitem__]__setitem__(key, message)`5657Заменяет сообщение, соответствующее *key*, на *message*. Возбуждает исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), если сообщение, соответствующее *key*, ещё не существует.5859Как и для [`add()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.add), параметр *message* может быть экземпляром [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), экземпляром `email.Message.Message`, строкой или файлоподобным объектом (открытым в текстовом режиме). Если *message* является экземпляром соответствующего подкласса [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), специфичного для формата (например, если это экземпляр [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage), а текущий объект – экземпляр [`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox)), то используется информация, специфичная для формата. В противном случае информация, специфичная для формата сообщения, соответствующего ключу *key*, остаётся без изменений.6061#### `[mailbox.Mailbox.iterkeys]iterkeys()`6263#### `keys()`6465Возвращает итератор по всем ключам, если вызван как6667[`iterkeys()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.iterkeys)6869, или возвращает список ключей, если вызван как7071[`keys()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.keys)7273.7475#### `[mailbox.Mailbox.itervalues]itervalues()`7677#### `__iter__()`7879#### `values()`8081Возвращает итератор по представлениям всех сообщений, если вызван как [`itervalues()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.itervalues) или [`__iter__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__iter__), или возвращает список таких представлений, если вызван как [`values()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.values). Сообщения представляются как экземпляры соответствующего формат-специфичного подкласса [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.8283> **Примечание**84>85> Поведение [`__iter__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__iter__) отличается от поведения словарей, которые перебирают ключи.8687#### `[mailbox.Mailbox.iteritems]iteritems()`8889#### `items()`9091Возвращает итератор по парам (9293*ключ*9495,9697*сообщение*9899), где100101*ключ*102103– это ключ, а104105*сообщение*106107– представление сообщения, если метод вызван как108109[`iteritems()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.iteritems)110111, или возвращает список таких пар, если вызван как112113[`items()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.items)114115. Сообщения представляются как экземпляры соответствующего подкласса116117[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)118119, зависящего от формата, если только при инициализации экземпляра120121[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)122123не была указана пользовательская фабрика сообщений.124125#### `[mailbox.Mailbox.get]get(key[, default=None])`126127#### `__getitem__(key)`128129Возвращает представление сообщения, соответствующего130131*ключу*132133. Если такое сообщение отсутствует, возвращается134135*значение по умолчанию*136137, если метод был вызван как138139[`get()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.get)140141, и возбуждается исключение142143[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)144145, если метод был вызван как146147[`__getitem__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__getitem__)148149. Сообщение представляется как экземпляр соответствующего подкласса150151[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)152153, зависящего от формата, если только при инициализации экземпляра154155[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)156157не была указана пользовательская фабрика сообщений.158159#### `[mailbox.Mailbox.get_message]get_message(key)`160161Возвращает представление сообщения, соответствующего162163*ключу*164165, в виде экземпляра соответствующего подкласса166167[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)168169, зависящего от формата, или возбуждает исключение170171[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)172173, если такое сообщение отсутствует.174175#### `[mailbox.Mailbox.get_string]get_string(key)`176177Возвращает строковое представление сообщения, соответствующего ключу178179*key*180181, или возбуждает исключение182183[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)184185, если такого сообщения нет.186187#### `[mailbox.Mailbox.get_file]get_file(key)`188189Возвращает файлоподобное представление сообщения, соответствующего ключу *key*, или возбуждает исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), если такого сообщения нет. Файлоподобный объект ведёт себя так, как если бы он был открыт в двоичном режиме. Этот файл следует закрыть, когда он больше не нужен.190191> **Примечание**192>193> В отличие от других представлений сообщений, файлоподобные представления не обязательно независимы от экземпляра [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), создавшего их, или от базового почтового ящика. Более подробная документация приведена в каждом подклассе.194195#### `[mailbox.Mailbox.__contains__]__contains__(key)`196197Возвращает198199`True`200201, если202203*ключ*204205соответствует сообщению, и206207`False`208209в противном случае.210211#### `[mailbox.Mailbox.__len__]__len__()`212213Возвращает количество сообщений в почтовом ящике.214215#### `[mailbox.Mailbox.clear]clear()`216217Удаляет все сообщения из почтового ящика.218219#### `[mailbox.Mailbox.pop]pop(key[, default])`220221Возвращает представление сообщения, соответствующего222223*key*224225, и удаляет сообщение. Если такое сообщение не существует, возвращает226227*default*228229, если он был передан, в противном случае вызывает исключение230231[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)232233. Сообщение представляется в виде экземпляра соответствующего подкласса234235[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)236237, специфичного для формата, если только пользовательская фабрика сообщений не была указана при инициализации экземпляра238239[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)240241.242243#### `[mailbox.Mailbox.popitem]popitem()`244245Возвращает произвольную пару (246247*ключ*248249,250251*сообщение*252253), где254255*ключ*256257– это ключ, а258259*сообщение*260261– представление сообщения, и удаляет соответствующее сообщение. Если почтовый ящик пуст, возбуждает исключение262263[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)264265. Сообщение представляется как экземпляр соответствующего подкласса266267[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)268269, зависящего от формата, если только при инициализации экземпляра270271[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)272273не была указана пользовательская фабрика сообщений.274275#### `[mailbox.Mailbox.update]update(arg)`276277Параметр *arg* должен быть отображением *ключ* → *сообщение* или итерируемым объектом из пар (*ключ*, *сообщение*). Обновляет почтовый ящик так, что для каждого заданного *ключа* и *сообщения* сообщение, соответствующее *ключу*, устанавливается в *сообщение*, как если бы это было сделано с помощью [`__setitem__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__setitem__). Как и в случае с [`__setitem__()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.__setitem__), каждый *ключ* уже должен соответствовать сообщению в почтовом ящике, иначе будет возбуждено исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError), поэтому в общем случае неверно, чтобы *arg* был экземпляром [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox).278279> **Примечание**280>281> В отличие от словарей, именованные аргументы не поддерживаются.282283#### `[mailbox.Mailbox.flush]flush()`284285Записывает все ожидающие изменения в файловую систему. Для некоторых подклассов286287[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)288289изменения всегда записываются немедленно, и290291[`flush()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox.flush)292293ничего не делает, но всё равно стоит выработать привычку вызывать этот метод.294295#### `[mailbox.Mailbox.lock]lock()`296297Захватывает монопольную рекомендательную блокировку почтового ящика, чтобы другие процессы не изменяли его. Если блокировка недоступна, возбуждается исключение298299[`ExternalClashError`](https://python-all.ru/3.0/library/mailbox.html#mailbox.ExternalClashError)300301. Конкретные механизмы блокировки зависят от формата почтового ящика. Следует302303*всегда*304305блокировать почтовый ящик перед внесением любых изменений в его содержимое.306307#### `[mailbox.Mailbox.unlock]unlock()`308309Освобождает блокировку почтового ящика, если она установлена.310311#### `[mailbox.Mailbox.close]close()`312313Сбрасывает почтовый ящик, разблокирует его при необходимости и закрывает все открытые файлы. Для некоторых подклассов314315[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)316317этот метод ничего не делает.318319### [`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir)320321#### `[mailbox.Maildir]class mailbox.Maildir(dirname[, factory=None[, create=True]])`322323Подкласс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Maildir. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) используется как представление сообщения по умолчанию. Если *create* равно `True`, почтовый ящик создаётся, если он не существует.324325По историческим причинам *dirname* назван так, а не *path*.326327Maildir – это почтовый формат на основе каталогов, разработанный для агента передачи почты qmail и ныне широко поддерживаемый другими программами. Сообщения в почтовом ящике Maildir хранятся в отдельных файлах в общей структуре каталогов. Такая архитектура позволяет нескольким независимым программам получать доступ и изменять почтовые ящики Maildir без повреждения данных, поэтому файловая блокировка не требуется.328329Почтовые ящики Maildir содержат три подкаталога: `tmp`, `new` и `cur`. Сообщения сперва создаются в подкаталоге `tmp`, а затем перемещаются в подкаталог `new` для завершения доставки. Почтовый клиент может затем переместить сообщение в подкаталог `cur` и сохранить информацию о состоянии сообщения в специальном разделе «info», добавляемом к его имени файла.330331Также поддерживаются папки в стиле, введённом почтовым транспортным агентом Courier. Любой подкаталог основного почтового ящика считается папкой, если `'.'` является первым символом в его имени. Имена папок представляются объектами [`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir) без ведущего `'.'`. Каждая папка сама является почтовым ящиком Maildir, но не должна содержать другие папки. Вместо этого логическая вложенность указывается с помощью `'.'` для разделения уровней, например «Archived.2005.07».332333> **Примечание**334>335> Спецификация Maildir требует использования двоеточия (`':'`) в некоторых именах файлов сообщений. Однако некоторые операционные системы не допускают этот символ в именах файлов. Если вы хотите использовать формат, подобный Maildir, в такой операционной системе, следует указать другой символ для замены. Восклицательный знак (`'!'`) – популярный выбор. Например:336>337> ```python338> import mailbox339> mailbox.Maildir.colon = '!'340> ```341>342> Атрибут `colon` также может быть установлен для каждого экземпляра отдельно.343344Экземпляры [`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir) обладают всеми методами [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), а также следующими:345346#### `[mailbox.Maildir.list_folders]list_folders()`347348Возвращает список имён всех папок.349350#### `[mailbox.Maildir..et_folder].et_folder(folder)`351352Возвращает экземпляр353354[`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir)355356, представляющий папку с именем357358*folder*359360. Если папка не существует, возбуждается исключение361362[`NoSuchMailboxError`](https://python-all.ru/3.0/library/mailbox.html#mailbox.NoSuchMailboxError)363364.365366#### `[mailbox.Maildir.add_folder]add_folder(folder)`367368Создаёт папку с именем369370*folder*371372и возвращает экземпляр373374[`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir)375376, представляющий её.377378#### `[mailbox.Maildir.remove_folder]remove_folder(folder)`379380Удаляет папку с именем381382*folder*383384. Если папка содержит какие-либо сообщения, будет выброшено исключение385386[`NotEmptyError`](https://python-all.ru/3.0/library/mailbox.html#mailbox.NotEmptyError)387388, и папка не будет удалена.389390#### `[mailbox.Maildir.clean]clean()`391392Удаляет временные файлы из почтового ящика, к которым не было обращений за последние 36 часов. Спецификация Maildir утверждает, что программы чтения почты должны делать это время от времени.393394Некоторые методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), реализованные в [`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir), заслуживают особых замечаний:395396#### `[mailbox.Maildir.add]add(message)`397398#### `__setitem__(key, message)`399400#### `update(arg)`401402> **Предупреждение**403>404> Эти методы генерируют уникальные имена файлов на основе идентификатора текущего процесса. При использовании нескольких потоков возможны незамеченные конфликты имен, которые могут привести к повреждению почтового ящика, если потоки не скоординированы, чтобы избежать одновременного использования этих методов для управления одним и тем же почтовым ящиком.405406#### `[mailbox.Maildir.flush]flush()`407408Все изменения в почтовых ящиках Maildir применяются немедленно, поэтому этот метод ничего не делает.409410#### `[mailbox.Maildir.lock]lock()`411412#### `unlock()`413414Почтовые ящики Maildir не поддерживают (и не требуют) блокировку, поэтому эти методы ничего не делают.415416#### `[mailbox.Maildir.close]close()`417418Экземпляры419420[`Maildir`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Maildir)421422не держат открытых файлов, а базовые почтовые ящики не поддерживают блокировку, поэтому этот метод ничего не делает.423424#### `[mailbox.Maildir.get_file]get_file(key)`425426В зависимости от платформы может быть невозможно изменить или удалить нижележащее сообщение, пока возвращенный файл остается открытым.427428> **См. также**429>430> **[Страница руководства maildir из qmail](https://python-all.ru/3.0/library/mailbox.html)**431>432> Оригинальная спецификация формата.433>434> **[Использование формата maildir](https://python-all.ru/3.0/library/mailbox.html)**435>436> Заметки о Maildir от его создателя. Включают обновлённую схему создания имён и детали семантики «info».437>438> **[man-страница maildir из Courier](https://python-all.ru/3.0/library/mailbox.html)**439>440> Другая спецификация формата. Описывает распространённое расширение для поддержки папок.441442### [`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox)443444#### `[mailbox.mbox]class mailbox.mbox(path[, factory=None[, create=True]])`445446Подкласс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате mbox. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведёт себя как открытое в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) используется как представление сообщения по умолчанию. Если *create* равно `True`, почтовый ящик создаётся, если он не существует.447448Формат mbox – это классический формат хранения почты в системах Unix. Все сообщения в почтовом ящике mbox хранятся в одном файле, при этом начало каждого сообщения обозначается строкой, первые пять символов которой – «From ».449450Существует несколько вариантов формата mbox, призванных устранить предполагаемые недостатки оригинала. Ради совместимости [`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox) реализует оригинальный формат, который иногда называют *mboxo*. Это означает, что заголовок *Content-Length*, если он присутствует, игнорируется, а любые вхождения «From » в начале строки тела сообщения преобразуются в «\>From » при сохранении сообщения, хотя вхождения «\>From » не преобразуются обратно в «From » при чтении сообщения.451452Некоторые методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), реализованные в [`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox), заслуживают особых замечаний:453454#### `[mailbox.mbox.get_file]get_file(key)`455456Использование файла после вызова457458`flush()`459460или461462`close()`463464на экземпляре465466[`mbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mbox)467468может привести к непредсказуемым результатам или возбудить исключение.469470#### `[mailbox.mbox.lock]lock()`471472#### `unlock()`473474Используются три механизма блокировки – dot locking и, если доступны, системные вызовы475476`flock`477478и479480`lockf`481482.483484> **См. также**485>486> **[Страница руководства mbox из qmail](https://python-all.ru/3.0/library/mailbox.html)**487>488> Спецификация формата и его разновидностей.489>490> **[Страница man mbox из tin](https://python-all.ru/3.0/library/mailbox.html)**491>492> Другая спецификация формата, с подробностями о блокировке.493>494> **[Настройка Netscape Mail в Unix: почему формат Content-Length плох](https://python-all.ru/3.0/library/mailbox.html)**495>496> Аргумент в пользу использования оригинального формата mbox, а не его вариации.497>498> **[«mbox» – это семейство нескольких взаимно несовместимых форматов почтовых ящиков](https://python-all.ru/3.0/library/mailbox.html)**499>500> История вариаций mbox.501502### [`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH)503504#### `[mailbox.MH]class mailbox.MH(path[, factory=None[, create=True]])`505506Подкласс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MH. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведёт себя так, как если бы было открыто в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, в качестве представления сообщения по умолчанию используется [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage). Если *create* равно `True`, почтовый ящик создаётся, если он не существует.507508MH – это формат почтового ящика, основанный на каталогах, разработанный для системы обработки сообщений MH (почтового клиента). Каждое сообщение в почтовом ящике MH находится в собственном файле. Почтовый ящик MH может содержать другие почтовые ящики MH (называемые *папками*) в дополнение к сообщениям. Папки могут быть вложены неограниченно. Почтовые ящики MH также поддерживают *последовательности*, которые представляют собой именованные списки, используемые для логической группировки сообщений без перемещения их в подпапки. Последовательности определяются в файле `.mh_sequences` в каждой папке.509510Класс [`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH) управляет почтовыми ящиками MH, но не пытается эмулировать все поведения **mh**. В частности, он не изменяет и не зависит от файлов `context` или `.mh_profile`, которые используются **mh** для хранения своего состояния и конфигурации.511512Экземпляры [`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH) имеют все методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) в дополнение к следующим:513514#### `[mailbox.MH.list_folders]list_folders()`515516Возвращает список имён всех папок.517518#### `[mailbox.MH.get_folder]get_folder(folder)`519520Возвращает экземпляр521522[`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH)523524, представляющий папку с именем525526*folder*527528. Исключение529530[`NoSuchMailboxError`](https://python-all.ru/3.0/library/mailbox.html#mailbox.NoSuchMailboxError)531532выбрасывается, если папка не существует.533534#### `[mailbox.MH.add_folder]add_folder(folder)`535536Создаёт папку с именем537538*folder*539540и возвращает экземпляр541542[`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH)543544, представляющий её.545546#### `[mailbox.MH.remove_folder]remove_folder(folder)`547548Удаляет папку с именем549550*folder*551552. Если папка содержит какие-либо сообщения, будет выброшено исключение553554[`NotEmptyError`](https://python-all.ru/3.0/library/mailbox.html#mailbox.NotEmptyError)555556, и папка не будет удалена.557558#### `[mailbox.MH.get_sequences]get_sequences()`559560Возвращает словарь, где имена последовательностей сопоставлены со списками ключей. Если последовательностей нет, возвращается пустой словарь.561562#### `[mailbox.MH.set_sequences]set_sequences(sequences)`563564Переопределяет последовательности, существующие в почтовом ящике, на основе565566*sequences*567568, словаря имён, сопоставленных со списками ключей, как возвращаемый569570[`get_sequences()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH.get_sequences)571572.573574#### `[mailbox.MH.pack]pack()`575576Переименовывает сообщения в почтовом ящике по мере необходимости для устранения пропусков в нумерации. Записи в списке последовательностей обновляются соответствующим образом.577578> **Примечание**579>580> Ранее выданные ключи становятся недействительными в результате этой операции и не должны использоваться в дальнейшем.581582Некоторые методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), реализованные в [`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH), заслуживают особых замечаний:583584#### `[mailbox.MH.remove]remove(key)`585586#### `__delitem__(key)`587588#### `discard(key)`589590Эти методы немедленно удаляют сообщение. Соглашение MH помечать сообщение на удаление добавлением запятой к его имени не используется.591592#### `[mailbox.MH.lock]lock()`593594#### `unlock()`595596Используются три механизма блокировки – dot locking и, если доступны, системные вызовы597598`flock`599600и601602`lockf`603604. Для почтовых ящиков MH блокировка ящика означает блокировку файла605606`.mh_sequences`607608и, только на время операций, которые их затрагивают, блокировку отдельных файлов сообщений.609610#### `[mailbox.MH.get_file]get_file(key)`611612В зависимости от платформы может быть невозможно удалить базовое сообщение, пока возвращённый файл остаётся открытым.613614#### `[mailbox.MH.flush]flush()`615616Все изменения в почтовых ящиках MH применяются немедленно, поэтому этот метод ничего не делает.617618#### `[mailbox.MH.close]close()`619620Экземпляры621622[`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH)623624не хранят открытых файлов, поэтому этот метод эквивалентен625626[`unlock()`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH.unlock)627628.629630> **См. также**631>632> **[nmh – система обработки сообщений](https://python-all.ru/3.0/library/mailbox.html)**633>634> Домашняя страница635>636> **nmh**637>638> , обновлённой версии исходного639>640> **mh**641>642> .643>644> **[MH и nmh: электронная почта для пользователей и программистов](https://python-all.ru/3.0/library/mailbox.html)**645>646> Книга, лицензированная под GPL, о647>648> **mh**649>650> и651>652> **nmh**653>654> , с некоторой информацией о формате почтового ящика.655656### [`Babyl`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Babyl)657658#### `[mailbox.Babyl]class mailbox.Babyl(path[, factory=None[, create=True]])`659660Подкласс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Babyl. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведет себя так, как если бы было открыто в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то в качестве представления сообщения по умолчанию используется [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage). Если *create* равно `True`, почтовый ящик создается, если он не существует.661662Babyl – это однофайловый формат почтового ящика, используемый почтовым клиентом Rmail, входящим в состав Emacs. Начало сообщения обозначается строкой, содержащей два символа: Control-Подчёркивание (`'\037'`) и Control-L (`'\014'`). Конец сообщения обозначается началом следующего сообщения или, в случае последнего сообщения, строкой, содержащей символ Control-Подчёркивание (`'\037'`).663664Сообщения в почтовом ящике Babyl имеют два набора заголовков: исходные заголовки и так называемые видимые заголовки. Видимые заголовки обычно являются подмножеством исходных заголовков, которые были переформатированы или сокращены для большей привлекательности. Каждое сообщение в почтовом ящике Babyl также имеет сопутствующий список *меток* (коротких строк, которые записывают дополнительную информацию о сообщении), а список всех определённых пользователем меток, найденных в почтовом ящике, хранится в разделе параметров Babyl.665666Экземпляры [`Babyl`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Babyl) имеют все методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), а также следующие:667668#### `[mailbox.Babyl.get_labels]get_labels()`669670Возвращает список имён всех определённых пользователем меток, используемых в почтовом ящике.671672> **Примечание**673>674> Фактические сообщения проверяются для определения того, какие метки существуют в почтовом ящике, вместо обращения к списку меток в разделе параметров Babyl, но раздел Babyl обновляется при каждом изменении почтового ящика.675676Некоторые методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), реализованные в [`Babyl`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Babyl), заслуживают отдельных замечаний:677678#### `[mailbox.Babyl.get_file]get_file(key)`679680В почтовых ящиках Babyl заголовки сообщения хранятся не последовательно с телом сообщения. Чтобы создать файлоподобное представление, заголовки и тело копируются вместе в экземпляр681682`StringIO`683684(из модуля685686`StringIO`687688), API которого идентичен файловому. В результате файлоподобный объект полностью независим от базового почтового ящика, но не экономит память по сравнению со строковым представлением.689690#### `[mailbox.Babyl.lock]lock()`691692#### `unlock()`693694Используется три механизма блокировки – dot-блокировка и, при наличии, системные вызовы695696`flock`697698и699700`lockf`701702.703704> **См. также**705>706> **[Формат файлов Babyl версии 5](https://python-all.ru/3.0/library/mailbox.html)**707>708> Спецификация формата Babyl.709>710> **[Чтение почты с помощью Rmail](https://python-all.ru/3.0/library/mailbox.html)**711>712> Руководство по Rmail, содержащее некоторую информацию о семантике Babyl.713714### [`MMDF`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDF)715716#### `[mailbox.MMDF]class mailbox.MMDF(path[, factory=None[, create=True]])`717718Подкласс [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MMDF. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (которое ведет себя так, как если бы было открыто в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, то в качестве представления сообщения по умолчанию используется [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage). Если *create* равно `True`, почтовый ящик создается, если он не существует.719720MMDF – это однофайловый формат почтового ящика, разработанный для Multichannel Memorandum Distribution Facility – агента пересылки почты. Каждое сообщение имеет ту же форму, что и сообщение mbox, но обрамляется строками, содержащими четыре символа Control-A (`'\001'`). Как и в формате mbox, начало каждого сообщения обозначается строкой, первые пять символов которой – «From », но дополнительные вхождения «From » не преобразуются в «\>From » при сохранении сообщений, так как дополнительные строки-разделители сообщений предотвращают ошибочный прием таких вхождений за начала последующих сообщений.721722Некоторые методы [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox), реализованные в [`MMDF`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDF), заслуживают отдельных замечаний:723724#### `[mailbox.MMDF.get_file]get_file(key)`725726Использование файла после вызова727728`flush()`729730или731732`close()`733734на экземпляре735736[`MMDF`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDF)737738может привести к непредсказуемым результатам или вызвать исключение.739740#### `[mailbox.MMDF.lock]lock()`741742#### `unlock()`743744Используется три механизма блокировки – dot-блокировка и, при наличии, системные вызовы745746`flock`747748и749750`lockf`751752.753754> **См. также**755>756> **[страница руководства mmdf из tin](https://python-all.ru/3.0/library/mailbox.html)**757>758> Спецификация формата MMDF из документации tin, программы для чтения новостей.759>760> **[MMDF](https://python-all.ru/3.0/library/mailbox.html)**761>762> Статья в Википедии, описывающая Multichannel Memorandum Distribution Facility.763764## объекты [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)765766#### `[mailbox.Message]class mailbox.Message([message])`767768Подкласс `email.Message` модуля [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message). Подклассы [`mailbox.Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message) добавляют состояние и поведение, специфичные для формата почтового ящика.769770Если *message* опущен, новый экземпляр создаётся в состоянии по умолчанию, пустом. Если *message* является экземпляром `email.Message.Message`, его содержимое копируется; кроме того, любая информация, специфичная для формата, по возможности преобразуется, если *message* является экземпляром [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message). Если *message* является строкой или файлом, он должен содержать сообщение, соответствующее [**RFC 2822**](https://python-all.ru/3.0/library/mailbox.html), которое читается и разбирается.771772Формат-специфичные состояния и поведение, предоставляемые подклассами, различаются, но в целом поддерживаются только те свойства, которые не привязаны к конкретному почтовому ящику (хотя, предположительно, эти свойства специфичны для конкретного формата почтового ящика). Например, смещения в файлах для однофайловых форматов почтовых ящиков и имена файлов для форматов на основе каталогов не сохраняются, так как они применимы только к исходному почтовому ящику. Но такие состояния, как было ли сообщение прочитано пользователем или помечено как важное, сохраняются, поскольку они относятся к самому сообщению.773774Нет требования, чтобы экземпляры [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message) использовались для представления сообщений, полученных с помощью экземпляров [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox). В некоторых ситуациях время и память, необходимые для создания представлений [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message), могут оказаться неприемлемыми. Для таких ситуаций экземпляры [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox) также предоставляют строковые и файлоподобные представления, а также может быть указана пользовательская фабрика сообщений при инициализации экземпляра [`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox).775776### [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage)777778#### `[mailbox.MaildirMessage]class mailbox.MaildirMessage([message])`779780Сообщение с поведением, специфичным для Maildir. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message).781782Обычно почтовый клиент перемещает все сообщения из подкаталога `new` в подкаталог `cur` после первого открытия и закрытия почтового ящика пользователем, отмечая, что сообщения устарели, независимо от того, были ли они прочитаны. Каждое сообщение в `cur` имеет раздел «info», добавленный к его имени файла, для хранения информации о его состоянии. (Некоторые почтовые программы могут также добавлять раздел «info» к сообщениям в `new`.) Раздел «info» может принимать одну из двух форм: он может содержать «2,» с последующим списком стандартизированных флагов (например, «2,FR») или может содержать «1,» с последующей так называемой экспериментальной информацией. Стандартные флаги для сообщений Maildir следующие:783784| Флаг | Значение | Пояснение |785| --- | --- | --- |786| D | Черновик | В процессе составления |787| F | Помечено | Помечено как важное |788| P | Передан | Переслано, отправлено повторно или возвращено |789| R | Отвечено | Получен ответ |790| S | Просмотрено | Прочитано |791| T | Удалено | Помечено для последующего удаления |792793Экземпляры [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) предоставляют следующие методы:794795#### `[mailbox.MaildirMessage.get_subdir]get_subdir()`796797Возвращает либо «new» (если сообщение должно храниться в подкаталоге `new`), либо «cur» (если сообщение должно храниться в подкаталоге `cur`).798799> **Примечание**800>801> Сообщение обычно перемещается из `new` в `cur` после обращения к его почтовому ящику, независимо от того, было ли сообщение прочитано. Сообщение `msg` считается прочитанным, если `"S" in msg.get_flags()` равно `True`.802803#### `[mailbox.MaildirMessage.set_subdir]set_subdir(subdir)`804805Устанавливает подкаталог, в котором должно храниться сообщение. Параметр806807*subdir*808809должен быть либо «new», либо «cur».810811#### `[mailbox.MaildirMessage.get_flags]get_flags()`812813Возвращает строку с указанием установленных в данный момент флагов. Если сообщение соответствует стандартному формату Maildir, результатом будет конкатенация в алфавитном порядке не более одного вхождения каждого из814815`'D'`816817,818819`'F'`820821,822823`'P'`824825,826827`'R'`828829,830831`'S'`832833и834835`'T'`836837. Пустая строка возвращается, если флаги не установлены или если «info» содержит экспериментальную семантику.838839#### `[mailbox.MaildirMessage.set_flags]set_flags(flags)`840841Устанавливает флаги, указанные842843*flags*844845, и сбрасывает все остальные.846847#### `[mailbox.MaildirMessage.add_flag]add_flag(flag)`848849Устанавливает флаг(и), указанные850851*flag*852853, не изменяя остальные флаги. Чтобы добавить более одного флага за раз,854855*flag*856857может быть строкой из более чем одного символа. Текущий «info» перезаписывается, независимо от того, содержит ли он экспериментальную информацию вместо флагов.858859#### `[mailbox.MaildirMessage.remove_flag]remove_flag(flag)`860861Сбрасывает флаг(и), указанные в862863*flag*864865, не изменяя другие флаги. Чтобы удалить несколько флагов за раз,866867*flag*868869может быть строкой из более чем одного символа. Если «info» содержит экспериментальную информацию, а не флаги, текущий «info» не изменяется.870871#### `[mailbox.MaildirMessage.get_date]get_date()`872873Возвращает дату доставки сообщения в виде числа с плавающей запятой, представляющего количество секунд с начала эпохи.874875#### `[mailbox.MaildirMessage.set_date]set_date(date)`876877Устанавливает дату доставки сообщения в878879*date*880881, число с плавающей запятой, представляющее количество секунд с начала эпохи.882883#### `[mailbox.MaildirMessage.get_info]get_info()`884885Возвращает строку, содержащую «info» для сообщения. Это полезно для доступа к экспериментальному «info» и его изменения (т.е. не являющегося списком флагов).886887#### `[mailbox.MaildirMessage.set_info]set_info(info)`888889Устанавливает «info» в890891*info*892893, которое должно быть строкой.894895Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются, и выполняются следующие преобразования:896897| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) состояние |898| --- | --- |899| Подкаталог «cur» | Флаг O |900| Флаг F | Флаг F |901| Флаг R | Флаг A |902| Флаг S | Флаг R |903| Флаг T | Флаг D |904905Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:906907| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) состояние |908| --- | --- |909| Подкаталог «cur» | последовательность «unseen» |910| подкаталог «cur» и флаг S | нет последовательности «unseen» |911| Флаг F | последовательность «flagged» |912| Флаг R | последовательность «replied» |913914Когда экземпляр [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) создается на основе экземпляра [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:915916| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) состояние |917| --- | --- |918| Подкаталог «cur» | метка «unseen» |919| подкаталог «cur» и флаг S | нет метки «unseen» |920| Флаг P | метка «forwarded» или «resent» |921| Флаг R | метка «отвечено» |922| Флаг T | метка «удалено» |923924### [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage)925926#### `[mailbox.mboxMessage]class mailbox.mboxMessage([message])`927928Сообщение с поведением, специфичным для mbox. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message).929930Сообщения в почтовом ящике mbox хранятся вместе в одном файле. Адрес отправителя (envelope address) и время доставки обычно хранятся в строке, начинающейся с «From », которая используется для обозначения начала сообщения, хотя точный формат этих данных сильно различается в разных реализациях mbox. Флаги, указывающие на состояние сообщения, такие как прочитано или помечено как важное, обычно хранятся в заголовках *Status* и *X-Status*.931932Обычные флаги для сообщений mbox:933934| Флаг | Значение | Пояснение |935| --- | --- | --- |936| R | Прочитано | Прочитано |937| O | Старое | Ранее обнаружено почтовым клиентом |938| D | Удалено | Помечено для последующего удаления |939| F | Помечено | Помечено как важное |940| A | Отвечено | Получен ответ |941942Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.943944Экземпляры [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) предоставляют следующие методы:945946#### `[mailbox.mboxMessage.get_from]get_from()`947948Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.949950#### `[mailbox.mboxMessage.set_from]set_from(from_[, time_=None])`951952Устанавливает строку «From » в953954*from\_*955956, которая должна быть указана без ведущего «From » или завершающего символа новой строки. Для удобства можно указать957958*time\_*959960; он будет отформатирован соответствующим образом и добавлен к961962*from\_*963964. Если965966*time\_*967968указан, он должен быть экземпляром969970`struct_time`971972, кортежем, подходящим для передачи в973974[`time.strftime()`](https://python-all.ru/3.0/library/time.html#time.strftime)975976, или977978`True`979980(для использования981982[`time.gmtime()`](https://python-all.ru/3.0/library/time.html#time.gmtime)983984).985986#### `[mailbox.mboxMessage.get_flags]get_flags()`987988Возвращает строку, указывающую флаги, которые в данный момент установлены. Если сообщение соответствует обычному формату, результатом является конкатенация в следующем порядке: ноль или одно вхождение каждого из989990`'R'`991992,993994`'O'`995996,997998`'D'`9991000,10011002`'F'`10031004и10051006`'A'`10071008.10091010#### `[mailbox.mboxMessage.set_flags]set_flags(flags)`10111012Устанавливает флаги, указанные параметром10131014*flags*10151016, и сбрасывает все остальные. Параметр10171018*flags*10191020должен быть конкатенацией в любом порядке нуля или более вхождений каждого из10211022`'R'`10231024,10251026`'O'`10271028,10291030`'D'`10311032,10331034`'F'`10351036и10371038`'A'`10391040.10411042#### `[mailbox.mboxMessage.add_flag]add_flag(flag)`10431044Устанавливает флаг(и), указанные в10451046*flag*10471048, не изменяя другие флаги. Чтобы добавить более одного флага за раз,10491050*flag*10511052может быть строкой из более чем одного символа.10531054#### `[mailbox.mboxMessage.remove_flag]remove_flag(flag)`10551056Снимает флаг(и), указанные в10571058*flag*10591060, не изменяя другие флаги. Чтобы снять несколько флагов одновременно,10611062*flag*10631064может быть строкой из более чем одного символа.10651066Когда экземпляр [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) создается на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), и выполняются следующие преобразования:10671068| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) состояние |1069| --- | --- |1070| Флаг R | Флаг S |1071| Флаг O | Подкаталог «cur» |1072| Флаг D | Флаг T |1073| Флаг F | Флаг F |1074| Флаг A | Флаг R |10751076Когда экземпляр [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:10771078| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) состояние |1079| --- | --- |1080| Флаг R и флаг O | нет последовательности «unseen» |1081| Флаг O | последовательность «unseen» |1082| Флаг F | последовательность «flagged» |1083| Флаг A | последовательность «replied» |10841085Когда экземпляр [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:10861087| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) состояние |1088| --- | --- |1089| Флаг R и флаг O | нет метки «unseen» |1090| Флаг O | метка «unseen» |1091| Флаг D | метка «удалено» |1092| Флаг A | метка «отвечено» |10931094Когда экземпляр [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message) создаётся на основе экземпляра [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) , строка «From » копируется, и все флаги напрямую соответствуют:10951096| Результирующее состояние | состояние [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) |1097| --- | --- |1098| Флаг R | Флаг R |1099| Флаг O | Флаг O |1100| Флаг D | Флаг D |1101| Флаг F | Флаг F |1102| Флаг A | Флаг A |11031104### [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage)11051106#### `[mailbox.MHMessage]class mailbox.MHMessage([message])`11071108Сообщение с поведением, специфичным для MH. Параметр *message* имеет тот же смысл, что и в конструкторе [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message).11091110Сообщения MH не поддерживают метки и флаги в традиционном понимании, но поддерживают последовательности – логические группировки произвольных сообщений. Некоторые почтовые программы (хотя не стандартные **mh** и **nmh**) используют последовательности примерно так же, как флаги используются в других форматах:11111112| Последовательность | Пояснение |1113| --- | --- |1114| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |1115| отвечено | Получен ответ |1116| помечено | Помечено как важное |11171118Экземпляры [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) предоставляют следующие методы:11191120#### `[mailbox.MHMessage.get_sequences]get_sequences()`11211122Возвращает список имен последовательностей, которые включают это сообщение.11231124#### `[mailbox.MHMessage.set_sequences]set_sequences(sequences)`11251126Устанавливает список последовательностей, которые включают это сообщение.11271128#### `[mailbox.MHMessage.add_sequence]add_sequence(sequence)`11291130Добавляет11311132*sequence*11331134в список последовательностей, которые включают это сообщение.11351136#### `[mailbox.MHMessage.remove_sequence]remove_sequence(sequence)`11371138Удаляет11391140*sequence*11411142из списка последовательностей, которые включают это сообщение.11431144Когда экземпляр [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), выполняются следующие преобразования:11451146| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) состояние |1147| --- | --- |1148| последовательность «unseen» | нет флага S |1149| последовательность «replied» | Флаг R |1150| последовательность «flagged» | Флаг F |11511152Когда экземпляр [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются, и выполняются следующие преобразования:11531154| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) состояние |1155| --- | --- |1156| последовательность «unseen» | нет флага R |1157| последовательность «replied» | Флаг A |1158| последовательность «flagged» | Флаг F |11591160Когда экземпляр [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:11611162| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) состояние |1163| --- | --- |1164| последовательность «unseen» | метка «unseen» |1165| последовательность «replied» | метка «отвечено» |11661167### [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage)11681169#### `[mailbox.BabylMessage]class mailbox.BabylMessage([message])`11701171Сообщение с поведением, специфичным для Babyl. Параметр *message* имеет тот же смысл, что и в конструкторе [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message).11721173Некоторые метки сообщений, называемые *attributes*, по соглашению имеют специальное значение. Атрибуты следующие:11741175| Метка | Пояснение |1176| --- | --- |1177| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |1178| удалено | Помечено для последующего удаления |1179| архивировано | Скопировано в другой файл или почтовый ящик |1180| отвечено | Получен ответ |1181| переслано | Переслано |1182| изменено | Изменено пользователем |1183| переотправлено | Отправлено повторно |11841185По умолчанию Rmail отображает только видимые заголовки. Класс [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) , однако, использует оригинальные заголовки, поскольку они более полны. К видимым заголовкам можно обратиться явно при желании.11861187Экземпляры [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) предоставляют следующие методы:11881189#### `[mailbox.BabylMessage.get_labels]get_labels()`11901191Возвращает список меток сообщения.11921193#### `[mailbox.BabylMessage.set_labels]set_labels(labels)`11941195Устанавливает список меток сообщения равным11961197*labels*11981199.12001201#### `[mailbox.BabylMessage.add_label]add_label(label)`12021203Добавляет метку12041205*label*12061207в список меток сообщения.12081209#### `[mailbox.BabylMessage.remove_label]remove_label(label)`12101211Удаляет метку12121213*label*12141215из списка меток сообщения.12161217#### `[mailbox.BabylMessage.get_visible]get_visible()`12181219Возвращает экземпляр12201221[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)12221223, заголовки которого являются видимыми заголовками сообщения, а тело пусто.12241225#### `[mailbox.BabylMessage.set_visible]set_visible(visible)`12261227Устанавливает видимые заголовки сообщения такими же, как заголовки в12281229*message*12301231. Параметр12321233*visible*12341235должен быть экземпляром12361237[`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message)12381239, экземпляром12401241`email.Message.Message`12421243, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме).12441245#### `[mailbox.BabylMessage.update_visible]update_visible()`12461247Когда изменяются исходные заголовки экземпляра12481249[`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage)12501251, видимые заголовки не изменяются автоматически для соответствия. Этот метод обновляет видимые заголовки следующим образом: каждый видимый заголовок, имеющий соответствующий исходный заголовок, устанавливается в значение исходного заголовка; каждый видимый заголовок, не имеющий соответствующего исходного заголовка, удаляется; а любые из12521253*Date*12541255,12561257*From*12581259,12601261*Reply-To*12621263,12641265*To*12661267,12681269*CC*12701271и12721273*Subject*12741275, которые присутствуют в исходных заголовках, но отсутствуют среди видимых, добавляются к видимым заголовкам.12761277Когда экземпляр [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), выполняются следующие преобразования:12781279| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) состояние |1280| --- | --- |1281| метка «unseen» | нет флага S |1282| метка «удалено» | Флаг T |1283| метка «отвечено» | Флаг R |1284| Метка «forwarded» | Флаг P |12851286Когда экземпляр [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются и выполняются следующие преобразования:12871288| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) состояние |1289| --- | --- |1290| метка «unseen» | нет флага R |1291| метка «удалено» | Флаг D |1292| метка «отвечено» | Флаг A |12931294Когда экземпляр [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:12951296| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) состояние |1297| --- | --- |1298| метка «unseen» | последовательность «unseen» |1299| метка «отвечено» | последовательность «replied» |13001301### [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage)13021303#### `[mailbox.MMDFMessage]class mailbox.MMDFMessage([message])`13041305Сообщение с поведением, специфичным для MMDF. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Message).13061307Как и сообщения в почтовом ящике mbox, сообщения MMDF хранятся с адресом отправителя и датой доставки в начальной строке, начинающейся с «From ». Аналогично, флаги, указывающие на состояние сообщения, обычно хранятся в заголовках *Status* и *X-Status*.13081309Стандартные флаги для сообщений MMDF совпадают с флагами сообщений mbox и перечислены ниже:13101311| Флаг | Значение | Пояснение |1312| --- | --- | --- |1313| R | Прочитано | Прочитано |1314| O | Старое | Ранее обнаружено почтовым клиентом |1315| D | Удалено | Помечено для последующего удаления |1316| F | Помечено | Помечено как важное |1317| A | Отвечено | Получен ответ |13181319Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.13201321Экземпляры [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) предоставляют следующие методы, идентичные методам, предоставляемым [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage):13221323#### `[mailbox.MMDFMessage.get_from]get_from()`13241325Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.13261327#### `[mailbox.MMDFMessage.set_from]set_from(from_[, time_=None])`13281329Устанавливает строку «From » в13301331*from\_*13321333, которая должна быть указана без ведущего «From » или завершающего символа новой строки. Для удобства можно указать13341335*time\_*13361337; он будет отформатирован соответствующим образом и добавлен к13381339*from\_*13401341. Если13421343*time\_*13441345указан, он должен быть экземпляром13461347`struct_time`13481349, кортежем, подходящим для передачи в13501351[`time.strftime()`](https://python-all.ru/3.0/library/time.html#time.strftime)13521353, или13541355`True`13561357(для использования13581359[`time.gmtime()`](https://python-all.ru/3.0/library/time.html#time.gmtime)13601361).13621363#### `[mailbox.MMDFMessage.get_flags]get_flags()`13641365Возвращает строку, указывающую флаги, которые в данный момент установлены. Если сообщение соответствует обычному формату, результатом является конкатенация в следующем порядке: ноль или одно вхождение каждого из13661367`'R'`13681369,13701371`'O'`13721373,13741375`'D'`13761377,13781379`'F'`13801381и13821383`'A'`13841385.13861387#### `[mailbox.MMDFMessage.set_flags]set_flags(flags)`13881389Устанавливает флаги, указанные параметром13901391*flags*13921393, и сбрасывает все остальные. Параметр13941395*flags*13961397должен быть конкатенацией в любом порядке нуля или более вхождений каждого из13981399`'R'`14001401,14021403`'O'`14041405,14061407`'D'`14081409,14101411`'F'`14121413и14141415`'A'`14161417.14181419#### `[mailbox.MMDFMessage.add_flag]add_flag(flag)`14201421Устанавливает флаг(и), указанные в14221423*flag*14241425, не изменяя другие флаги. Чтобы добавить более одного флага за раз,14261427*flag*14281429может быть строкой из более чем одного символа.14301431#### `[mailbox.MMDFMessage.remove_flag]remove_flag(flag)`14321433Снимает флаг(и), указанные в14341435*flag*14361437, не изменяя другие флаги. Чтобы снять несколько флагов одновременно,14381439*flag*14401441может быть строкой из более чем одного символа.14421443Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage), и выполняются следующие преобразования:14441445| Результирующее состояние | [`MaildirMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MaildirMessage) состояние |1446| --- | --- |1447| Флаг R | Флаг S |1448| Флаг O | Подкаталог «cur» |1449| Флаг D | Флаг T |1450| Флаг F | Флаг F |1451| Флаг A | Флаг R |14521453Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage), выполняются следующие преобразования:14541455| Результирующее состояние | [`MHMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MHMessage) состояние |1456| --- | --- |1457| Флаг R и флаг O | нет последовательности «unseen» |1458| Флаг O | последовательность «unseen» |1459| Флаг F | последовательность «flagged» |1460| Флаг A | последовательность «replied» |14611462Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage), выполняются следующие преобразования:14631464| Результирующее состояние | [`BabylMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.BabylMessage) состояние |1465| --- | --- |1466| Флаг R и флаг O | нет метки «unseen» |1467| Флаг O | метка «unseen» |1468| Флаг D | метка «удалено» |1469| Флаг A | метка «отвечено» |14701471Когда экземпляр [`MMDFMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage), строка «From » копируется и все флаги напрямую соответствуют:14721473| Результирующее состояние | [`mboxMessage`](https://python-all.ru/3.0/library/mailbox.html#mailbox.mboxMessage) состояние |1474| --- | --- |1475| Флаг R | Флаг R |1476| Флаг O | Флаг O |1477| Флаг D | Флаг D |1478| Флаг F | Флаг F |1479| Флаг A | Флаг A |14801481## Исключения14821483В модуле `mailbox` определены следующие классы исключений:14841485#### `[mailbox.Error]exception mailbox.Error`14861487Базовый класс для всех остальных исключений, специфичных для модуля.14881489#### `[mailbox.NoSuchMailboxError]exception mailbox.NoSuchMailboxError`14901491Возникает, когда ожидается почтовый ящик, но он не найден, например, при создании экземпляра подкласса14921493[`Mailbox`](https://python-all.ru/3.0/library/mailbox.html#mailbox.Mailbox)14941495с несуществующим путём (и с параметром14961497*create*14981499, установленным в15001501`False`15021503), или при открытии несуществующей папки.15041505#### `[mailbox.NotEmptyError]exception mailbox.NotEmptyError`15061507Вызывается, когда почтовый ящик не пуст, но ожидается пустым, например, при удалении папки, содержащей сообщения.15081509#### `[mailbox.ExternalClashError]exception mailbox.ExternalClashError`15101511Возникает, когда не зависящее от программы условие, связанное с почтовым ящиком, не позволяет продолжить работу, например, когда не удаётся получить блокировку, которая уже удерживается другой программой, или когда сгенерированное уникальное имя файла уже существует.15121513#### `[mailbox.FormatError]exception mailbox.FormatError`15141515Возникает, когда данные в файле не могут быть разобраны, например, когда экземпляр15161517[`MH`](https://python-all.ru/3.0/library/mailbox.html#mailbox.MH)15181519пытается прочитать повреждённый файл15201521`.mh_sequences`15221523.15241525## Примеры15261527Простой пример вывода тем всех сообщений в почтовом ящике, которые кажутся интересными:15281529```python1530import mailbox1531for message in mailbox.mbox('~/mbox'):1532 subject = message['subject'] # Может быть None.1533 if subject and 'python' in subject.lower():1534 print(subject)1535```15361537Чтобы скопировать все письма из почтового ящика Babyl в почтовый ящик MH, преобразуя всю форматно-специфичную информацию, которую можно преобразовать:15381539```python1540import mailbox1541destination = mailbox.MH('~/Mail')1542destination.lock()1543for message in mailbox.Babyl('~/RMAIL'):1544 destination.add(mailbox.MHMessage(message))1545destination.flush()1546destination.unlock()1547```15481549Этот пример сортирует письма из нескольких списков рассылки по разным почтовым ящикам, стараясь избежать повреждения писем из-за одновременного изменения другими программами, потери писем из-за прерывания программы или преждевременного завершения из-за повреждённых сообщений в почтовом ящике:15501551```python1552import mailbox1553import email.Errors15541555list_names = ('python-list', 'python-dev', 'python-bugs')15561557boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}1558inbox = mailbox.Maildir('~/Maildir', factory=None)15591560for key in inbox.iterkeys():1561 try:1562 message = inbox[key]1563 except email.Errors.MessageParseError:1564 continue # Сообщение повреждено. Просто оставьте его.15651566 for name in list_names:1567 list_id = message['list-id']1568 if list_id and name in list_id:1569 # Получить почтовый ящик для использования.1570 box = boxes[name]15711572 # Записать копию на диск перед удалением оригинала.1573 # Если произошёл сбой, возможно дублирование сообщения, но1574 # это лучше, чем полная потеря сообщения.1575 box.lock()1576 box.add(message)1577 box.flush()1578 box.unlock()15791580 # Удалить исходное сообщение1581 inbox.lock()1582 inbox.discard(key)1583 inbox.flush()1584 inbox.unlock()1585 break # Целевой получатель найден, поиск прекращён.15861587for box in boxes.itervalues():1588 box.close()1589```1590