mailbox.md
1> **Источник:** https://python-all.ru/2.7/library/mailbox.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.4. [`mailbox`](https://python-all.ru/2.7/library/mailbox.html#module-mailbox) – Управление почтовыми ящиками в различных форматах89Этот модуль определяет два класса, [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) и [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), для доступа к почтовым ящикам на диске и управления ими, а также для работы с содержащимися в них сообщениями. [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) предоставляет отображение, похожее на словарь, где ключи сопоставляются с сообщениями. [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) расширяет класс [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) из модуля [`email.message`](https://python-all.ru/2.7/library/email.message.html#module-email.message), добавляя формат-специфичное состояние и поведение. Поддерживаемые форматы почтовых ящиков: Maildir, mbox, MH, Babyl и MMDF.1011> **См. также**12>13> **Модуль [`email`](https://python-all.ru/2.7/library/email.html#module-email)**14>15> Представление сообщений и управление ими.1617## 18.4.1. [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) объекты1819#### `class mailbox.Mailbox`2021Почтовый ящик, который можно просматривать и изменять.2223Класс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) определяет интерфейс и не предназначен для создания экземпляров. Вместо этого следует наследовать формат-специфичные подклассы от [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), а код должен создавать экземпляры конкретного подкласса.2425Интерфейс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) напоминает словарь: небольшие ключи соответствуют сообщениям. Ключи выдаются экземпляром [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), с которым они будут использоваться, и имеют смысл только для этого экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox). Ключ продолжает идентифицировать сообщение, даже если соответствующее сообщение изменяется, например, заменяется другим сообщением.2627Сообщения можно добавлять в экземпляр [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) с помощью метода [`add()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.add) (подобного set) и удалять с помощью инструкции `del` или методов [`remove()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.remove) и [`discard()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.discard) (также подобных set).2829Семантика интерфейса [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) отличается от семантики словаря в некоторых важных аспектах. При каждом запросе сообщения на основе текущего состояния почтового ящика создаётся новое представление (обычно экземпляр [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message)). Аналогично, при добавлении сообщения в экземпляр [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) содержимое переданного представления сообщения копируется. Ни в одном из случаев экземпляр [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) не сохраняет ссылку на представление сообщения.3031Итератор по умолчанию [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) перебирает представления сообщений, а не ключи, как это делает итератор словаря по умолчанию. Кроме того, изменение почтового ящика во время итерации безопасно и хорошо определено. Сообщения, добавленные в почтовый ящик после создания итератора, не будут видны итератору. Сообщения, удалённые из почтового ящика до того, как итератор их вернёт, будут молча пропущены, хотя использование ключа из итератора может привести к исключению [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если соответствующее сообщение будет впоследствии удалено.3233> **Предупреждение**34>35> Будьте предельно осторожны при изменении почтовых ящиков, которые могут одновременно изменяться другим процессом. Самый безопасный формат почтового ящика для таких задач – Maildir; старайтесь избегать использования однофайловых форматов, таких как mbox, для одновременной записи. Если вы изменяете почтовый ящик, вы *должны* заблокировать его, вызвав методы [`lock()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.lock) и [`unlock()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.unlock) *перед* чтением любых сообщений в файле или внесением каких-либо изменений путём добавления или удаления сообщения. Несоблюдение блокировки почтового ящика чревато потерей сообщений или повреждением всего почтового ящика.3637Экземпляры [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) имеют следующие методы:3839#### `add(message)`4041Добавляет *сообщение* в почтовый ящик и возвращает ключ, который был ему присвоен.4243Параметр *message* может быть экземпляром [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), экземпляром [`email.message.Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если *message* является экземпляром соответствующего формат-специфичного подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) (например, если это экземпляр [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage), а это – экземпляр [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox)), то используется его формат-специфичная информация. В противном случае используются разумные значения по умолчанию для формат-специфичной информации.4445#### `remove(key)`4647#### `__delitem__(key)`4849#### `discard(key)`5051Удаляет сообщение, соответствующее *ключу*, из почтового ящика.5253Если такого сообщения не существует, возникает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если метод был вызван как [`remove()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.remove) или [`__delitem__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__delitem__), но исключение не возникает, если метод был вызван как [`discard()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.discard). Поведение [`discard()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.discard) может быть предпочтительнее, если базовый формат почтового ящика поддерживает одновременное изменение другими процессами.5455#### `__setitem__(key, message)`5657Заменяет сообщение, соответствующее *ключу*, на *сообщение*. Возникает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если *ключу* ещё не соответствует ни одно сообщение.5859Как и в случае с [`add()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.add), параметр *message* может быть экземпляром [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), экземпляром [`email.message.Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если *message* является экземпляром соответствующего формат-специфичного подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) (например, если это экземпляр [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage), а это – экземпляр [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox)), то используется его формат-специфичная информация. В противном случае формат-специфичная информация сообщения, которое в данный момент соответствует *key*, остаётся неизменной.6061#### `iterkeys()`6263#### `keys()`6465Возвращает итератор по всем ключам, если вызван как [`iterkeys()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.iterkeys), или возвращает список ключей, если вызван как [`keys()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.keys).6667#### `itervalues()`6869#### `__iter__()`7071#### `values()`7273Возвращает итератор по представлениям всех сообщений, если вызван как [`itervalues()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.itervalues) или [`__iter__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__iter__), или возвращает список таких представлений, если вызван как [`values()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.values). Сообщения представлены в виде экземпляров соответствующего подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), зависящего от формата, если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.7475> **Примечание**76>77> Поведение [`__iter__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__iter__) отличается от поведения словарей, которые перебирают ключи.7879#### `iteritems()`8081#### `items()`8283Возвращает итератор по парам (*key*, *message*), где *key* – ключ, а *message* – представление сообщения, если вызван как [`iteritems()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.iteritems), или возвращает список таких пар, если вызван как [`items()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.items). Сообщения представлены в виде экземпляров соответствующего подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), зависящего от формата, если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.8485#### `get(key, default=None)`8687#### `__getitem__(key)`8889Возвращает представление сообщения, соответствующего *ключу*. Если такого сообщения нет, *default* возвращается, если метод был вызван как [`get()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.get), и вызывается исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если метод был вызван как [`__getitem__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__getitem__). Сообщение представляется в виде экземпляра соответствующего подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.9091#### `get_message(key)`9293Возвращает представление сообщения, соответствующего *ключу*, в виде экземпляра соответствующего подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), или вызывает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если такого сообщения нет.9495#### `get_string(key)`9697Возвращает строковое представление сообщения, соответствующего *key*, или возбуждает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если такого сообщения не существует.9899#### `get_file(key)`100101Возвращает файлоподобное представление сообщения, соответствующего *key*, или возбуждает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если такого сообщения не существует. Файлоподобный объект ведёт себя так, как если бы он был открыт в двоичном режиме. Этот файл следует закрыть, когда он больше не нужен.102103> **Примечание**104>105> В отличие от других представлений сообщений, файлоподобные представления не обязательно независимы от экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), который их создал, или от нижележащего почтового ящика. Более подробная документация предоставляется каждым подклассом.106107#### `has_key(key)`108109#### `__contains__(key)`110111Возвращает `True`, если *ключ* соответствует сообщению, и `False` в противном случае.112113#### `__len__()`114115Возвращает количество сообщений в почтовом ящике.116117#### `clear()`118119Удаляет все сообщения из почтового ящика.120121#### `pop(key[, default])`122123Возвращает представление сообщения, соответствующего *key*, и удаляет сообщение. Если такого сообщения не существует, возвращает *default*, если он был указан, иначе возбуждает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError). Сообщение представляется в виде экземпляра соответствующего формат-специфичного подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), если только не была указана пользовательская фабрика сообщений при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox).124125#### `popitem()`126127Возвращает произвольную пару (*ключ*, *сообщение*), где *ключ* – это ключ, а *сообщение* – представление сообщения, и удаляет соответствующее сообщение. Если почтовый ящик пуст, вызывает исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError). Сообщение представляется в виде экземпляра соответствующего подкласса [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), если только при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) не была указана пользовательская фабрика сообщений.128129#### `update(arg)`130131Параметр *arg* должен быть отображением *ключ* → *сообщение* или итерируемым объектом из пар (*ключ*, *сообщение*). Обновляет почтовый ящик так, что для каждой заданной пары *ключ* и *сообщение* сообщение, соответствующее *ключу*, устанавливается в *сообщение* как если бы с помощью [`__setitem__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__setitem__). Как и в случае с [`__setitem__()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.__setitem__), каждый *ключ* уже должен соответствовать сообщению в почтовом ящике, иначе будет вызвано исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), поэтому в общем случае неправильно, чтобы *arg* был экземпляром [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox).132133> **Примечание**134>135> В отличие от словарей, именованные аргументы не поддерживаются.136137#### `flush()`138139Записывает все ожидающие изменения в файловую систему. Для некоторых подклассов [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) изменения всегда записываются сразу, и [`flush()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox.flush) ничего не делает, но всё же стоит выработать привычку вызывать этот метод.140141#### `lock()`142143Устанавливает исключительную рекомендательную блокировку на почтовый ящик, чтобы другие процессы знали, что его не следует изменять. Если блокировка недоступна, возбуждается исключение [`ExternalClashError`](https://python-all.ru/2.7/library/mailbox.html#mailbox.ExternalClashError). Конкретные механизмы блокировки зависят от формата почтового ящика. Перед любыми изменениями содержимого следует *всегда* блокировать почтовый ящик.144145#### `unlock()`146147Освобождает блокировку почтового ящика, если она установлена.148149#### `close()`150151Сбрасывает почтовый ящик, при необходимости снимает блокировку и закрывает все открытые файлы. Для некоторых подклассов [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) этот метод ничего не делает.152153### 18.4.1.1. [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir)154155#### `class mailbox.Maildir(dirname, factory=rfc822.Message, create=True)`156157Подкласс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Maildir. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, в качестве представления сообщения по умолчанию используется [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage). Если *create* равно `True`, почтовый ящик создаётся, если он не существует.158159По историческим причинам *factory* по умолчанию равен [`rfc822.Message`](https://python-all.ru/2.7/library/rfc822.html#rfc822.Message), а *dirname* назван так, а не *path*. Для экземпляра [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir), который ведёт себя как экземпляры других подклассов [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), следует установить *factory* в `None`.160161Maildir – это почтовый формат на основе каталогов, разработанный для агента передачи почты qmail и ныне широко поддерживаемый другими программами. Сообщения в почтовом ящике Maildir хранятся в отдельных файлах в общей структуре каталогов. Такая архитектура позволяет нескольким независимым программам получать доступ и изменять почтовые ящики Maildir без повреждения данных, поэтому файловая блокировка не требуется.162163Почтовые ящики Maildir содержат три подкаталога: `tmp`, `new` и `cur`. Сообщения создаются в подкаталоге `tmp`, а затем перемещаются в подкаталог `new` для завершения доставки. После этого почтовый клиент может переместить сообщение в подкаталог `cur` и сохранить информацию о состоянии сообщения в специальном разделе «info», добавляемом к его имени файла.164165Также поддерживаются папки в стиле, введённом агентом передачи почты Courier. Любой подкаталог основного почтового ящика считается папкой, если первым символом в его имени является `'.'`. Имена папок представляются как [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir) без ведущего `'.'`. Каждая папка сама является почтовым ящиком Maildir, но не должна содержать другие папки. Вместо этого логическая вложенность указывается с помощью `'.'` для разделения уровней, например, «Archived.2005.07».166167> **Примечание**168>169> Спецификация Maildir требует использования двоеточия (`':'`) в некоторых именах файлов сообщений. Однако некоторые операционные системы не допускают этот символ в именах файлов. Если вы хотите использовать формат, подобный Maildir, в такой операционной системе, следует указать другой символ для замены. Восклицательный знак (`'!'`) – популярный выбор. Например:170>171> ```python172> import mailbox173> mailbox.Maildir.colon = '!'174> ```175>176> Атрибут `colon` также может быть установлен для каждого экземпляра отдельно.177178Экземпляры [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir) имеют все методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), а также следующие:179180#### `list_folders()`181182Возвращает список имён всех папок.183184#### `get_folder(folder)`185186Возвращает экземпляр [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir), представляющий папку с именем *folder*. Если папка не существует, возбуждается исключение [`NoSuchMailboxError`](https://python-all.ru/2.7/library/mailbox.html#mailbox.NoSuchMailboxError).187188#### `add_folder(folder)`189190Создаёт папку с именем *folder* и возвращает экземпляр [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir), представляющий её.191192#### `remove_folder(folder)`193194Удаляет папку с именем *folder*. Если папка содержит сообщения, будет возбуждено исключение [`NotEmptyError`](https://python-all.ru/2.7/library/mailbox.html#mailbox.NotEmptyError), и папка не будет удалена.195196#### `clean()`197198Удаляет временные файлы из почтового ящика, к которым не было обращений за последние 36 часов. Спецификация Maildir утверждает, что программы чтения почты должны делать это время от времени.199200Некоторые методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), реализованные в [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir), заслуживают особых замечаний:201202#### `add(message)`203204#### `__setitem__(key, message)`205206#### `update(arg)`207208> **Предупреждение**209>210> Эти методы генерируют уникальные имена файлов на основе идентификатора текущего процесса. При использовании нескольких потоков возможны незамеченные конфликты имен, которые могут привести к повреждению почтового ящика, если потоки не скоординированы, чтобы избежать одновременного использования этих методов для управления одним и тем же почтовым ящиком.211212#### `flush()`213214Все изменения в почтовых ящиках Maildir применяются немедленно, поэтому этот метод ничего не делает.215216#### `lock()`217218#### `unlock()`219220Почтовые ящики Maildir не поддерживают (и не требуют) блокировку, поэтому эти методы ничего не делают.221222#### `close()`223224Экземпляры [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir) не держат открытых файлов, а нижележащие почтовые ящики не поддерживают блокировку, поэтому этот метод ничего не делает.225226#### `get_file(key)`227228В зависимости от платформы может быть невозможно изменить или удалить нижележащее сообщение, пока возвращенный файл остается открытым.229230> **См. также**231>232> **[Страница руководства maildir из qmail](https://python-all.ru/2.7/library/mailbox.html)**233>234> Оригинальная спецификация формата.235>236> **[Использование формата maildir](https://python-all.ru/2.7/library/mailbox.html)**237>238> Заметки о Maildir от его создателя. Включают обновлённую схему создания имён и детали семантики «info».239>240> **[man-страница maildir из Courier](https://python-all.ru/2.7/library/mailbox.html)**241>242> Другая спецификация формата. Описывает распространённое расширение для поддержки папок.243244### 18.4.1.2. [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox)245246#### `class mailbox.mbox(path, factory=None, create=True)`247248Подкласс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате mbox. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если *factory* равен `None`, в качестве представления сообщения по умолчанию используется [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage). Если *create* равен `True`, почтовый ящик создаётся, если он не существует.249250Формат mbox – это классический формат хранения почты в системах Unix. Все сообщения в почтовом ящике mbox хранятся в одном файле, при этом начало каждого сообщения обозначается строкой, первые пять символов которой – «From ».251252Существует несколько вариантов формата mbox, призванных устранить недостатки исходного. В целях совместимости [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox) реализует исходный формат, иногда называемый *mboxo*. Это означает, что заголовок *Content-Length*, если он присутствует, игнорируется, а все вхождения «From » в начале строки тела сообщения преобразуются в «\>From » при сохранении сообщения, хотя вхождения «\>From » не преобразуются обратно в «From » при чтении сообщения.253254Некоторые методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), реализованные в [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox), заслуживают особых замечаний:255256#### `get_file(key)`257258Использование файла после вызова `flush()` или `close()` для экземпляра [`mbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mbox) может привести к непредсказуемым результатам или вызвать исключение.259260#### `lock()`261262#### `unlock()`263264Используются три механизма блокировки: точечная блокировка (dot locking) и, если доступны, системные вызовы `flock()` и `lockf()`.265266> **См. также**267>268> **[Страница руководства mbox из qmail](https://python-all.ru/2.7/library/mailbox.html)**269>270> Спецификация формата и его разновидностей.271>272> **[Страница man mbox из tin](https://python-all.ru/2.7/library/mailbox.html)**273>274> Другая спецификация формата, с подробностями о блокировке.275>276> **[Настройка Netscape Mail в Unix: почему формат Content-Length плох](https://python-all.ru/2.7/library/mailbox.html)**277>278> Аргумент в пользу использования оригинального формата mbox, а не его вариации.279>280> **[«mbox» – это семейство нескольких взаимно несовместимых форматов почтовых ящиков](https://python-all.ru/2.7/library/mailbox.html)**281>282> История вариаций mbox.283284### 18.4.1.3. [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH)285286#### `class mailbox.MH(path, factory=None, create=True)`287288Подкласс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MH. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если *factory* равен `None`, в качестве представления сообщения по умолчанию используется [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage). Если *create* равен `True`, почтовый ящик создаётся, если он не существует.289290MH – это формат почтовых ящиков на основе каталогов, разработанный для MH Message Handling System, почтового клиента. Каждое сообщение в почтовом ящике MH находится в собственном файле. Почтовый ящик MH может содержать другие почтовые ящики MH (называемые *папками*) помимо сообщений. Папки могут быть вложены неограниченно. Почтовые ящики MH также поддерживают *последовательности* – именованные списки, используемые для логической группировки сообщений без их перемещения в подпапки. Последовательности определяются в файле с именем `.mh_sequences` в каждой папке.291292Класс [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH) управляет почтовыми ящиками MH, но не пытается эмулировать все поведения **mh**. В частности, он не изменяет и не зависит от файлов `context` и `.mh_profile`, которые используются программой **mh** для хранения своего состояния и конфигурации.293294Экземпляры [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH) имеют все методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), а также следующие:295296#### `list_folders()`297298Возвращает список имён всех папок.299300#### `get_folder(folder)`301302Возвращает экземпляр [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH), представляющий папку с именем *folder*. Исключение [`NoSuchMailboxError`](https://python-all.ru/2.7/library/mailbox.html#mailbox.NoSuchMailboxError) возникает, если папка не существует.303304#### `add_folder(folder)`305306Создаёт папку с именем *folder* и возвращает экземпляр [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH) представляющий её.307308#### `remove_folder(folder)`309310Удаляет папку с именем *folder*. Если папка содержит сообщения, будет возбуждено исключение [`NotEmptyError`](https://python-all.ru/2.7/library/mailbox.html#mailbox.NotEmptyError), и папка не будет удалена.311312#### `get_sequences()`313314Возвращает словарь, где имена последовательностей сопоставлены со списками ключей. Если последовательностей нет, возвращается пустой словарь.315316#### `set_sequences(sequences)`317318Переопределяет последовательности, существующие в почтовом ящике, на основе *sequences*, словаря, где имена сопоставлены со списками ключей, аналогично возвращаемому [`get_sequences()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH.get_sequences).319320#### `pack()`321322Переименовывает сообщения в почтовом ящике по мере необходимости для устранения пропусков в нумерации. Записи в списке последовательностей обновляются соответствующим образом.323324> **Примечание**325>326> Ранее выданные ключи становятся недействительными в результате этой операции и не должны использоваться в дальнейшем.327328Некоторые методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), реализованные в [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH), заслуживают особых замечаний:329330#### `remove(key)`331332#### `__delitem__(key)`333334#### `discard(key)`335336Эти методы немедленно удаляют сообщение. Соглашение MH помечать сообщение на удаление добавлением запятой к его имени не используется.337338#### `lock()`339340#### `unlock()`341342Используются три механизма блокировки: точечная блокировка и, если доступны, системные вызовы `flock()` и `lockf()`. Для почтовых ящиков MH блокировка почтового ящика означает блокировку файла `.mh_sequences` и, только на время любых операций, затрагивающих их, блокировку отдельных файлов сообщений.343344#### `get_file(key)`345346В зависимости от платформы может быть невозможно удалить базовое сообщение, пока возвращённый файл остаётся открытым.347348#### `flush()`349350Все изменения в почтовых ящиках MH применяются немедленно, поэтому этот метод ничего не делает.351352#### `close()`353354Экземпляры [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH) не держат открытых файлов, поэтому этот метод эквивалентен [`unlock()`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH.unlock).355356> **См. также**357>358> **[nmh – система обработки сообщений](https://python-all.ru/2.7/library/mailbox.html)**359>360> Домашняя страница **nmh**, обновлённой версии исходного **mh**.361>362> **[MH и nmh: электронная почта для пользователей и программистов](https://python-all.ru/2.7/library/mailbox.html)**363>364> Книга, лицензированная под GPL, о **mh** и **nmh**, с некоторой информацией о формате почтового ящика.365366### 18.4.1.4. [`Babyl`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Babyl)367368#### `class mailbox.Babyl(path, factory=None, create=True)`369370Подкласс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате Babyl. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, в качестве представления сообщения по умолчанию используется [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage). Если *create* равно `True`, почтовый ящик создаётся, если он не существует.371372Babyl – это однофайловый формат почтового ящика, используемый почтовым клиентом Rmail, входящим в состав Emacs. Начало сообщения обозначается строкой, содержащей два символа: Control-Подчёркивание (`'\037'`) и Control-L (`'\014'`). Конец сообщения обозначается началом следующего сообщения или, в случае последнего сообщения, строкой, содержащей символ Control-Подчёркивание (`'\037'`).373374Сообщения в почтовом ящике Babyl имеют два набора заголовков: исходные заголовки и так называемые видимые заголовки. Видимые заголовки обычно являются подмножеством исходных заголовков, которые были переформатированы или сокращены для большей привлекательности. Каждое сообщение в почтовом ящике Babyl также имеет сопутствующий список *меток* (коротких строк, которые записывают дополнительную информацию о сообщении), а список всех определённых пользователем меток, найденных в почтовом ящике, хранится в разделе параметров Babyl.375376Экземпляры [`Babyl`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Babyl) имеют все методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), а также следующие:377378#### `get_labels()`379380Возвращает список имён всех определённых пользователем меток, используемых в почтовом ящике.381382> **Примечание**383>384> Фактические сообщения проверяются для определения того, какие метки существуют в почтовом ящике, вместо обращения к списку меток в разделе параметров Babyl, но раздел Babyl обновляется при каждом изменении почтового ящика.385386Некоторые методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), реализованные в [`Babyl`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Babyl), заслуживают особых замечаний:387388#### `get_file(key)`389390В почтовых ящиках Babyl заголовки сообщения не хранятся непосредственно вместе с телом сообщения. Чтобы создать файлоподобное представление, заголовки и тело копируются вместе в экземпляр [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) (из модуля [`StringIO`](https://python-all.ru/2.7/library/stringio.html#module-StringIO)), API которого идентичен файловому. В результате файлоподобный объект полностью независим от нижележащего почтового ящика, но не экономит память по сравнению со строковым представлением.391392#### `lock()`393394#### `unlock()`395396Используются три механизма блокировки: точечная блокировка (dot locking) и, если доступны, системные вызовы `flock()` и `lockf()`.397398> **См. также**399>400> **[Формат файлов Babyl версии 5](https://python-all.ru/2.7/library/mailbox.html)**401>402> Спецификация формата Babyl.403>404> **[Чтение почты с помощью Rmail](https://python-all.ru/2.7/library/mailbox.html)**405>406> Руководство по Rmail, содержащее некоторую информацию о семантике Babyl.407408### 18.4.1.5. [`MMDF`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDF)409410#### `class mailbox.MMDF(path, factory=None, create=True)`411412Подкласс [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) для почтовых ящиков в формате MMDF. Параметр *factory* – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя так, как если бы оно было открыто в двоичном режиме) и возвращает пользовательское представление. Если *factory* равно `None`, в качестве представления сообщения по умолчанию используется [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage). Если *create* равно `True`, почтовый ящик создаётся, если он не существует.413414MMDF – это однофайловый формат почтового ящика, разработанный для Multichannel Memorandum Distribution Facility – агента пересылки почты. Каждое сообщение имеет ту же форму, что и сообщение mbox, но обрамляется строками, содержащими четыре символа Control-A (`'\001'`). Как и в формате mbox, начало каждого сообщения обозначается строкой, первые пять символов которой – «From », но дополнительные вхождения «From » не преобразуются в «\>From » при сохранении сообщений, так как дополнительные строки-разделители сообщений предотвращают ошибочный прием таких вхождений за начала последующих сообщений.415416Некоторые методы [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox), реализованные в [`MMDF`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDF), заслуживают особых замечаний:417418#### `get_file(key)`419420Использование файла после вызова `flush()` или `close()` для экземпляра [`MMDF`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDF) может привести к непредсказуемым результатам или вызвать исключение.421422#### `lock()`423424#### `unlock()`425426Используются три механизма блокировки: точечная блокировка (dot locking) и, если доступны, системные вызовы `flock()` и `lockf()`.427428> **См. также**429>430> **[страница руководства mmdf из tin](https://python-all.ru/2.7/library/mailbox.html)**431>432> Спецификация формата MMDF из документации tin, программы для чтения новостей.433>434> **[MMDF](https://python-all.ru/2.7/library/mailbox.html)**435>436> Статья в Википедии, описывающая Multichannel Memorandum Distribution Facility.437438## 18.4.2. [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) объекты439440#### `class mailbox.Message([message])`441442Подкласс [`email.message`](https://python-all.ru/2.7/library/email.message.html#module-email.message) модуля [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message). Подклассы [`mailbox.Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) добавляют состояние и поведение, специфичные для формата почтового ящика.443444Если *message* опущен, новый экземпляр создаётся в пустом состоянии по умолчанию. Если *message* является экземпляром [`email.message.Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), его содержимое копируется; более того, любая формат-специфичная информация преобразуется, насколько это возможно, если *message* является экземпляром [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message). Если *message* является строкой или файлом, он должен содержать сообщение, совместимое с [**RFC 2822**](https://python-all.ru/2.7/library/mailbox.html), которое читается и разбирается.445446Формат-специфичные состояния и поведение, предоставляемые подклассами, различаются, но в целом поддерживаются только те свойства, которые не привязаны к конкретному почтовому ящику (хотя, предположительно, эти свойства специфичны для конкретного формата почтового ящика). Например, смещения в файлах для однофайловых форматов почтовых ящиков и имена файлов для форматов на основе каталогов не сохраняются, так как они применимы только к исходному почтовому ящику. Но такие состояния, как было ли сообщение прочитано пользователем или помечено как важное, сохраняются, поскольку они относятся к самому сообщению.447448Нет требования, чтобы экземпляры [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) использовались для представления сообщений, полученных с помощью экземпляров [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox). В некоторых ситуациях время и память, необходимые для создания представлений [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), могут оказаться неприемлемыми. Для таких случаев экземпляры [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) также предлагают строковые и файлоподобные представления, а пользовательская фабрика сообщений может быть указана при инициализации экземпляра [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox).449450### 18.4.2.1. [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage)451452#### `class mailbox.MaildirMessage([message])`453454Сообщение с поведением, специфичным для Maildir. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message).455456Обычно почтовый клиент перемещает все сообщения из подкаталога `new` в подкаталог `cur` после того, как пользователь впервые открывает и закрывает почтовый ящик, отмечая, что сообщения старые, независимо от того, были ли они фактически прочитаны. Каждое сообщение в `cur` имеет раздел «info», добавленный к его имени файла для хранения информации о его состоянии. (Некоторые почтовые программы могут также добавлять раздел «info» к сообщениям в `new`.) Раздел «info» может принимать одну из двух форм: он может содержать «2,» с последующим списком стандартизированных флагов (например, «2,FR») или может содержать «1,» с последующей так называемой экспериментальной информацией. Стандартные флаги для сообщений Maildir следующие:457458| Флаг | Значение | Пояснение |459| --- | --- | --- |460| D | Черновик | В процессе составления |461| F | Помечено | Помечено как важное |462| P | Передан | Переслано, отправлено повторно или возвращено |463| R | Отвечено | Получен ответ |464| S | Просмотрено | Прочитано |465| T | Удалено | Помечено для последующего удаления |466467Экземпляры [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) предоставляют следующие методы:468469#### `get_subdir()`470471Возвращает «new» (если сообщение должно храниться в подкаталоге `new` или «cur» (если сообщение должно храниться в подкаталоге `cur`).472473> **Примечание**474>475> Сообщение обычно перемещается из `new` в `cur` после того, как к его почтовому ящику был получен доступ, независимо от того, было ли сообщение прочитано. Сообщение `msg` считается прочитанным, если `"S" in msg.get_flags()` равно `True`.476477#### `set_subdir(subdir)`478479Устанавливает подкаталог, в котором должно храниться сообщение. Параметр *subdir* должен быть либо «new», либо «cur».480481#### `get_flags()`482483Возвращает строку, указывающую текущие установленные флаги. Если сообщение соответствует стандартному формату Maildir, результатом является конкатенация в алфавитном порядке нуля или одного вхождения каждого из `'D'`, `'F'`, `'P'`, `'R'`, `'S'` и `'T'`. Возвращается пустая строка, если флаги не установлены или если «info» содержит экспериментальную семантику.484485#### `set_flags(flags)`486487Устанавливает флаги, указанные *flags*, и сбрасывает все остальные.488489#### `add_flag(flag)`490491Устанавливает флаг(и), указанные *flag*, не изменяя остальные флаги. Чтобы добавить более одного флага за раз, *flag* может быть строкой из более чем одного символа. Текущий «info» перезаписывается, независимо от того, содержит ли он экспериментальную информацию вместо флагов.492493#### `remove_flag(flag)`494495Сбрасывает флаг(и), указанные в *flag*, не изменяя другие флаги. Чтобы удалить несколько флагов за раз, *flag* может быть строкой из более чем одного символа. Если «info» содержит экспериментальную информацию, а не флаги, текущий «info» не изменяется.496497#### `get_date()`498499Возвращает дату доставки сообщения в виде числа с плавающей запятой, представляющего количество секунд с начала эпохи.500501#### `set_date(date)`502503Устанавливает дату доставки сообщения в *date*, число с плавающей запятой, представляющее количество секунд с начала эпохи.504505#### `get_info()`506507Возвращает строку, содержащую «info» для сообщения. Это полезно для доступа к экспериментальному «info» и его изменения (т.е. не являющегося списком флагов).508509#### `set_info(info)`510511Устанавливает «info» в *info*, которое должно быть строкой.512513Когда экземпляр [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются и происходят следующие преобразования:514515| Результирующее состояние | [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) состояние |516| --- | --- |517| Подкаталог «cur» | Флаг O |518| Флаг F | Флаг F |519| Флаг R | Флаг A |520| Флаг S | Флаг R |521| Флаг T | Флаг D |522523Когда экземпляр [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage), происходят следующие преобразования:524525| Результирующее состояние | Состояние [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) |526| --- | --- |527| Подкаталог «cur» | последовательность «unseen» |528| подкаталог «cur» и флаг S | нет последовательности «unseen» |529| Флаг F | последовательность «flagged» |530| Флаг R | последовательность «replied» |531532Когда экземпляр [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage), происходят следующие преобразования:533534| Результирующее состояние | Состояние [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) |535| --- | --- |536| Подкаталог «cur» | метка «unseen» |537| подкаталог «cur» и флаг S | нет метки «unseen» |538| Флаг P | метка «forwarded» или «resent» |539| Флаг R | метка «отвечено» |540| Флаг T | метка «удалено» |541542### 18.4.2.2. [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage)543544#### `class mailbox.mboxMessage([message])`545546Сообщение с поведением, специфичным для mbox. Параметр *message* имеет тот же смысл, что и в конструкторе [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message).547548Сообщения в почтовом ящике mbox хранятся вместе в одном файле. Адрес отправителя (envelope address) и время доставки обычно хранятся в строке, начинающейся с «From », которая используется для обозначения начала сообщения, хотя точный формат этих данных сильно различается в разных реализациях mbox. Флаги, указывающие на состояние сообщения, такие как прочитано или помечено как важное, обычно хранятся в заголовках *Status* и *X-Status*.549550Обычные флаги для сообщений mbox:551552| Флаг | Значение | Пояснение |553| --- | --- | --- |554| R | Прочитано | Прочитано |555| O | Старое | Ранее обнаружено почтовым клиентом |556| D | Удалено | Помечено для последующего удаления |557| F | Помечено | Помечено как важное |558| A | Отвечено | Получен ответ |559560Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.561562Экземпляры [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) предоставляют следующие методы:563564#### `get_from()`565566Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.567568#### `set_from(from_, time_=None)`569570Устанавливает строку «From » равной *from\_*, которая должна быть указана без начальной «From » или конечного символа новой строки. Для удобства можно указать *time\_*, и она будет правильно отформатирована и добавлена к *from\_*. Если *time\_* указан, это должен быть экземпляр [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time), кортеж, подходящий для передачи в [`time.strftime()`](https://python-all.ru/2.7/library/time.html#time.strftime), или `True` (для использования [`time.gmtime()`](https://python-all.ru/2.7/library/time.html#time.gmtime)).571572#### `get_flags()`573574Возвращает строку, указывающую установленные флаги. Если сообщение соответствует стандартному формату, результатом является конкатенация в следующем порядке нуля или одного вхождения каждого из `'R'`, `'O'`, `'D'`, `'F'` и `'A'`.575576#### `set_flags(flags)`577578Устанавливает флаги, указанные в *flags*, и снимает все остальные. Параметр *flags* должен быть конкатенацией в произвольном порядке нуля или более вхождений каждого из `'R'`, `'O'`, `'D'`, `'F'` и `'A'`.579580#### `add_flag(flag)`581582Устанавливает флаг(и), указанные в *flag*, не изменяя другие флаги. Чтобы добавить более одного флага за раз, *flag* может быть строкой из более чем одного символа.583584#### `remove_flag(flag)`585586Снимает флаг(и), указанные в *flag*, не изменяя другие флаги. Чтобы снять несколько флагов одновременно, *flag* может быть строкой из более чем одного символа.587588Когда экземпляр [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) создается на основе экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), и происходят следующие преобразования:589590| Результирующее состояние | Состояние [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) |591| --- | --- |592| Флаг R | Флаг S |593| Флаг O | Подкаталог «cur» |594| Флаг D | Флаг T |595| Флаг F | Флаг F |596| Флаг A | Флаг R |597598Когда экземпляр [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage), происходят следующие преобразования:599600| Результирующее состояние | Состояние [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) |601| --- | --- |602| Флаг R и флаг O | нет последовательности «unseen» |603| Флаг O | последовательность «unseen» |604| Флаг F | последовательность «flagged» |605| Флаг A | последовательность «replied» |606607Когда экземпляр [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage), происходят следующие преобразования:608609| Результирующее состояние | Состояние [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) |610| --- | --- |611| Флаг R и флаг O | нет метки «unseen» |612| Флаг O | метка «unseen» |613| Флаг D | метка «удалено» |614| Флаг A | метка «отвечено» |615616Когда экземпляр [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message) создается на основе экземпляра [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage), строка «From » копируется, и все флаги напрямую соответствуют:617618| Результирующее состояние | Состояние [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) |619| --- | --- |620| Флаг R | Флаг R |621| Флаг O | Флаг O |622| Флаг D | Флаг D |623| Флаг F | Флаг F |624| Флаг A | Флаг A |625626### 18.4.2.3. [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage)627628#### `class mailbox.MHMessage([message])`629630Сообщение с поведением, характерным для MH. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message).631632Сообщения MH не поддерживают метки и флаги в традиционном понимании, но поддерживают последовательности – логические группировки произвольных сообщений. Некоторые почтовые программы (хотя не стандартные **mh** и **nmh**) используют последовательности примерно так же, как флаги используются в других форматах:633634| Последовательность | Пояснение |635| --- | --- |636| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |637| отвечено | Получен ответ |638| помечено | Помечено как важное |639640Экземпляры [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) предоставляют следующие методы:641642#### `get_sequences()`643644Возвращает список имен последовательностей, которые включают это сообщение.645646#### `set_sequences(sequences)`647648Устанавливает список последовательностей, которые включают это сообщение.649650#### `add_sequence(sequence)`651652Добавляет *sequence* в список последовательностей, которые включают это сообщение.653654#### `remove_sequence(sequence)`655656Удаляет *sequence* из списка последовательностей, которые включают это сообщение.657658Когда экземпляр [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), происходят следующие преобразования:659660| Результирующее состояние | Состояние [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) |661| --- | --- |662| последовательность «unseen» | нет флага S |663| последовательность «replied» | Флаг R |664| последовательность «flagged» | Флаг F |665666Когда экземпляр [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) создается на основе экземпляра [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются и происходят следующие преобразования:667668| Результирующее состояние | [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) состояние |669| --- | --- |670| последовательность «unseen» | нет флага R |671| последовательность «replied» | Флаг A |672| последовательность «flagged» | Флаг F |673674Когда экземпляр [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage), происходят следующие преобразования:675676| Результирующее состояние | Состояние [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) |677| --- | --- |678| последовательность «unseen» | метка «unseen» |679| последовательность «replied» | метка «отвечено» |680681### 18.4.2.4. [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage)682683#### `class mailbox.BabylMessage([message])`684685Сообщение с поведением, специфичным для Babyl. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message).686687Некоторые метки сообщений, называемые *attributes*, по соглашению имеют специальное значение. Атрибуты следующие:688689| Метка | Пояснение |690| --- | --- |691| непрочитанное | Не прочитано, но ранее обнаружено почтовым клиентом (MUA) |692| удалено | Помечено для последующего удаления |693| архивировано | Скопировано в другой файл или почтовый ящик |694| отвечено | Получен ответ |695| переслано | Переслано |696| изменено | Изменено пользователем |697| переотправлено | Отправлено повторно |698699По умолчанию Rmail отображает только видимые заголовки. Однако класс [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) использует исходные заголовки, поскольку они более полны. При желании к видимым заголовкам можно обратиться явно.700701Экземпляры [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) предоставляют следующие методы:702703#### `get_labels()`704705Возвращает список меток сообщения.706707#### `set_labels(labels)`708709Устанавливает список меток сообщения равным *labels*.710711#### `add_label(label)`712713Добавляет метку *label* в список меток сообщения.714715#### `remove_label(label)`716717Удаляет метку *label* из списка меток сообщения.718719#### `get_visible()`720721Возвращает экземпляр [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), содержащий видимые заголовки сообщения и пустое тело.722723#### `set_visible(visible)`724725Устанавливает видимые заголовки сообщения такими же, как заголовки из *message*. Параметр *visible* должен быть экземпляром [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message), экземпляром [`email.message.Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме).726727#### `update_visible()`728729Когда исходные заголовки экземпляра [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) изменяются, видимые заголовки автоматически не изменяются для соответствия. Этот метод обновляет видимые заголовки следующим образом: каждый видимый заголовок с соответствующим исходным заголовком устанавливается в значение исходного заголовка, каждый видимый заголовок без соответствующего исходного заголовка удаляется, а любые из *Date*, *From*, *Reply-To*, *To*, *CC* и *Subject*, которые присутствуют в исходных заголовках, но отсутствуют в видимых заголовках, добавляются к видимым заголовкам.730731Когда экземпляр [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), происходят следующие преобразования:732733| Результирующее состояние | Состояние [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) |734| --- | --- |735| метка «unseen» | нет флага S |736| метка «удалено» | Флаг T |737| метка «отвечено» | Флаг R |738| Метка «forwarded» | Флаг P |739740Когда экземпляр [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage), заголовки *Status* и *X-Status* опускаются и происходят следующие преобразования:741742| Результирующее состояние | [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) или [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) состояние |743| --- | --- |744| метка «unseen» | нет флага R |745| метка «удалено» | Флаг D |746| метка «отвечено» | Флаг A |747748Когда экземпляр [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage), происходят следующие преобразования:749750| Результирующее состояние | Состояние [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) |751| --- | --- |752| метка «unseen» | последовательность «unseen» |753| метка «отвечено» | последовательность «replied» |754755### 18.4.2.5. [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage)756757#### `class mailbox.MMDFMessage([message])`758759Сообщение с поведением, специфичным для MMDF. Параметр *message* имеет то же значение, что и в конструкторе [`Message`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Message).760761Как и сообщения в почтовом ящике mbox, сообщения MMDF хранятся с адресом отправителя и датой доставки в начальной строке, начинающейся с «From ». Аналогично, флаги, указывающие на состояние сообщения, обычно хранятся в заголовках *Status* и *X-Status*.762763Стандартные флаги для сообщений MMDF совпадают с флагами сообщений mbox и перечислены ниже:764765| Флаг | Значение | Пояснение |766| --- | --- | --- |767| R | Прочитано | Прочитано |768| O | Старое | Ранее обнаружено почтовым клиентом |769| D | Удалено | Помечено для последующего удаления |770| F | Помечено | Помечено как важное |771| A | Отвечено | Получен ответ |772773Флаги «R» и «O» хранятся в заголовке *Status*, а флаги «D», «F» и «A» – в заголовке *X-Status*. Флаги и заголовки обычно располагаются в указанном порядке.774775Экземпляры [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) предоставляют следующие методы, идентичные методам, предоставляемым [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage):776777#### `get_from()`778779Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.780781#### `set_from(from_, time_=None)`782783Устанавливает строку «From » равной *from\_*, которая должна быть указана без начальной «From » или конечного символа новой строки. Для удобства можно указать *time\_*, и она будет правильно отформатирована и добавлена к *from\_*. Если *time\_* указан, это должен быть экземпляр [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time), кортеж, подходящий для передачи в [`time.strftime()`](https://python-all.ru/2.7/library/time.html#time.strftime), или `True` (для использования [`time.gmtime()`](https://python-all.ru/2.7/library/time.html#time.gmtime)).784785#### `get_flags()`786787Возвращает строку, указывающую установленные флаги. Если сообщение соответствует стандартному формату, результатом является конкатенация в следующем порядке нуля или одного вхождения каждого из `'R'`, `'O'`, `'D'`, `'F'` и `'A'`.788789#### `set_flags(flags)`790791Устанавливает флаги, указанные в *flags*, и снимает все остальные. Параметр *flags* должен быть конкатенацией в произвольном порядке нуля или более вхождений каждого из `'R'`, `'O'`, `'D'`, `'F'` и `'A'`.792793#### `add_flag(flag)`794795Устанавливает флаг(и), указанные в *flag*, не изменяя другие флаги. Чтобы добавить более одного флага за раз, *flag* может быть строкой из более чем одного символа.796797#### `remove_flag(flag)`798799Снимает флаг(и), указанные в *flag*, не изменяя другие флаги. Чтобы снять несколько флагов одновременно, *flag* может быть строкой из более чем одного символа.800801Когда экземпляр [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) создается на основе экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), строка «From » генерируется на основе даты доставки экземпляра [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage), и происходят следующие преобразования:802803| Результирующее состояние | Состояние [`MaildirMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MaildirMessage) |804| --- | --- |805| Флаг R | Флаг S |806| Флаг O | Подкаталог «cur» |807| Флаг D | Флаг T |808| Флаг F | Флаг F |809| Флаг A | Флаг R |810811Когда экземпляр [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage), происходят следующие преобразования:812813| Результирующее состояние | Состояние [`MHMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MHMessage) |814| --- | --- |815| Флаг R и флаг O | нет последовательности «unseen» |816| Флаг O | последовательность «unseen» |817| Флаг F | последовательность «flagged» |818| Флаг A | последовательность «replied» |819820Когда экземпляр [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) создаётся на основе экземпляра [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage), происходят следующие преобразования:821822| Результирующее состояние | Состояние [`BabylMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMessage) |823| --- | --- |824| Флаг R и флаг O | нет метки «unseen» |825| Флаг O | метка «unseen» |826| Флаг D | метка «удалено» |827| Флаг A | метка «отвечено» |828829Когда экземпляр [`MMDFMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MMDFMessage) создается на основе экземпляра [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage), строка «From » копируется, и все флаги напрямую соответствуют:830831| Результирующее состояние | Состояние [`mboxMessage`](https://python-all.ru/2.7/library/mailbox.html#mailbox.mboxMessage) |832| --- | --- |833| Флаг R | Флаг R |834| Флаг O | Флаг O |835| Флаг D | Флаг D |836| Флаг F | Флаг F |837| Флаг A | Флаг A |838839## 18.4.3. Исключения840841В модуле [`mailbox`](https://python-all.ru/2.7/library/mailbox.html#module-mailbox) определены следующие классы исключений:842843#### `exception mailbox.Error`844845Базовый класс для всех остальных исключений, специфичных для модуля.846847#### `exception mailbox.NoSuchMailboxError`848849Вызывается, когда ожидается почтовый ящик, но он не найден, например, при создании экземпляра подкласса [`Mailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Mailbox) с несуществующим путём (и с параметром *create*, установленным в `False`) или при открытии несуществующей папки.850851#### `exception mailbox.NotEmptyError`852853Вызывается, когда почтовый ящик не пуст, но ожидается пустым, например, при удалении папки, содержащей сообщения.854855#### `exception mailbox.ExternalClashError`856857Возникает, когда не зависящее от программы условие, связанное с почтовым ящиком, не позволяет продолжить работу, например, когда не удаётся получить блокировку, которая уже удерживается другой программой, или когда сгенерированное уникальное имя файла уже существует.858859#### `exception mailbox.FormatError`860861Вызывается, когда данные в файле не могут быть разобраны, например, когда экземпляр [`MH`](https://python-all.ru/2.7/library/mailbox.html#mailbox.MH) пытается прочитать повреждённый файл `.mh_sequences`.862863## 18.4.4. Устаревшие классы и методы864865Устарело с версии 2.6.866867Старые версии модуля [`mailbox`](https://python-all.ru/2.7/library/mailbox.html#module-mailbox) не поддерживают изменение почтовых ящиков, например добавление или удаление сообщений, и не предоставляют классы для представления свойств сообщений, специфичных для формата. Для обратной совместимости, старые классы почтовых ящиков по-прежнему доступны, но новые классы следует использовать вместо них. Старые классы были удалены в Python 3.868869Старые объекты почтовых ящиков поддерживают только итерацию и предоставляют один открытый метод:870871#### `oldmailbox.next()`872873Возвращает следующее сообщение в почтовом ящике, созданное с помощью необязательного аргумента *factory* переданного в конструктор объекта почтового ящика. По умолчанию это объект [`rfc822.Message`](https://python-all.ru/2.7/library/rfc822.html#rfc822.Message) (см. модуль [`rfc822`](https://python-all.ru/2.7/library/rfc822.html#module-rfc822)). В зависимости от реализации почтового ящика атрибут *fp* этого объекта может быть настоящим файловым объектом или экземпляром класса, имитирующим файловый объект, обрабатывающим такие вещи, как границы сообщений, если несколько почтовых сообщений содержатся в одном файле, и т.д. Если больше нет сообщений, этот метод возвращает `None`.874875У большинства старых классов почтовых ящиков имена отличаются от текущих имен классов почтовых ящиков, за исключением [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir). По этой причине новый класс [`Maildir`](https://python-all.ru/2.7/library/mailbox.html#mailbox.Maildir) определяет метод `next()`, и его конструктор отличается незначительно от конструкторов других новых классов почтовых ящиков.876877Старые классы почтовых ящиков, чьи имена не совпадают с именами их новых аналогов, перечислены ниже:878879#### `class mailbox.UnixMailbox(fp[, factory])`880881Доступ к классическому почтовому ящику в стиле Unix, где все сообщения содержатся в одном файле и разделяются строками `From` (также известными как `From_`). Файловый объект *fp* указывает на файл почтового ящика. Необязательный параметр *factory* является вызываемым объектом, который должен создавать новые объекты сообщений. *factory* вызывается с одним аргументом, *fp* методом `next()` объекта почтового ящика. По умолчанию используется класс [`rfc822.Message`](https://python-all.ru/2.7/library/rfc822.html#rfc822.Message) (см. модуль [`rfc822`](https://python-all.ru/2.7/library/rfc822.html#module-rfc822) – и примечание ниже).882883> **Примечание**884>885> По причинам внутренней реализации этого модуля, возможно, потребуется открыть объект *fp* в двоичном режиме. Это особенно важно в Windows.886887Для максимальной переносимости сообщения в почтовом ящике в стиле Unix разделяются любой строкой, которая начинается точно со строки `'From '` (обратите внимание на завершающий пробел) если перед ней стоят ровно два символа новой строки. Из-за большого разнообразия на практике, ничто другое в строке `From_` не должно учитываться. Однако текущая реализация не проверяет наличие двух начальных символов новой строки. Это обычно приемлемо для большинства приложений.888889Класс [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox) реализует более строгую версию проверки строк `From_`, используя регулярное выражение, которое обычно правильно сопоставляет разделители `From_`. Он считает, что строка-разделитель отделяется строками `From name time`. Для максимальной переносимости используйте класс [`PortableUnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.PortableUnixMailbox) вместо него. Этот класс идентичен [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox) за исключением того, что отдельные сообщения разделяются только `From`.890891#### `class mailbox.PortableUnixMailbox(fp[, factory])`892893Менее строгая версия [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox), которая учитывает только `From` в начале строки, разделяющей сообщения. Часть “*name* *time*” строки From игнорируется, чтобы защититься от некоторых вариаций, которые наблюдаются на практике. Это работает, поскольку строки в сообщении, которые начинаются с `'From '`, заключаются в кавычки почтовым программным обеспечением во время доставки.894895#### `class mailbox.MmdfMailbox(fp[, factory])`896897Обеспечивает доступ к почтовому ящику в стиле MMDF, где все сообщения содержатся в одном файле и разделяются строками, состоящими из 4 символов Control-A. Файловый объект *fp* указывает на файл почтового ящика. Необязательный параметр *factory* ведёт себя так же, как в классе [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox).898899#### `class mailbox.MHMailbox(dirname[, factory])`900901Обеспечивает доступ к почтовому ящику MH – каталогу, где каждое сообщение находится в отдельном файле с числовым именем. Имя каталога почтового ящика передаётся в *dirname*. *factory* ведёт себя так же, как в классе [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox).902903#### `class mailbox.BabylMailbox(fp[, factory])`904905Обращение к почтовому ящику Babyl, который похож на почтовый ящик MMDF. В формате Babyl каждое сообщение имеет два набора заголовков: *исходные* заголовки и *видимые* заголовки. Исходные заголовки находятся перед строкой, содержащей только `'*** EOOH ***'` (End-Of-Original-Headers), а видимые заголовки находятся после строки `EOOH`. Почтовые клиенты, совместимые с Babyl, показывают только видимые заголовки, и объекты [`BabylMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.BabylMailbox) возвращают сообщения, содержащие только видимые заголовки. Для доступа к исходным заголовкам придется самостоятельно разбирать файл почтового ящика. Почтовые сообщения начинаются со строки EOOH и заканчиваются строкой, содержащей только `'\037\014'`. *Фабрика* такая же, как и для класса [`UnixMailbox`](https://python-all.ru/2.7/library/mailbox.html#mailbox.UnixMailbox).906907Для использования старых классов почтовых ящиков с модулем [`email`](https://python-all.ru/2.7/library/email.html#module-email) вместо устаревшего модуля [`rfc822`](https://python-all.ru/2.7/library/rfc822.html#module-rfc822) можно поступить следующим образом:908909```python910import email911import email.Errors912import mailbox913914def msgfactory(fp):915 try:916 return email.message_from_file(fp)917 except email.Errors.MessageParseError:918 # Не возвращайте None, так как это919 # остановит итератор почтового ящика920 return ''921922mbox = mailbox.UnixMailbox(fp, msgfactory)923```924925Кроме того, если известно, что почтовый ящик содержит только корректно сформированные MIME-сообщения, можно упростить это до:926927```python928import email929import mailbox930931mbox = mailbox.UnixMailbox(fp, email.message_from_file)932```933934## 18.4.5. Примеры935936Простой пример вывода тем всех сообщений в почтовом ящике, которые кажутся интересными:937938```python939import mailbox940for message in mailbox.mbox('~/mbox'):941 subject = message['subject'] # Может быть None.942 if subject and 'python' in subject.lower():943 print subject944```945946Чтобы скопировать все письма из почтового ящика Babyl в почтовый ящик MH, преобразуя всю форматно-специфичную информацию, которую можно преобразовать:947948```python949import mailbox950destination = mailbox.MH('~/Mail')951destination.lock()952for message in mailbox.Babyl('~/RMAIL'):953 destination.add(mailbox.MHMessage(message))954destination.flush()955destination.unlock()956```957958Этот пример сортирует письма из нескольких списков рассылки по разным почтовым ящикам, стараясь избежать повреждения писем из-за одновременного изменения другими программами, потери писем из-за прерывания программы или преждевременного завершения из-за повреждённых сообщений в почтовом ящике:959960```python961import mailbox962import email.errors963964list_names = ('python-list', 'python-dev', 'python-bugs')965966boxes = dict((name, mailbox.mbox('~/email/%s' % name)) for name in list_names)967inbox = mailbox.Maildir('~/Maildir', factory=None)968969for key in inbox.iterkeys():970 try:971 message = inbox[key]972 except email.errors.MessageParseError:973 continue # Сообщение повреждено. Просто оставьте его.974975 for name in list_names:976 list_id = message['list-id']977 if list_id and name in list_id:978 # Получить почтовый ящик для использования.979 box = boxes[name]980981 # Записать копию на диск перед удалением оригинала.982 # Если произошёл сбой, возможно дублирование сообщения, но983 # это лучше, чем полная потеря сообщения.984 box.lock()985 box.add(message)986 box.flush()987 box.unlock()988989 # Удалить исходное сообщение990 inbox.lock()991 inbox.discard(key)992 inbox.flush()993 inbox.unlock()994 break # Целевой получатель найден, поиск прекращён.995996for box in boxes.itervalues():997 box.close()998```999