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