Содержание страницы
18.4. mailbox – Управление почтовыми ящиками в различных форматах¶mailbox – Manipulate mailboxes in various formats
Этот модуль определяет два класса, Mailbox и Message, для доступа к почтовым ящикам на диске и управления ими, а также для работы с содержащимися в них сообщениями.
Mailbox предоставляет отображение, похожее на словарь, где ключи сопоставляются с сообщениями.
Message расширяет класс Message из модуля email.message, добавляя формат-специфичное состояние и поведение.
Поддерживаемые форматы почтовых ящиков: Maildir, mbox, MH, Babyl и MMDF.
См. также
- Модуль
email Представление сообщений и управление ими.
18.4.1. Mailbox объекты¶Mailbox objects
-
class
mailbox.Mailbox¶ Почтовый ящик, который можно просматривать и изменять.
Класс
Mailboxопределяет интерфейс и не предназначен для создания экземпляров. Вместо этого следует наследовать формат-специфичные подклассы отMailbox, а код должен создавать экземпляры конкретного подкласса.Интерфейс
Mailboxнапоминает словарь: небольшие ключи соответствуют сообщениям. Ключи выдаются экземпляромMailbox, с которым они будут использоваться, и имеют смысл только для этого экземпляраMailbox. Ключ продолжает идентифицировать сообщение, даже если соответствующее сообщение изменяется, например, заменяется другим сообщением.Сообщения можно добавлять в экземпляр
Mailboxс помощью методаadd()(подобного set) и удалять с помощью инструкцииdelили методовremove()иdiscard()(также подобных set).Семантика интерфейса
Mailboxотличается от семантики словаря в некоторых важных аспектах. При каждом запросе сообщения на основе текущего состояния почтового ящика создаётся новое представление (обычно экземплярMessage). Аналогично, при добавлении сообщения в экземплярMailboxсодержимое переданного представления сообщения копируется. Ни в одном из случаев экземплярMailboxне сохраняет ссылку на представление сообщения.Итератор по умолчанию
Mailboxперебирает представления сообщений, а не ключи, как это делает итератор словаря по умолчанию. Кроме того, изменение почтового ящика во время итерации безопасно и хорошо определено. Сообщения, добавленные в почтовый ящик после создания итератора, не будут видны итератору. Сообщения, удалённые из почтового ящика до того, как итератор их вернёт, будут молча пропущены, хотя использование ключа из итератора может привести к исключениюKeyError, если соответствующее сообщение будет впоследствии удалено.Предупреждение
Будьте предельно осторожны при изменении почтовых ящиков, которые могут одновременно изменяться другим процессом. Самый безопасный формат почтового ящика для таких задач – Maildir; старайтесь избегать использования однофайловых форматов, таких как mbox, для одновременной записи. Если вы изменяете почтовый ящик, вы должны заблокировать его, вызвав методы
lock()иunlock()перед чтением любых сообщений в файле или внесением каких-либо изменений путём добавления или удаления сообщения. Несоблюдение блокировки почтового ящика чревато потерей сообщений или повреждением всего почтового ящика.Экземпляры
Mailboxимеют следующие методы:-
add(message)¶ Добавляет сообщение в почтовый ящик и возвращает ключ, который был ему присвоен.
Параметр message может быть экземпляром
Message, экземпляромemail.message.Message, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если message является экземпляром соответствующего формат-специфичного подклассаMessage(например, если это экземплярmboxMessage, а это – экземплярmbox), то используется его формат-специфичная информация. В противном случае используются разумные значения по умолчанию для формат-специфичной информации.
-
remove(key)¶ -
__delitem__(key)¶ -
discard(key)¶ Удаляет сообщение, соответствующее ключу, из почтового ящика.
Если такого сообщения не существует, возникает исключение
KeyError, если метод был вызван какremove()или__delitem__(), но исключение не возникает, если метод был вызван какdiscard(). Поведениеdiscard()может быть предпочтительнее, если базовый формат почтового ящика поддерживает одновременное изменение другими процессами.
-
__setitem__(key, message)¶ Заменяет сообщение, соответствующее ключу, на сообщение. Возникает исключение
KeyError, если ключу ещё не соответствует ни одно сообщение.Как и в случае с
add(), параметр message может быть экземпляромMessage, экземпляромemail.message.Message, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме). Если message является экземпляром соответствующего формат-специфичного подклассаMessage(например, если это экземплярmboxMessage, а это – экземплярmbox), то используется его формат-специфичная информация. В противном случае формат-специфичная информация сообщения, которое в данный момент соответствует key, остаётся неизменной.
-
iterkeys()¶ -
keys()¶ Возвращает итератор по всем ключам, если вызван как
iterkeys(), или возвращает список ключей, если вызван какkeys().
-
itervalues()¶ -
__iter__()¶ -
values()¶ Возвращает итератор по представлениям всех сообщений, если вызван как
itervalues()или__iter__(), или возвращает список таких представлений, если вызван какvalues(). Сообщения представлены в виде экземпляров соответствующего подклассаMessage, зависящего от формата, если только при инициализации экземпляраMailboxне была указана пользовательская фабрика сообщений.Примечание
Поведение
__iter__()отличается от поведения словарей, которые перебирают ключи.
-
iteritems()¶ -
items()¶ Возвращает итератор по парам (key, message), где key – ключ, а message – представление сообщения, если вызван как
iteritems(), или возвращает список таких пар, если вызван какitems(). Сообщения представлены в виде экземпляров соответствующего подклассаMessage, зависящего от формата, если только при инициализации экземпляраMailboxне была указана пользовательская фабрика сообщений.
-
get(key, default=None)¶ -
__getitem__(key)¶ Возвращает представление сообщения, соответствующего ключу. Если такого сообщения нет, default возвращается, если метод был вызван как
get(), и вызывается исключениеKeyError, если метод был вызван как__getitem__(). Сообщение представляется в виде экземпляра соответствующего подклассаMessage, если только при инициализации экземпляраMailboxне была указана пользовательская фабрика сообщений.
-
get_message(key)¶ Возвращает представление сообщения, соответствующего ключу, в виде экземпляра соответствующего подкласса
Message, или вызывает исключениеKeyError, если такого сообщения нет.
-
get_string(key)¶ Возвращает строковое представление сообщения, соответствующего key, или возбуждает исключение
KeyError, если такого сообщения не существует.
-
get_file(key)¶ Возвращает файлоподобное представление сообщения, соответствующего key, или возбуждает исключение
KeyError, если такого сообщения не существует. Файлоподобный объект ведёт себя так, как если бы он был открыт в двоичном режиме. Этот файл следует закрыть, когда он больше не нужен.Примечание
В отличие от других представлений сообщений, файлоподобные представления не обязательно независимы от экземпляра
Mailbox, который их создал, или от нижележащего почтового ящика. Более подробная документация предоставляется каждым подклассом.
-
has_key(key)¶ -
__contains__(key)¶ Возвращает
True, если ключ соответствует сообщению, иFalseв противном случае.
-
__len__()¶ Возвращает количество сообщений в почтовом ящике.
-
clear()¶ Удаляет все сообщения из почтового ящика.
-
pop(key[, default])¶ Возвращает представление сообщения, соответствующего key, и удаляет сообщение. Если такого сообщения не существует, возвращает default, если он был указан, иначе возбуждает исключение
KeyError. Сообщение представляется в виде экземпляра соответствующего формат-специфичного подклассаMessage, если только не была указана пользовательская фабрика сообщений при инициализации экземпляраMailbox.
-
popitem()¶ Возвращает произвольную пару (ключ, сообщение), где ключ – это ключ, а сообщение – представление сообщения, и удаляет соответствующее сообщение. Если почтовый ящик пуст, вызывает исключение
KeyError. Сообщение представляется в виде экземпляра соответствующего подклассаMessage, если только при инициализации экземпляраMailboxне была указана пользовательская фабрика сообщений.
-
update(arg)¶ Параметр arg должен быть отображением ключ → сообщение или итерируемым объектом из пар (ключ, сообщение). Обновляет почтовый ящик так, что для каждой заданной пары ключ и сообщение сообщение, соответствующее ключу, устанавливается в сообщение как если бы с помощью
__setitem__(). Как и в случае с__setitem__(), каждый ключ уже должен соответствовать сообщению в почтовом ящике, иначе будет вызвано исключениеKeyError, поэтому в общем случае неправильно, чтобы arg был экземпляромMailbox.Примечание
В отличие от словарей, именованные аргументы не поддерживаются.
-
flush()¶ Записывает все ожидающие изменения в файловую систему. Для некоторых подклассов
Mailboxизменения всегда записываются сразу, иflush()ничего не делает, но всё же стоит выработать привычку вызывать этот метод.
-
lock()¶ Устанавливает исключительную рекомендательную блокировку на почтовый ящик, чтобы другие процессы знали, что его не следует изменять. Если блокировка недоступна, возбуждается исключение
ExternalClashError. Конкретные механизмы блокировки зависят от формата почтового ящика. Перед любыми изменениями содержимого следует всегда блокировать почтовый ящик.
-
unlock()¶ Освобождает блокировку почтового ящика, если она установлена.
-
18.4.1.1. Maildir¶
-
class
mailbox.Maildir(dirname, factory=rfc822.Message, create=True)¶ Подкласс
Mailboxдля почтовых ящиков в формате Maildir. Параметр factory – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если factory равноNone, в качестве представления сообщения по умолчанию используетсяMaildirMessage. Если create равноTrue, почтовый ящик создаётся, если он не существует.По историческим причинам factory по умолчанию равен
rfc822.Message, а dirname назван так, а не path. Для экземпляраMaildir, который ведёт себя как экземпляры других подклассовMailbox, следует установить factory вNone.Maildir – это почтовый формат на основе каталогов, разработанный для агента передачи почты qmail и ныне широко поддерживаемый другими программами. Сообщения в почтовом ящике Maildir хранятся в отдельных файлах в общей структуре каталогов. Такая архитектура позволяет нескольким независимым программам получать доступ и изменять почтовые ящики Maildir без повреждения данных, поэтому файловая блокировка не требуется.
Почтовые ящики Maildir содержат три подкаталога:
tmp,newиcur. Сообщения создаются в подкаталогеtmp, а затем перемещаются в подкаталогnewдля завершения доставки. После этого почтовый клиент может переместить сообщение в подкаталогcurи сохранить информацию о состоянии сообщения в специальном разделе «info», добавляемом к его имени файла.Также поддерживаются папки в стиле, введённом агентом передачи почты Courier. Любой подкаталог основного почтового ящика считается папкой, если первым символом в его имени является
'.'. Имена папок представляются какMaildirбез ведущего'.'. Каждая папка сама является почтовым ящиком Maildir, но не должна содержать другие папки. Вместо этого логическая вложенность указывается с помощью'.'для разделения уровней, например, «Archived.2005.07».Примечание
Спецификация Maildir требует использования двоеточия (
':') в некоторых именах файлов сообщений. Однако некоторые операционные системы не допускают этот символ в именах файлов. Если вы хотите использовать формат, подобный Maildir, в такой операционной системе, следует указать другой символ для замены. Восклицательный знак ('!') – популярный выбор. Например:import mailbox mailbox.Maildir.colon = '!'
Атрибут
colonтакже может быть установлен для каждого экземпляра отдельно.Экземпляры
Maildirимеют все методыMailbox, а также следующие:-
list_folders()¶ Возвращает список имён всех папок.
-
get_folder(folder)¶ Возвращает экземпляр
Maildir, представляющий папку с именем folder. Если папка не существует, возбуждается исключениеNoSuchMailboxError.
-
add_folder(folder)¶ Создаёт папку с именем folder и возвращает экземпляр
Maildir, представляющий её.
-
remove_folder(folder)¶ Удаляет папку с именем folder. Если папка содержит сообщения, будет возбуждено исключение
NotEmptyError, и папка не будет удалена.
-
clean()¶ Удаляет временные файлы из почтового ящика, к которым не было обращений за последние 36 часов. Спецификация Maildir утверждает, что программы чтения почты должны делать это время от времени.
Некоторые методы
Mailbox, реализованные вMaildir, заслуживают особых замечаний:-
add(message)¶ -
__setitem__(key, message)¶ -
update(arg)¶ Предупреждение
Эти методы генерируют уникальные имена файлов на основе идентификатора текущего процесса. При использовании нескольких потоков возможны незамеченные конфликты имен, которые могут привести к повреждению почтового ящика, если потоки не скоординированы, чтобы избежать одновременного использования этих методов для управления одним и тем же почтовым ящиком.
-
flush()¶ Все изменения в почтовых ящиках Maildir применяются немедленно, поэтому этот метод ничего не делает.
-
lock()¶ -
unlock()¶ Почтовые ящики Maildir не поддерживают (и не требуют) блокировку, поэтому эти методы ничего не делают.
-
close()¶ Экземпляры
Maildirне держат открытых файлов, а нижележащие почтовые ящики не поддерживают блокировку, поэтому этот метод ничего не делает.
-
get_file(key)¶ В зависимости от платформы может быть невозможно изменить или удалить нижележащее сообщение, пока возвращенный файл остается открытым.
-
См. также
- Страница руководства maildir из qmail
Оригинальная спецификация формата.
- Использование формата maildir
Заметки о Maildir от его создателя. Включают обновлённую схему создания имён и детали семантики «info».
- man-страница maildir из Courier
Другая спецификация формата. Описывает распространённое расширение для поддержки папок.
18.4.1.2. mbox¶
-
class
mailbox.mbox(path, factory=None, create=True)¶ Подкласс
Mailboxдля почтовых ящиков в формате mbox. Параметр factory – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если factory равенNone, в качестве представления сообщения по умолчанию используетсяmboxMessage. Если create равенTrue, почтовый ящик создаётся, если он не существует.Формат mbox – это классический формат хранения почты в системах Unix. Все сообщения в почтовом ящике mbox хранятся в одном файле, при этом начало каждого сообщения обозначается строкой, первые пять символов которой – «From ».
Существует несколько вариантов формата mbox, призванных устранить недостатки исходного. В целях совместимости
mboxреализует исходный формат, иногда называемый mboxo. Это означает, что заголовок Content-Length, если он присутствует, игнорируется, а все вхождения «From » в начале строки тела сообщения преобразуются в «>From » при сохранении сообщения, хотя вхождения «>From » не преобразуются обратно в «From » при чтении сообщения.Некоторые методы
Mailbox, реализованные вmbox, заслуживают особых замечаний:
См. также
- Страница руководства mbox из qmail
Спецификация формата и его разновидностей.
- Страница man mbox из tin
Другая спецификация формата, с подробностями о блокировке.
- Настройка Netscape Mail в Unix: почему формат Content-Length плох
Аргумент в пользу использования оригинального формата mbox, а не его вариации.
- «mbox» – это семейство нескольких взаимно несовместимых форматов почтовых ящиков
История вариаций mbox.
18.4.1.3. MH¶
-
class
mailbox.MH(path, factory=None, create=True)¶ Подкласс
Mailboxдля почтовых ящиков в формате MH. Параметр factory – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если factory равенNone, в качестве представления сообщения по умолчанию используетсяMHMessage. Если create равенTrue, почтовый ящик создаётся, если он не существует.MH – это формат почтовых ящиков на основе каталогов, разработанный для MH Message Handling System, почтового клиента. Каждое сообщение в почтовом ящике MH находится в собственном файле. Почтовый ящик MH может содержать другие почтовые ящики MH (называемые папками) помимо сообщений. Папки могут быть вложены неограниченно. Почтовые ящики MH также поддерживают последовательности – именованные списки, используемые для логической группировки сообщений без их перемещения в подпапки. Последовательности определяются в файле с именем
.mh_sequencesв каждой папке.Класс
MHуправляет почтовыми ящиками MH, но не пытается эмулировать все поведения mh. В частности, он не изменяет и не зависит от файловcontextи.mh_profile, которые используются программой mh для хранения своего состояния и конфигурации.Экземпляры
MHимеют все методыMailbox, а также следующие:-
list_folders()¶ Возвращает список имён всех папок.
-
get_folder(folder)¶ Возвращает экземпляр
MH, представляющий папку с именем folder. ИсключениеNoSuchMailboxErrorвозникает, если папка не существует.
-
remove_folder(folder)¶ Удаляет папку с именем folder. Если папка содержит сообщения, будет возбуждено исключение
NotEmptyError, и папка не будет удалена.
-
get_sequences()¶ Возвращает словарь, где имена последовательностей сопоставлены со списками ключей. Если последовательностей нет, возвращается пустой словарь.
-
set_sequences(sequences)¶ Переопределяет последовательности, существующие в почтовом ящике, на основе sequences, словаря, где имена сопоставлены со списками ключей, аналогично возвращаемому
get_sequences().
-
pack()¶ Переименовывает сообщения в почтовом ящике по мере необходимости для устранения пропусков в нумерации. Записи в списке последовательностей обновляются соответствующим образом.
Примечание
Ранее выданные ключи становятся недействительными в результате этой операции и не должны использоваться в дальнейшем.
Некоторые методы
Mailbox, реализованные вMH, заслуживают особых замечаний:-
remove(key)¶ -
__delitem__(key)¶ -
discard(key)¶ Эти методы немедленно удаляют сообщение. Соглашение MH помечать сообщение на удаление добавлением запятой к его имени не используется.
-
lock()¶ -
unlock()¶ Используются три механизма блокировки: точечная блокировка и, если доступны, системные вызовы
flock()иlockf(). Для почтовых ящиков MH блокировка почтового ящика означает блокировку файла.mh_sequencesи, только на время любых операций, затрагивающих их, блокировку отдельных файлов сообщений.
-
get_file(key)¶ В зависимости от платформы может быть невозможно удалить базовое сообщение, пока возвращённый файл остаётся открытым.
-
flush()¶ Все изменения в почтовых ящиках MH применяются немедленно, поэтому этот метод ничего не делает.
-
См. также
- nmh – система обработки сообщений
Домашняя страница nmh, обновлённой версии исходного mh.
- MH и nmh: электронная почта для пользователей и программистов
Книга, лицензированная под GPL, о mh и nmh, с некоторой информацией о формате почтового ящика.
18.4.1.4. Babyl¶
-
class
mailbox.Babyl(path, factory=None, create=True)¶ Подкласс
Mailboxдля почтовых ящиков в формате Babyl. Параметр factory – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя как открытое в бинарном режиме) и возвращает пользовательское представление. Если factory равноNone, в качестве представления сообщения по умолчанию используетсяBabylMessage. Если create равноTrue, почтовый ящик создаётся, если он не существует.Babyl – это однофайловый формат почтового ящика, используемый почтовым клиентом Rmail, входящим в состав Emacs. Начало сообщения обозначается строкой, содержащей два символа: Control-Подчёркивание (
'\037') и Control-L ('\014'). Конец сообщения обозначается началом следующего сообщения или, в случае последнего сообщения, строкой, содержащей символ Control-Подчёркивание ('\037').Сообщения в почтовом ящике Babyl имеют два набора заголовков: исходные заголовки и так называемые видимые заголовки. Видимые заголовки обычно являются подмножеством исходных заголовков, которые были переформатированы или сокращены для большей привлекательности. Каждое сообщение в почтовом ящике Babyl также имеет сопутствующий список меток (коротких строк, которые записывают дополнительную информацию о сообщении), а список всех определённых пользователем меток, найденных в почтовом ящике, хранится в разделе параметров Babyl.
Экземпляры
Babylимеют все методыMailbox, а также следующие:-
get_labels()¶ Возвращает список имён всех определённых пользователем меток, используемых в почтовом ящике.
Примечание
Фактические сообщения проверяются для определения того, какие метки существуют в почтовом ящике, вместо обращения к списку меток в разделе параметров Babyl, но раздел Babyl обновляется при каждом изменении почтового ящика.
Некоторые методы
Mailbox, реализованные вBabyl, заслуживают особых замечаний:-
get_file(key)¶ В почтовых ящиках Babyl заголовки сообщения не хранятся непосредственно вместе с телом сообщения. Чтобы создать файлоподобное представление, заголовки и тело копируются вместе в экземпляр
StringIO(из модуляStringIO), API которого идентичен файловому. В результате файлоподобный объект полностью независим от нижележащего почтового ящика, но не экономит память по сравнению со строковым представлением.
-
См. также
- Формат файлов Babyl версии 5
Спецификация формата Babyl.
- Чтение почты с помощью Rmail
Руководство по Rmail, содержащее некоторую информацию о семантике Babyl.
18.4.1.5. MMDF¶
-
class
mailbox.MMDF(path, factory=None, create=True)¶ Подкласс
Mailboxдля почтовых ящиков в формате MMDF. Параметр factory – это вызываемый объект, который принимает файлоподобное представление сообщения (ведущее себя так, как если бы оно было открыто в двоичном режиме) и возвращает пользовательское представление. Если factory равноNone, в качестве представления сообщения по умолчанию используетсяMMDFMessage. Если create равноTrue, почтовый ящик создаётся, если он не существует.MMDF – это однофайловый формат почтового ящика, разработанный для Multichannel Memorandum Distribution Facility – агента пересылки почты. Каждое сообщение имеет ту же форму, что и сообщение mbox, но обрамляется строками, содержащими четыре символа Control-A (
'\001'). Как и в формате mbox, начало каждого сообщения обозначается строкой, первые пять символов которой – «From », но дополнительные вхождения «From » не преобразуются в «>From » при сохранении сообщений, так как дополнительные строки-разделители сообщений предотвращают ошибочный прием таких вхождений за начала последующих сообщений.Некоторые методы
Mailbox, реализованные вMMDF, заслуживают особых замечаний:
См. также
- страница руководства mmdf из tin
Спецификация формата MMDF из документации tin, программы для чтения новостей.
- MMDF
Статья в Википедии, описывающая Multichannel Memorandum Distribution Facility.
18.4.2. Message объекты¶Message objects
-
class
mailbox.Message([message])¶ Подкласс
email.messageмодуляMessage. Подклассыmailbox.Messageдобавляют состояние и поведение, специфичные для формата почтового ящика.Если message опущен, новый экземпляр создаётся в пустом состоянии по умолчанию. Если message является экземпляром
email.message.Message, его содержимое копируется; более того, любая формат-специфичная информация преобразуется, насколько это возможно, если message является экземпляромMessage. Если message является строкой или файлом, он должен содержать сообщение, совместимое с RFC 2822, которое читается и разбирается.Формат-специфичные состояния и поведение, предоставляемые подклассами, различаются, но в целом поддерживаются только те свойства, которые не привязаны к конкретному почтовому ящику (хотя, предположительно, эти свойства специфичны для конкретного формата почтового ящика). Например, смещения в файлах для однофайловых форматов почтовых ящиков и имена файлов для форматов на основе каталогов не сохраняются, так как они применимы только к исходному почтовому ящику. Но такие состояния, как было ли сообщение прочитано пользователем или помечено как важное, сохраняются, поскольку они относятся к самому сообщению.
Нет требования, чтобы экземпляры
Messageиспользовались для представления сообщений, полученных с помощью экземпляровMailbox. В некоторых ситуациях время и память, необходимые для создания представленийMessage, могут оказаться неприемлемыми. Для таких случаев экземплярыMailboxтакже предлагают строковые и файлоподобные представления, а пользовательская фабрика сообщений может быть указана при инициализации экземпляраMailbox.
18.4.2.1. MaildirMessage¶
-
class
mailbox.MaildirMessage([message])¶ Сообщение с поведением, специфичным для Maildir. Параметр message имеет то же значение, что и в конструкторе
Message.Обычно почтовый клиент перемещает все сообщения из подкаталога
newв подкаталогcurпосле того, как пользователь впервые открывает и закрывает почтовый ящик, отмечая, что сообщения старые, независимо от того, были ли они фактически прочитаны. Каждое сообщение вcurимеет раздел «info», добавленный к его имени файла для хранения информации о его состоянии. (Некоторые почтовые программы могут также добавлять раздел «info» к сообщениям вnew.) Раздел «info» может принимать одну из двух форм: он может содержать «2,» с последующим списком стандартизированных флагов (например, «2,FR») или может содержать «1,» с последующей так называемой экспериментальной информацией. Стандартные флаги для сообщений Maildir следующие:Флаг
Значение
Пояснение
D
Черновик
В процессе составления
F
Помечено
Помечено как важное
P
Передан
Переслано, отправлено повторно или возвращено
R
Отвечено
Получен ответ
S
Просмотрено
Прочитано
T
Удалено
Помечено для последующего удаления
Экземпляры
MaildirMessageпредоставляют следующие методы:-
get_subdir()¶ Возвращает «new» (если сообщение должно храниться в подкаталоге
newили «cur» (если сообщение должно храниться в подкаталогеcur).Примечание
Сообщение обычно перемещается из
newвcurпосле того, как к его почтовому ящику был получен доступ, независимо от того, было ли сообщение прочитано. Сообщениеmsgсчитается прочитанным, если"S" in msg.get_flags()равноTrue.
-
set_subdir(subdir)¶ Устанавливает подкаталог, в котором должно храниться сообщение. Параметр subdir должен быть либо «new», либо «cur».
-
get_flags()¶ Возвращает строку, указывающую текущие установленные флаги. Если сообщение соответствует стандартному формату Maildir, результатом является конкатенация в алфавитном порядке нуля или одного вхождения каждого из
'D','F','P','R','S'и'T'. Возвращается пустая строка, если флаги не установлены или если «info» содержит экспериментальную семантику.
-
set_flags(flags)¶ Устанавливает флаги, указанные flags, и сбрасывает все остальные.
-
add_flag(flag)¶ Устанавливает флаг(и), указанные flag, не изменяя остальные флаги. Чтобы добавить более одного флага за раз, flag может быть строкой из более чем одного символа. Текущий «info» перезаписывается, независимо от того, содержит ли он экспериментальную информацию вместо флагов.
-
remove_flag(flag)¶ Сбрасывает флаг(и), указанные в flag, не изменяя другие флаги. Чтобы удалить несколько флагов за раз, flag может быть строкой из более чем одного символа. Если «info» содержит экспериментальную информацию, а не флаги, текущий «info» не изменяется.
-
get_date()¶ Возвращает дату доставки сообщения в виде числа с плавающей запятой, представляющего количество секунд с начала эпохи.
-
set_date(date)¶ Устанавливает дату доставки сообщения в date, число с плавающей запятой, представляющее количество секунд с начала эпохи.
-
get_info()¶ Возвращает строку, содержащую «info» для сообщения. Это полезно для доступа к экспериментальному «info» и его изменения (т.е. не являющегося списком флагов).
-
set_info(info)¶ Устанавливает «info» в info, которое должно быть строкой.
-
Когда экземпляр MaildirMessage создаётся на основе
экземпляра mboxMessage или MMDFMessage, заголовки Status
и X-Status опускаются и происходят следующие
преобразования:
Результирующее состояние |
|
|---|---|
Подкаталог «cur» |
Флаг O |
Флаг F |
Флаг F |
Флаг R |
Флаг A |
Флаг S |
Флаг R |
Флаг T |
Флаг D |
Когда экземпляр MaildirMessage создаётся на основе
экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Подкаталог «cur» |
последовательность «unseen» |
подкаталог «cur» и флаг S |
нет последовательности «unseen» |
Флаг F |
последовательность «flagged» |
Флаг R |
последовательность «replied» |
Когда экземпляр MaildirMessage создаётся на основе
экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Подкаталог «cur» |
метка «unseen» |
подкаталог «cur» и флаг S |
нет метки «unseen» |
Флаг P |
метка «forwarded» или «resent» |
Флаг R |
метка «отвечено» |
Флаг T |
метка «удалено» |
18.4.2.2. mboxMessage¶
-
class
mailbox.mboxMessage([message])¶ Сообщение с поведением, специфичным для mbox. Параметр message имеет тот же смысл, что и в конструкторе
Message.Сообщения в почтовом ящике mbox хранятся вместе в одном файле. Адрес отправителя (envelope address) и время доставки обычно хранятся в строке, начинающейся с «From », которая используется для обозначения начала сообщения, хотя точный формат этих данных сильно различается в разных реализациях mbox. Флаги, указывающие на состояние сообщения, такие как прочитано или помечено как важное, обычно хранятся в заголовках Status и X-Status.
Обычные флаги для сообщений mbox:
Флаг
Значение
Пояснение
R
Прочитано
Прочитано
O
Старое
Ранее обнаружено почтовым клиентом
D
Удалено
Помечено для последующего удаления
F
Помечено
Помечено как важное
A
Отвечено
Получен ответ
Флаги «R» и «O» хранятся в заголовке Status, а флаги «D», «F» и «A» – в заголовке X-Status. Флаги и заголовки обычно располагаются в указанном порядке.
Экземпляры
mboxMessageпредоставляют следующие методы:-
get_from()¶ Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.
-
set_from(from_, time_=None)¶ Устанавливает строку «From » равной from_, которая должна быть указана без начальной «From » или конечного символа новой строки. Для удобства можно указать time_, и она будет правильно отформатирована и добавлена к from_. Если time_ указан, это должен быть экземпляр
time.struct_time, кортеж, подходящий для передачи вtime.strftime(), илиTrue(для использованияtime.gmtime()).
-
get_flags()¶ Возвращает строку, указывающую установленные флаги. Если сообщение соответствует стандартному формату, результатом является конкатенация в следующем порядке нуля или одного вхождения каждого из
'R','O','D','F'и'A'.
-
set_flags(flags)¶ Устанавливает флаги, указанные в flags, и снимает все остальные. Параметр flags должен быть конкатенацией в произвольном порядке нуля или более вхождений каждого из
'R','O','D','F'и'A'.
-
add_flag(flag)¶ Устанавливает флаг(и), указанные в flag, не изменяя другие флаги. Чтобы добавить более одного флага за раз, flag может быть строкой из более чем одного символа.
-
remove_flag(flag)¶ Снимает флаг(и), указанные в flag, не изменяя другие флаги. Чтобы снять несколько флагов одновременно, flag может быть строкой из более чем одного символа.
-
Когда экземпляр mboxMessage создается на основе экземпляра MaildirMessage, строка «From » генерируется на основе даты доставки экземпляра MaildirMessage, и происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R |
Флаг S |
Флаг O |
Подкаталог «cur» |
Флаг D |
Флаг T |
Флаг F |
Флаг F |
Флаг A |
Флаг R |
Когда экземпляр mboxMessage создаётся на основе экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R и флаг O |
нет последовательности «unseen» |
Флаг O |
последовательность «unseen» |
Флаг F |
последовательность «flagged» |
Флаг A |
последовательность «replied» |
Когда экземпляр mboxMessage создаётся на основе экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R и флаг O |
нет метки «unseen» |
Флаг O |
метка «unseen» |
Флаг D |
метка «удалено» |
Флаг A |
метка «отвечено» |
Когда экземпляр Message создается на основе экземпляра MMDFMessage, строка «From » копируется, и все флаги напрямую соответствуют:
Результирующее состояние |
Состояние |
|---|---|
Флаг R |
Флаг R |
Флаг O |
Флаг O |
Флаг D |
Флаг D |
Флаг F |
Флаг F |
Флаг A |
Флаг A |
18.4.2.3. MHMessage¶
-
class
mailbox.MHMessage([message])¶ Сообщение с поведением, характерным для MH. Параметр message имеет то же значение, что и в конструкторе
Message.Сообщения MH не поддерживают метки и флаги в традиционном понимании, но поддерживают последовательности – логические группировки произвольных сообщений. Некоторые почтовые программы (хотя не стандартные mh и nmh) используют последовательности примерно так же, как флаги используются в других форматах:
Последовательность
Пояснение
непрочитанное
Не прочитано, но ранее обнаружено почтовым клиентом (MUA)
отвечено
Получен ответ
помечено
Помечено как важное
Экземпляры
MHMessageпредоставляют следующие методы:-
get_sequences()¶ Возвращает список имен последовательностей, которые включают это сообщение.
-
set_sequences(sequences)¶ Устанавливает список последовательностей, которые включают это сообщение.
-
add_sequence(sequence)¶ Добавляет sequence в список последовательностей, которые включают это сообщение.
-
remove_sequence(sequence)¶ Удаляет sequence из списка последовательностей, которые включают это сообщение.
-
Когда экземпляр MHMessage создаётся на основе экземпляра MaildirMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
последовательность «unseen» |
нет флага S |
последовательность «replied» |
Флаг R |
последовательность «flagged» |
Флаг F |
Когда экземпляр MHMessage создается на основе экземпляра
mboxMessage или MMDFMessage, заголовки Status
и X-Status опускаются и происходят следующие преобразования:
Результирующее состояние |
|
|---|---|
последовательность «unseen» |
нет флага R |
последовательность «replied» |
Флаг A |
последовательность «flagged» |
Флаг F |
Когда экземпляр MHMessage создаётся на основе экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
последовательность «unseen» |
метка «unseen» |
последовательность «replied» |
метка «отвечено» |
18.4.2.4. BabylMessage¶
-
class
mailbox.BabylMessage([message])¶ Сообщение с поведением, специфичным для Babyl. Параметр message имеет то же значение, что и в конструкторе
Message.Некоторые метки сообщений, называемые attributes, по соглашению имеют специальное значение. Атрибуты следующие:
Метка
Пояснение
непрочитанное
Не прочитано, но ранее обнаружено почтовым клиентом (MUA)
удалено
Помечено для последующего удаления
архивировано
Скопировано в другой файл или почтовый ящик
отвечено
Получен ответ
переслано
Переслано
изменено
Изменено пользователем
переотправлено
Отправлено повторно
По умолчанию Rmail отображает только видимые заголовки. Однако класс
BabylMessageиспользует исходные заголовки, поскольку они более полны. При желании к видимым заголовкам можно обратиться явно.Экземпляры
BabylMessageпредоставляют следующие методы:-
get_labels()¶ Возвращает список меток сообщения.
-
set_labels(labels)¶ Устанавливает список меток сообщения равным labels.
-
add_label(label)¶ Добавляет метку label в список меток сообщения.
-
remove_label(label)¶ Удаляет метку label из списка меток сообщения.
-
set_visible(visible)¶ Устанавливает видимые заголовки сообщения такими же, как заголовки из message. Параметр visible должен быть экземпляром
Message, экземпляромemail.message.Message, строкой или файлоподобным объектом (который должен быть открыт в текстовом режиме).
-
update_visible()¶ Когда исходные заголовки экземпляра
BabylMessageизменяются, видимые заголовки автоматически не изменяются для соответствия. Этот метод обновляет видимые заголовки следующим образом: каждый видимый заголовок с соответствующим исходным заголовком устанавливается в значение исходного заголовка, каждый видимый заголовок без соответствующего исходного заголовка удаляется, а любые из Date, From, Reply-To, To, CC и Subject, которые присутствуют в исходных заголовках, но отсутствуют в видимых заголовках, добавляются к видимым заголовкам.
-
Когда экземпляр BabylMessage создаётся на основе
экземпляра MaildirMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
метка «unseen» |
нет флага S |
метка «удалено» |
Флаг T |
метка «отвечено» |
Флаг R |
Метка «forwarded» |
Флаг P |
Когда экземпляр BabylMessage создаётся на основе
экземпляра mboxMessage или MMDFMessage, заголовки Status
и X-Status опускаются и происходят следующие
преобразования:
Результирующее состояние |
|
|---|---|
метка «unseen» |
нет флага R |
метка «удалено» |
Флаг D |
метка «отвечено» |
Флаг A |
Когда экземпляр BabylMessage создаётся на основе
экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
метка «unseen» |
последовательность «unseen» |
метка «отвечено» |
последовательность «replied» |
18.4.2.5. MMDFMessage¶
-
class
mailbox.MMDFMessage([message])¶ Сообщение с поведением, специфичным для MMDF. Параметр message имеет то же значение, что и в конструкторе
Message.Как и сообщения в почтовом ящике mbox, сообщения MMDF хранятся с адресом отправителя и датой доставки в начальной строке, начинающейся с «From ». Аналогично, флаги, указывающие на состояние сообщения, обычно хранятся в заголовках Status и X-Status.
Стандартные флаги для сообщений MMDF совпадают с флагами сообщений mbox и перечислены ниже:
Флаг
Значение
Пояснение
R
Прочитано
Прочитано
O
Старое
Ранее обнаружено почтовым клиентом
D
Удалено
Помечено для последующего удаления
F
Помечено
Помечено как важное
A
Отвечено
Получен ответ
Флаги «R» и «O» хранятся в заголовке Status, а флаги «D», «F» и «A» – в заголовке X-Status. Флаги и заголовки обычно располагаются в указанном порядке.
Экземпляры
MMDFMessageпредоставляют следующие методы, идентичные методам, предоставляемымmboxMessage:-
get_from()¶ Возвращает строку, представляющую строку «From », отмечающую начало сообщения в почтовом ящике mbox. Начальная «From » и конечный символ новой строки исключаются.
-
set_from(from_, time_=None)¶ Устанавливает строку «From » равной from_, которая должна быть указана без начальной «From » или конечного символа новой строки. Для удобства можно указать time_, и она будет правильно отформатирована и добавлена к from_. Если time_ указан, это должен быть экземпляр
time.struct_time, кортеж, подходящий для передачи вtime.strftime(), илиTrue(для использованияtime.gmtime()).
-
get_flags()¶ Возвращает строку, указывающую установленные флаги. Если сообщение соответствует стандартному формату, результатом является конкатенация в следующем порядке нуля или одного вхождения каждого из
'R','O','D','F'и'A'.
-
set_flags(flags)¶ Устанавливает флаги, указанные в flags, и снимает все остальные. Параметр flags должен быть конкатенацией в произвольном порядке нуля или более вхождений каждого из
'R','O','D','F'и'A'.
-
add_flag(flag)¶ Устанавливает флаг(и), указанные в flag, не изменяя другие флаги. Чтобы добавить более одного флага за раз, flag может быть строкой из более чем одного символа.
-
remove_flag(flag)¶ Снимает флаг(и), указанные в flag, не изменяя другие флаги. Чтобы снять несколько флагов одновременно, flag может быть строкой из более чем одного символа.
-
Когда экземпляр MMDFMessage создается на основе экземпляра MaildirMessage, строка «From » генерируется на основе даты доставки экземпляра MaildirMessage, и происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R |
Флаг S |
Флаг O |
Подкаталог «cur» |
Флаг D |
Флаг T |
Флаг F |
Флаг F |
Флаг A |
Флаг R |
Когда экземпляр MMDFMessage создаётся на основе экземпляра MHMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R и флаг O |
нет последовательности «unseen» |
Флаг O |
последовательность «unseen» |
Флаг F |
последовательность «flagged» |
Флаг A |
последовательность «replied» |
Когда экземпляр MMDFMessage создаётся на основе экземпляра BabylMessage, происходят следующие преобразования:
Результирующее состояние |
Состояние |
|---|---|
Флаг R и флаг O |
нет метки «unseen» |
Флаг O |
метка «unseen» |
Флаг D |
метка «удалено» |
Флаг A |
метка «отвечено» |
Когда экземпляр MMDFMessage создается на основе экземпляра mboxMessage, строка «From » копируется, и все флаги напрямую соответствуют:
Результирующее состояние |
Состояние |
|---|---|
Флаг R |
Флаг R |
Флаг O |
Флаг O |
Флаг D |
Флаг D |
Флаг F |
Флаг F |
Флаг A |
Флаг A |
18.4.3. Исключения¶Exceptions
В модуле mailbox определены следующие классы исключений:
-
exception
mailbox.Error¶ Базовый класс для всех остальных исключений, специфичных для модуля.
-
exception
mailbox.NoSuchMailboxError¶ Вызывается, когда ожидается почтовый ящик, но он не найден, например, при создании экземпляра подкласса
Mailboxс несуществующим путём (и с параметром create, установленным вFalse) или при открытии несуществующей папки.
-
exception
mailbox.NotEmptyError¶ Вызывается, когда почтовый ящик не пуст, но ожидается пустым, например, при удалении папки, содержащей сообщения.
-
exception
mailbox.ExternalClashError¶ Возникает, когда не зависящее от программы условие, связанное с почтовым ящиком, не позволяет продолжить работу, например, когда не удаётся получить блокировку, которая уже удерживается другой программой, или когда сгенерированное уникальное имя файла уже существует.
18.4.4. Устаревшие классы и методы¶Deprecated classes and methods
Устарело с версии 2.6.
Старые версии модуля mailbox не поддерживают изменение
почтовых ящиков, например добавление или удаление сообщений, и не предоставляют классы для
представления свойств сообщений, специфичных для формата. Для обратной совместимости,
старые классы почтовых ящиков по-прежнему доступны, но новые классы следует использовать
вместо них. Старые классы были удалены в Python 3.
Старые объекты почтовых ящиков поддерживают только итерацию и предоставляют один открытый метод:
-
oldmailbox.next()¶ Возвращает следующее сообщение в почтовом ящике, созданное с помощью необязательного аргумента factory переданного в конструктор объекта почтового ящика. По умолчанию это объект
rfc822.Message(см. модульrfc822). В зависимости от реализации почтового ящика атрибут fp этого объекта может быть настоящим файловым объектом или экземпляром класса, имитирующим файловый объект, обрабатывающим такие вещи, как границы сообщений, если несколько почтовых сообщений содержатся в одном файле, и т.д. Если больше нет сообщений, этот метод возвращаетNone.
У большинства старых классов почтовых ящиков имена отличаются от текущих
имен классов почтовых ящиков, за исключением Maildir. По этой причине новый
класс Maildir определяет метод next(), и его конструктор отличается
незначительно от конструкторов других новых классов почтовых ящиков.
Старые классы почтовых ящиков, чьи имена не совпадают с именами их новых аналогов, перечислены ниже:
-
class
mailbox.UnixMailbox(fp[, factory])¶ Доступ к классическому почтовому ящику в стиле Unix, где все сообщения содержатся в одном файле и разделяются строками
From(также известными какFrom_). Файловый объект fp указывает на файл почтового ящика. Необязательный параметр factory является вызываемым объектом, который должен создавать новые объекты сообщений. factory вызывается с одним аргументом, fp методомnext()объекта почтового ящика. По умолчанию используется классrfc822.Message(см. модульrfc822– и примечание ниже).Примечание
По причинам внутренней реализации этого модуля, возможно, потребуется открыть объект fp в двоичном режиме. Это особенно важно в Windows.
Для максимальной переносимости сообщения в почтовом ящике в стиле Unix разделяются любой строкой, которая начинается точно со строки
'From '(обратите внимание на завершающий пробел) если перед ней стоят ровно два символа новой строки. Из-за большого разнообразия на практике, ничто другое в строкеFrom_не должно учитываться. Однако текущая реализация не проверяет наличие двух начальных символов новой строки. Это обычно приемлемо для большинства приложений.Класс
UnixMailboxреализует более строгую версию проверки строкFrom_, используя регулярное выражение, которое обычно правильно сопоставляет разделителиFrom_. Он считает, что строка-разделитель отделяется строкамиFrom name time. Для максимальной переносимости используйте классPortableUnixMailboxвместо него. Этот класс идентиченUnixMailboxза исключением того, что отдельные сообщения разделяются толькоFrom.
-
class
mailbox.PortableUnixMailbox(fp[, factory])¶ Менее строгая версия
UnixMailbox, которая учитывает толькоFromв начале строки, разделяющей сообщения. Часть “name time” строки From игнорируется, чтобы защититься от некоторых вариаций, которые наблюдаются на практике. Это работает, поскольку строки в сообщении, которые начинаются с'From ', заключаются в кавычки почтовым программным обеспечением во время доставки.
-
class
mailbox.MmdfMailbox(fp[, factory])¶ Обеспечивает доступ к почтовому ящику в стиле MMDF, где все сообщения содержатся в одном файле и разделяются строками, состоящими из 4 символов Control-A. Файловый объект fp указывает на файл почтового ящика. Необязательный параметр factory ведёт себя так же, как в классе
UnixMailbox.
-
class
mailbox.MHMailbox(dirname[, factory])¶ Обеспечивает доступ к почтовому ящику MH – каталогу, где каждое сообщение находится в отдельном файле с числовым именем. Имя каталога почтового ящика передаётся в dirname. factory ведёт себя так же, как в классе
UnixMailbox.
-
class
mailbox.BabylMailbox(fp[, factory])¶ Обращение к почтовому ящику Babyl, который похож на почтовый ящик MMDF. В формате Babyl каждое сообщение имеет два набора заголовков: исходные заголовки и видимые заголовки. Исходные заголовки находятся перед строкой, содержащей только
'*** EOOH ***'(End-Of-Original-Headers), а видимые заголовки находятся после строкиEOOH. Почтовые клиенты, совместимые с Babyl, показывают только видимые заголовки, и объектыBabylMailboxвозвращают сообщения, содержащие только видимые заголовки. Для доступа к исходным заголовкам придется самостоятельно разбирать файл почтового ящика. Почтовые сообщения начинаются со строки EOOH и заканчиваются строкой, содержащей только'\037\014'. Фабрика такая же, как и для классаUnixMailbox.
Для использования старых классов почтовых ящиков с модулем email вместо устаревшего модуля rfc822 можно поступить следующим образом:
import email
import email.Errors
import mailbox
def msgfactory(fp):
try:
return email.message_from_file(fp)
except email.Errors.MessageParseError:
# Не возвращайте None, так как это
# остановит итератор почтового ящика
return ''
mbox = mailbox.UnixMailbox(fp, msgfactory)
Кроме того, если известно, что почтовый ящик содержит только корректно сформированные MIME-сообщения, можно упростить это до:
import email
import mailbox
mbox = mailbox.UnixMailbox(fp, email.message_from_file)
18.4.5. Примеры¶Examples
Простой пример вывода тем всех сообщений в почтовом ящике, которые кажутся интересными:
import mailbox
for message in mailbox.mbox('~/mbox'):
subject = message['subject'] # Может быть None.
if subject and 'python' in subject.lower():
print subject
Чтобы скопировать все письма из почтового ящика Babyl в почтовый ящик MH, преобразуя всю форматно-специфичную информацию, которую можно преобразовать:
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
Этот пример сортирует письма из нескольких списков рассылки по разным почтовым ящикам, стараясь избежать повреждения писем из-за одновременного изменения другими программами, потери писем из-за прерывания программы или преждевременного завершения из-за повреждённых сообщений в почтовом ящике:
import mailbox
import email.errors
list_names = ('python-list', 'python-dev', 'python-bugs')
boxes = dict((name, mailbox.mbox('~/email/%s' % name)) for name in list_names)
inbox = mailbox.Maildir('~/Maildir', factory=None)
for key in inbox.iterkeys():
try:
message = inbox[key]
except email.errors.MessageParseError:
continue # Сообщение повреждено. Просто оставьте его.
for name in list_names:
list_id = message['list-id']
if list_id and name in list_id:
# Получить почтовый ящик для использования.
box = boxes[name]
# Записать копию на диск перед удалением оригинала.
# Если произошёл сбой, возможно дублирование сообщения, но
# это лучше, чем полная потеря сообщения.
box.lock()
box.add(message)
box.flush()
box.unlock()
# Удалить исходное сообщение
inbox.lock()
inbox.discard(key)
inbox.flush()
inbox.unlock()
break # Целевой получатель найден, поиск прекращён.
for box in boxes.itervalues():
box.close()