blob: f82a3b200deb7c4d01820376a7d51a72e2c4dc7b [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`mailbox` --- Manipulate mailboxes in various formats
2==========================================================
3
4.. module:: mailbox
5 :synopsis: Manipulate mailboxes in various formats
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Georg Brandl116aa622007-08-15 14:28:22 +00007.. moduleauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com>
8.. sectionauthor:: Gregory K. Johnson <gkj@gregorykjohnson.com>
9
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040010**Source code:** :source:`Lib/mailbox.py`
11
12--------------
Georg Brandl116aa622007-08-15 14:28:22 +000013
14This module defines two classes, :class:`Mailbox` and :class:`Message`, for
15accessing and manipulating on-disk mailboxes and the messages they contain.
16:class:`Mailbox` offers a dictionary-like mapping from keys to messages.
R David Murray53202502012-09-28 15:19:16 -040017:class:`Message` extends the :mod:`email.message` module's
18:class:`~email.message.Message` class with format-specific state and behavior.
19Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
Georg Brandl116aa622007-08-15 14:28:22 +000020
21
22.. seealso::
23
24 Module :mod:`email`
25 Represent and manipulate messages.
26
27
28.. _mailbox-objects:
29
30:class:`Mailbox` objects
31------------------------
32
Georg Brandl116aa622007-08-15 14:28:22 +000033.. class:: Mailbox
34
35 A mailbox, which may be inspected and modified.
36
Benjamin Petersone41251e2008-04-25 01:59:09 +000037 The :class:`Mailbox` class defines an interface and is not intended to be
38 instantiated. Instead, format-specific subclasses should inherit from
39 :class:`Mailbox` and your code should instantiate a particular subclass.
Georg Brandl116aa622007-08-15 14:28:22 +000040
Benjamin Petersone41251e2008-04-25 01:59:09 +000041 The :class:`Mailbox` interface is dictionary-like, with small keys
42 corresponding to messages. Keys are issued by the :class:`Mailbox` instance
43 with which they will be used and are only meaningful to that :class:`Mailbox`
44 instance. A key continues to identify a message even if the corresponding
45 message is modified, such as by replacing it with another message.
Georg Brandl116aa622007-08-15 14:28:22 +000046
Benjamin Petersone41251e2008-04-25 01:59:09 +000047 Messages may be added to a :class:`Mailbox` instance using the set-like
48 method :meth:`add` and removed using a ``del`` statement or the set-like
49 methods :meth:`remove` and :meth:`discard`.
Georg Brandl116aa622007-08-15 14:28:22 +000050
Benjamin Petersone41251e2008-04-25 01:59:09 +000051 :class:`Mailbox` interface semantics differ from dictionary semantics in some
52 noteworthy ways. Each time a message is requested, a new representation
53 (typically a :class:`Message` instance) is generated based upon the current
54 state of the mailbox. Similarly, when a message is added to a
55 :class:`Mailbox` instance, the provided message representation's contents are
56 copied. In neither case is a reference to the message representation kept by
57 the :class:`Mailbox` instance.
Georg Brandl116aa622007-08-15 14:28:22 +000058
Benjamin Petersone41251e2008-04-25 01:59:09 +000059 The default :class:`Mailbox` iterator iterates over message representations,
60 not keys as the default dictionary iterator does. Moreover, modification of a
61 mailbox during iteration is safe and well-defined. Messages added to the
62 mailbox after an iterator is created will not be seen by the
63 iterator. Messages removed from the mailbox before the iterator yields them
64 will be silently skipped, though using a key from an iterator may result in a
65 :exc:`KeyError` exception if the corresponding message is subsequently
66 removed.
Georg Brandl116aa622007-08-15 14:28:22 +000067
Benjamin Petersone41251e2008-04-25 01:59:09 +000068 .. warning::
Georg Brandl116aa622007-08-15 14:28:22 +000069
Benjamin Petersone41251e2008-04-25 01:59:09 +000070 Be very cautious when modifying mailboxes that might be simultaneously
71 changed by some other process. The safest mailbox format to use for such
72 tasks is Maildir; try to avoid using single-file formats such as mbox for
73 concurrent writing. If you're modifying a mailbox, you *must* lock it by
74 calling the :meth:`lock` and :meth:`unlock` methods *before* reading any
75 messages in the file or making any changes by adding or deleting a
76 message. Failing to lock the mailbox runs the risk of losing messages or
77 corrupting the entire mailbox.
Georg Brandl116aa622007-08-15 14:28:22 +000078
Benjamin Petersone41251e2008-04-25 01:59:09 +000079 :class:`Mailbox` instances have the following methods:
Georg Brandl116aa622007-08-15 14:28:22 +000080
81
Benjamin Petersone41251e2008-04-25 01:59:09 +000082 .. method:: add(message)
Georg Brandl116aa622007-08-15 14:28:22 +000083
Benjamin Petersone41251e2008-04-25 01:59:09 +000084 Add *message* to the mailbox and return the key that has been assigned to
85 it.
Georg Brandl116aa622007-08-15 14:28:22 +000086
Benjamin Petersone41251e2008-04-25 01:59:09 +000087 Parameter *message* may be a :class:`Message` instance, an
R David Murray53202502012-09-28 15:19:16 -040088 :class:`email.message.Message` instance, a string, a byte string, or a
R. David Murrayb7deff12011-01-30 06:21:28 +000089 file-like object (which should be open in binary mode). If *message* is
90 an instance of the
Benjamin Petersone41251e2008-04-25 01:59:09 +000091 appropriate format-specific :class:`Message` subclass (e.g., if it's an
92 :class:`mboxMessage` instance and this is an :class:`mbox` instance), its
93 format-specific information is used. Otherwise, reasonable defaults for
94 format-specific information are used.
Georg Brandl116aa622007-08-15 14:28:22 +000095
Georg Brandl33369cf2012-06-24 22:48:03 +020096 .. versionchanged:: 3.2
97 Support for binary input was added.
R. David Murrayb7deff12011-01-30 06:21:28 +000098
Georg Brandl116aa622007-08-15 14:28:22 +000099
Benjamin Petersone41251e2008-04-25 01:59:09 +0000100 .. method:: remove(key)
101 __delitem__(key)
102 discard(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000103
Benjamin Petersone41251e2008-04-25 01:59:09 +0000104 Delete the message corresponding to *key* from the mailbox.
Georg Brandl116aa622007-08-15 14:28:22 +0000105
Benjamin Petersone41251e2008-04-25 01:59:09 +0000106 If no such message exists, a :exc:`KeyError` exception is raised if the
107 method was called as :meth:`remove` or :meth:`__delitem__` but no
108 exception is raised if the method was called as :meth:`discard`. The
109 behavior of :meth:`discard` may be preferred if the underlying mailbox
110 format supports concurrent modification by other processes.
Georg Brandl116aa622007-08-15 14:28:22 +0000111
112
Benjamin Petersone41251e2008-04-25 01:59:09 +0000113 .. method:: __setitem__(key, message)
Georg Brandl116aa622007-08-15 14:28:22 +0000114
Benjamin Petersone41251e2008-04-25 01:59:09 +0000115 Replace the message corresponding to *key* with *message*. Raise a
116 :exc:`KeyError` exception if no message already corresponds to *key*.
Georg Brandl116aa622007-08-15 14:28:22 +0000117
Benjamin Petersone41251e2008-04-25 01:59:09 +0000118 As with :meth:`add`, parameter *message* may be a :class:`Message`
R David Murray53202502012-09-28 15:19:16 -0400119 instance, an :class:`email.message.Message` instance, a string, a byte
R. David Murrayb7deff12011-01-30 06:21:28 +0000120 string, or a file-like object (which should be open in binary mode). If
121 *message* is an
Benjamin Petersone41251e2008-04-25 01:59:09 +0000122 instance of the appropriate format-specific :class:`Message` subclass
123 (e.g., if it's an :class:`mboxMessage` instance and this is an
124 :class:`mbox` instance), its format-specific information is
125 used. Otherwise, the format-specific information of the message that
126 currently corresponds to *key* is left unchanged.
Georg Brandl116aa622007-08-15 14:28:22 +0000127
128
Benjamin Petersone41251e2008-04-25 01:59:09 +0000129 .. method:: iterkeys()
130 keys()
Georg Brandl116aa622007-08-15 14:28:22 +0000131
Benjamin Petersone41251e2008-04-25 01:59:09 +0000132 Return an iterator over all keys if called as :meth:`iterkeys` or return a
133 list of keys if called as :meth:`keys`.
Georg Brandl116aa622007-08-15 14:28:22 +0000134
135
Benjamin Petersone41251e2008-04-25 01:59:09 +0000136 .. method:: itervalues()
137 __iter__()
138 values()
Georg Brandl116aa622007-08-15 14:28:22 +0000139
Benjamin Petersone41251e2008-04-25 01:59:09 +0000140 Return an iterator over representations of all messages if called as
141 :meth:`itervalues` or :meth:`__iter__` or return a list of such
142 representations if called as :meth:`values`. The messages are represented
143 as instances of the appropriate format-specific :class:`Message` subclass
144 unless a custom message factory was specified when the :class:`Mailbox`
145 instance was initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000146
Benjamin Petersone41251e2008-04-25 01:59:09 +0000147 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000148
Benjamin Petersone41251e2008-04-25 01:59:09 +0000149 The behavior of :meth:`__iter__` is unlike that of dictionaries, which
150 iterate over keys.
Georg Brandl116aa622007-08-15 14:28:22 +0000151
152
Benjamin Petersone41251e2008-04-25 01:59:09 +0000153 .. method:: iteritems()
154 items()
Georg Brandl116aa622007-08-15 14:28:22 +0000155
Benjamin Petersone41251e2008-04-25 01:59:09 +0000156 Return an iterator over (*key*, *message*) pairs, where *key* is a key and
157 *message* is a message representation, if called as :meth:`iteritems` or
158 return a list of such pairs if called as :meth:`items`. The messages are
159 represented as instances of the appropriate format-specific
160 :class:`Message` subclass unless a custom message factory was specified
161 when the :class:`Mailbox` instance was initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000162
163
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000164 .. method:: get(key, default=None)
Benjamin Petersone41251e2008-04-25 01:59:09 +0000165 __getitem__(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000166
Benjamin Petersone41251e2008-04-25 01:59:09 +0000167 Return a representation of the message corresponding to *key*. If no such
168 message exists, *default* is returned if the method was called as
169 :meth:`get` and a :exc:`KeyError` exception is raised if the method was
170 called as :meth:`__getitem__`. The message is represented as an instance
171 of the appropriate format-specific :class:`Message` subclass unless a
172 custom message factory was specified when the :class:`Mailbox` instance
173 was initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000174
175
Benjamin Petersone41251e2008-04-25 01:59:09 +0000176 .. method:: get_message(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000177
Benjamin Petersone41251e2008-04-25 01:59:09 +0000178 Return a representation of the message corresponding to *key* as an
179 instance of the appropriate format-specific :class:`Message` subclass, or
180 raise a :exc:`KeyError` exception if no such message exists.
Georg Brandl116aa622007-08-15 14:28:22 +0000181
182
R. David Murrayb7deff12011-01-30 06:21:28 +0000183 .. method:: get_bytes(key)
184
185 Return a byte representation of the message corresponding to *key*, or
186 raise a :exc:`KeyError` exception if no such message exists.
187
188 .. versionadded:: 3.2
189
190
Benjamin Petersone41251e2008-04-25 01:59:09 +0000191 .. method:: get_string(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000192
Benjamin Petersone41251e2008-04-25 01:59:09 +0000193 Return a string representation of the message corresponding to *key*, or
R. David Murrayb7deff12011-01-30 06:21:28 +0000194 raise a :exc:`KeyError` exception if no such message exists. The
195 message is processed through :class:`email.message.Message` to
196 convert it to a 7bit clean representation.
Georg Brandl116aa622007-08-15 14:28:22 +0000197
198
Benjamin Petersone41251e2008-04-25 01:59:09 +0000199 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000200
Benjamin Petersone41251e2008-04-25 01:59:09 +0000201 Return a file-like representation of the message corresponding to *key*,
Georg Brandl6ce29fa2010-10-30 14:33:28 +0000202 or raise a :exc:`KeyError` exception if no such message exists. The
203 file-like object behaves as if open in binary mode. This file should be
Benjamin Petersone41251e2008-04-25 01:59:09 +0000204 closed once it is no longer needed.
Georg Brandl116aa622007-08-15 14:28:22 +0000205
R. David Murrayb7deff12011-01-30 06:21:28 +0000206 .. versionchanged:: 3.2
207 The file object really is a binary file; previously it was incorrectly
208 returned in text mode. Also, the file-like object now supports the
Serhiy Storchaka14867992014-09-10 23:43:41 +0300209 context management protocol: you can use a :keyword:`with` statement to
R. David Murrayb7deff12011-01-30 06:21:28 +0000210 automatically close it.
Georg Brandl6ce29fa2010-10-30 14:33:28 +0000211
Benjamin Petersone41251e2008-04-25 01:59:09 +0000212 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000213
Benjamin Petersone41251e2008-04-25 01:59:09 +0000214 Unlike other representations of messages, file-like representations are
215 not necessarily independent of the :class:`Mailbox` instance that
Georg Brandl6ce29fa2010-10-30 14:33:28 +0000216 created them or of the underlying mailbox. More specific documentation
Benjamin Petersone41251e2008-04-25 01:59:09 +0000217 is provided by each subclass.
Georg Brandl116aa622007-08-15 14:28:22 +0000218
219
Benjamin Petersone41251e2008-04-25 01:59:09 +0000220 .. method:: __contains__(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000221
Benjamin Petersone41251e2008-04-25 01:59:09 +0000222 Return ``True`` if *key* corresponds to a message, ``False`` otherwise.
Georg Brandl116aa622007-08-15 14:28:22 +0000223
224
Benjamin Petersone41251e2008-04-25 01:59:09 +0000225 .. method:: __len__()
Georg Brandl116aa622007-08-15 14:28:22 +0000226
Benjamin Petersone41251e2008-04-25 01:59:09 +0000227 Return a count of messages in the mailbox.
Georg Brandl116aa622007-08-15 14:28:22 +0000228
229
Benjamin Petersone41251e2008-04-25 01:59:09 +0000230 .. method:: clear()
Georg Brandl116aa622007-08-15 14:28:22 +0000231
Benjamin Petersone41251e2008-04-25 01:59:09 +0000232 Delete all messages from the mailbox.
Georg Brandl116aa622007-08-15 14:28:22 +0000233
234
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000235 .. method:: pop(key, default=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000236
Benjamin Petersone41251e2008-04-25 01:59:09 +0000237 Return a representation of the message corresponding to *key* and delete
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000238 the message. If no such message exists, return *default*. The message is
Benjamin Petersone41251e2008-04-25 01:59:09 +0000239 represented as an instance of the appropriate format-specific
240 :class:`Message` subclass unless a custom message factory was specified
241 when the :class:`Mailbox` instance was initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243
Benjamin Petersone41251e2008-04-25 01:59:09 +0000244 .. method:: popitem()
Georg Brandl116aa622007-08-15 14:28:22 +0000245
Benjamin Petersone41251e2008-04-25 01:59:09 +0000246 Return an arbitrary (*key*, *message*) pair, where *key* is a key and
247 *message* is a message representation, and delete the corresponding
248 message. If the mailbox is empty, raise a :exc:`KeyError` exception. The
249 message is represented as an instance of the appropriate format-specific
250 :class:`Message` subclass unless a custom message factory was specified
251 when the :class:`Mailbox` instance was initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000252
253
Benjamin Petersone41251e2008-04-25 01:59:09 +0000254 .. method:: update(arg)
Georg Brandl116aa622007-08-15 14:28:22 +0000255
Benjamin Petersone41251e2008-04-25 01:59:09 +0000256 Parameter *arg* should be a *key*-to-*message* mapping or an iterable of
257 (*key*, *message*) pairs. Updates the mailbox so that, for each given
258 *key* and *message*, the message corresponding to *key* is set to
259 *message* as if by using :meth:`__setitem__`. As with :meth:`__setitem__`,
260 each *key* must already correspond to a message in the mailbox or else a
261 :exc:`KeyError` exception will be raised, so in general it is incorrect
262 for *arg* to be a :class:`Mailbox` instance.
Georg Brandl116aa622007-08-15 14:28:22 +0000263
Benjamin Petersone41251e2008-04-25 01:59:09 +0000264 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000265
Benjamin Petersone41251e2008-04-25 01:59:09 +0000266 Unlike with dictionaries, keyword arguments are not supported.
Georg Brandl116aa622007-08-15 14:28:22 +0000267
268
Benjamin Petersone41251e2008-04-25 01:59:09 +0000269 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +0000270
Benjamin Petersone41251e2008-04-25 01:59:09 +0000271 Write any pending changes to the filesystem. For some :class:`Mailbox`
272 subclasses, changes are always written immediately and :meth:`flush` does
273 nothing, but you should still make a habit of calling this method.
Georg Brandl116aa622007-08-15 14:28:22 +0000274
275
Benjamin Petersone41251e2008-04-25 01:59:09 +0000276 .. method:: lock()
Georg Brandl116aa622007-08-15 14:28:22 +0000277
Benjamin Petersone41251e2008-04-25 01:59:09 +0000278 Acquire an exclusive advisory lock on the mailbox so that other processes
279 know not to modify it. An :exc:`ExternalClashError` is raised if the lock
280 is not available. The particular locking mechanisms used depend upon the
281 mailbox format. You should *always* lock the mailbox before making any
282 modifications to its contents.
Georg Brandl116aa622007-08-15 14:28:22 +0000283
284
Benjamin Petersone41251e2008-04-25 01:59:09 +0000285 .. method:: unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000286
Benjamin Petersone41251e2008-04-25 01:59:09 +0000287 Release the lock on the mailbox, if any.
Georg Brandl116aa622007-08-15 14:28:22 +0000288
289
Benjamin Petersone41251e2008-04-25 01:59:09 +0000290 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +0000291
Benjamin Petersone41251e2008-04-25 01:59:09 +0000292 Flush the mailbox, unlock it if necessary, and close any open files. For
293 some :class:`Mailbox` subclasses, this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000294
295
296.. _mailbox-maildir:
297
298:class:`Maildir`
299^^^^^^^^^^^^^^^^
300
301
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000302.. class:: Maildir(dirname, factory=None, create=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000303
304 A subclass of :class:`Mailbox` for mailboxes in Maildir format. Parameter
305 *factory* is a callable object that accepts a file-like message representation
306 (which behaves as if opened in binary mode) and returns a custom representation.
307 If *factory* is ``None``, :class:`MaildirMessage` is used as the default message
308 representation. If *create* is ``True``, the mailbox is created if it does not
309 exist.
310
Sviatoslav Sydorenkoe4418472019-07-13 16:47:15 +0200311 If *create* is ``True`` and the *dirname* path exists, it will be treated as
312 an existing maildir without attempting to verify its directory layout.
313
Georg Brandlaa5b4112008-05-11 20:51:18 +0000314 It is for historical reasons that *dirname* is named as such rather than *path*.
Georg Brandl116aa622007-08-15 14:28:22 +0000315
Benjamin Petersone41251e2008-04-25 01:59:09 +0000316 Maildir is a directory-based mailbox format invented for the qmail mail
317 transfer agent and now widely supported by other programs. Messages in a
318 Maildir mailbox are stored in separate files within a common directory
319 structure. This design allows Maildir mailboxes to be accessed and modified
320 by multiple unrelated programs without data corruption, so file locking is
321 unnecessary.
Georg Brandl116aa622007-08-15 14:28:22 +0000322
Benjamin Petersone41251e2008-04-25 01:59:09 +0000323 Maildir mailboxes contain three subdirectories, namely: :file:`tmp`,
324 :file:`new`, and :file:`cur`. Messages are created momentarily in the
325 :file:`tmp` subdirectory and then moved to the :file:`new` subdirectory to
326 finalize delivery. A mail user agent may subsequently move the message to the
327 :file:`cur` subdirectory and store information about the state of the message
328 in a special "info" section appended to its file name.
Georg Brandl116aa622007-08-15 14:28:22 +0000329
Benjamin Petersone41251e2008-04-25 01:59:09 +0000330 Folders of the style introduced by the Courier mail transfer agent are also
331 supported. Any subdirectory of the main mailbox is considered a folder if
332 ``'.'`` is the first character in its name. Folder names are represented by
333 :class:`Maildir` without the leading ``'.'``. Each folder is itself a Maildir
334 mailbox but should not contain other folders. Instead, a logical nesting is
335 indicated using ``'.'`` to delimit levels, e.g., "Archived.2005.07".
Georg Brandl116aa622007-08-15 14:28:22 +0000336
Benjamin Petersone41251e2008-04-25 01:59:09 +0000337 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000338
Benjamin Petersone41251e2008-04-25 01:59:09 +0000339 The Maildir specification requires the use of a colon (``':'``) in certain
340 message file names. However, some operating systems do not permit this
341 character in file names, If you wish to use a Maildir-like format on such
342 an operating system, you should specify another character to use
343 instead. The exclamation point (``'!'``) is a popular choice. For
344 example::
Georg Brandl116aa622007-08-15 14:28:22 +0000345
Benjamin Petersone41251e2008-04-25 01:59:09 +0000346 import mailbox
347 mailbox.Maildir.colon = '!'
Georg Brandl116aa622007-08-15 14:28:22 +0000348
Benjamin Petersone41251e2008-04-25 01:59:09 +0000349 The :attr:`colon` attribute may also be set on a per-instance basis.
Georg Brandl116aa622007-08-15 14:28:22 +0000350
Benjamin Petersone41251e2008-04-25 01:59:09 +0000351 :class:`Maildir` instances have all of the methods of :class:`Mailbox` in
352 addition to the following:
Georg Brandl116aa622007-08-15 14:28:22 +0000353
354
Benjamin Petersone41251e2008-04-25 01:59:09 +0000355 .. method:: list_folders()
Georg Brandl116aa622007-08-15 14:28:22 +0000356
Benjamin Petersone41251e2008-04-25 01:59:09 +0000357 Return a list of the names of all folders.
Georg Brandl116aa622007-08-15 14:28:22 +0000358
359
Ezio Melotti2d352d02009-09-15 18:51:37 +0000360 .. method:: get_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000361
Benjamin Petersone41251e2008-04-25 01:59:09 +0000362 Return a :class:`Maildir` instance representing the folder whose name is
363 *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder
364 does not exist.
Georg Brandl116aa622007-08-15 14:28:22 +0000365
366
Benjamin Petersone41251e2008-04-25 01:59:09 +0000367 .. method:: add_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000368
Benjamin Petersone41251e2008-04-25 01:59:09 +0000369 Create a folder whose name is *folder* and return a :class:`Maildir`
370 instance representing it.
Georg Brandl116aa622007-08-15 14:28:22 +0000371
372
Benjamin Petersone41251e2008-04-25 01:59:09 +0000373 .. method:: remove_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000374
Benjamin Petersone41251e2008-04-25 01:59:09 +0000375 Delete the folder whose name is *folder*. If the folder contains any
376 messages, a :exc:`NotEmptyError` exception will be raised and the folder
377 will not be deleted.
Georg Brandl116aa622007-08-15 14:28:22 +0000378
379
Benjamin Petersone41251e2008-04-25 01:59:09 +0000380 .. method:: clean()
Georg Brandl116aa622007-08-15 14:28:22 +0000381
Benjamin Petersone41251e2008-04-25 01:59:09 +0000382 Delete temporary files from the mailbox that have not been accessed in the
383 last 36 hours. The Maildir specification says that mail-reading programs
384 should do this occasionally.
Georg Brandl116aa622007-08-15 14:28:22 +0000385
Benjamin Petersone41251e2008-04-25 01:59:09 +0000386 Some :class:`Mailbox` methods implemented by :class:`Maildir` deserve special
387 remarks:
Georg Brandl116aa622007-08-15 14:28:22 +0000388
389
Benjamin Petersone41251e2008-04-25 01:59:09 +0000390 .. method:: add(message)
391 __setitem__(key, message)
392 update(arg)
Georg Brandl116aa622007-08-15 14:28:22 +0000393
Benjamin Petersone41251e2008-04-25 01:59:09 +0000394 .. warning::
Georg Brandl116aa622007-08-15 14:28:22 +0000395
Benjamin Petersone41251e2008-04-25 01:59:09 +0000396 These methods generate unique file names based upon the current process
397 ID. When using multiple threads, undetected name clashes may occur and
398 cause corruption of the mailbox unless threads are coordinated to avoid
399 using these methods to manipulate the same mailbox simultaneously.
Georg Brandl116aa622007-08-15 14:28:22 +0000400
401
Benjamin Petersone41251e2008-04-25 01:59:09 +0000402 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +0000403
Benjamin Petersone41251e2008-04-25 01:59:09 +0000404 All changes to Maildir mailboxes are immediately applied, so this method
405 does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000406
407
Benjamin Petersone41251e2008-04-25 01:59:09 +0000408 .. method:: lock()
409 unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000410
Benjamin Petersone41251e2008-04-25 01:59:09 +0000411 Maildir mailboxes do not support (or require) locking, so these methods do
412 nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000413
414
Benjamin Petersone41251e2008-04-25 01:59:09 +0000415 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +0000416
Benjamin Petersone41251e2008-04-25 01:59:09 +0000417 :class:`Maildir` instances do not keep any open files and the underlying
418 mailboxes do not support locking, so this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000419
420
Benjamin Petersone41251e2008-04-25 01:59:09 +0000421 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000422
Benjamin Petersone41251e2008-04-25 01:59:09 +0000423 Depending upon the host platform, it may not be possible to modify or
424 remove the underlying message while the returned file remains open.
Georg Brandl116aa622007-08-15 14:28:22 +0000425
426
427.. seealso::
428
429 `maildir man page from qmail <http://www.qmail.org/man/man5/maildir.html>`_
430 The original specification of the format.
431
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300432 `Using maildir format <https://cr.yp.to/proto/maildir.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000433 Notes on Maildir by its inventor. Includes an updated name-creation scheme and
434 details on "info" semantics.
435
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000436 `maildir man page from Courier <http://www.courier-mta.org/maildir.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000437 Another specification of the format. Describes a common extension for supporting
438 folders.
439
440
441.. _mailbox-mbox:
442
443:class:`mbox`
444^^^^^^^^^^^^^
445
446
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000447.. class:: mbox(path, factory=None, create=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000448
449 A subclass of :class:`Mailbox` for mailboxes in mbox format. Parameter *factory*
450 is a callable object that accepts a file-like message representation (which
451 behaves as if opened in binary mode) and returns a custom representation. If
452 *factory* is ``None``, :class:`mboxMessage` is used as the default message
453 representation. If *create* is ``True``, the mailbox is created if it does not
454 exist.
455
Benjamin Petersone41251e2008-04-25 01:59:09 +0000456 The mbox format is the classic format for storing mail on Unix systems. All
457 messages in an mbox mailbox are stored in a single file with the beginning of
458 each message indicated by a line whose first five characters are "From ".
Georg Brandl116aa622007-08-15 14:28:22 +0000459
Benjamin Petersone41251e2008-04-25 01:59:09 +0000460 Several variations of the mbox format exist to address perceived shortcomings in
461 the original. In the interest of compatibility, :class:`mbox` implements the
462 original format, which is sometimes referred to as :dfn:`mboxo`. This means that
463 the :mailheader:`Content-Length` header, if present, is ignored and that any
464 occurrences of "From " at the beginning of a line in a message body are
465 transformed to ">From " when storing the message, although occurrences of ">From
466 " are not transformed to "From " when reading the message.
Georg Brandl116aa622007-08-15 14:28:22 +0000467
Benjamin Petersone41251e2008-04-25 01:59:09 +0000468 Some :class:`Mailbox` methods implemented by :class:`mbox` deserve special
469 remarks:
Georg Brandl116aa622007-08-15 14:28:22 +0000470
471
Benjamin Petersone41251e2008-04-25 01:59:09 +0000472 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000473
Benjamin Petersone41251e2008-04-25 01:59:09 +0000474 Using the file after calling :meth:`flush` or :meth:`close` on the
475 :class:`mbox` instance may yield unpredictable results or raise an
476 exception.
Georg Brandl116aa622007-08-15 14:28:22 +0000477
478
Benjamin Petersone41251e2008-04-25 01:59:09 +0000479 .. method:: lock()
480 unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000481
Benjamin Petersone41251e2008-04-25 01:59:09 +0000482 Three locking mechanisms are used---dot locking and, if available, the
Georg Brandl60203b42010-10-06 10:11:56 +0000483 :c:func:`flock` and :c:func:`lockf` system calls.
Georg Brandl116aa622007-08-15 14:28:22 +0000484
485
486.. seealso::
487
488 `mbox man page from qmail <http://www.qmail.org/man/man5/mbox.html>`_
489 A specification of the format and its variations.
490
491 `mbox man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mbox>`_
492 Another specification of the format, with details on locking.
493
Georg Brandl5d941342016-02-26 19:37:12 +0100494 `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad <https://www.jwz.org/doc/content-length.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000495 An argument for using the original mbox format rather than a variation.
496
jimmy4f29f3c2017-12-13 13:37:51 +0100497 `"mbox" is a family of several mutually incompatible mailbox formats <https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000498 A history of mbox variations.
499
500
501.. _mailbox-mh:
502
503:class:`MH`
504^^^^^^^^^^^
505
506
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000507.. class:: MH(path, factory=None, create=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000508
509 A subclass of :class:`Mailbox` for mailboxes in MH format. Parameter *factory*
510 is a callable object that accepts a file-like message representation (which
511 behaves as if opened in binary mode) and returns a custom representation. If
512 *factory* is ``None``, :class:`MHMessage` is used as the default message
513 representation. If *create* is ``True``, the mailbox is created if it does not
514 exist.
515
Benjamin Petersone41251e2008-04-25 01:59:09 +0000516 MH is a directory-based mailbox format invented for the MH Message Handling
517 System, a mail user agent. Each message in an MH mailbox resides in its own
518 file. An MH mailbox may contain other MH mailboxes (called :dfn:`folders`) in
519 addition to messages. Folders may be nested indefinitely. MH mailboxes also
520 support :dfn:`sequences`, which are named lists used to logically group
521 messages without moving them to sub-folders. Sequences are defined in a file
522 called :file:`.mh_sequences` in each folder.
Georg Brandl116aa622007-08-15 14:28:22 +0000523
Benjamin Petersone41251e2008-04-25 01:59:09 +0000524 The :class:`MH` class manipulates MH mailboxes, but it does not attempt to
525 emulate all of :program:`mh`'s behaviors. In particular, it does not modify
526 and is not affected by the :file:`context` or :file:`.mh_profile` files that
527 are used by :program:`mh` to store its state and configuration.
Georg Brandl116aa622007-08-15 14:28:22 +0000528
Benjamin Petersone41251e2008-04-25 01:59:09 +0000529 :class:`MH` instances have all of the methods of :class:`Mailbox` in addition
530 to the following:
Georg Brandl116aa622007-08-15 14:28:22 +0000531
532
Benjamin Petersone41251e2008-04-25 01:59:09 +0000533 .. method:: list_folders()
Georg Brandl116aa622007-08-15 14:28:22 +0000534
Benjamin Petersone41251e2008-04-25 01:59:09 +0000535 Return a list of the names of all folders.
Georg Brandl116aa622007-08-15 14:28:22 +0000536
537
Benjamin Petersone41251e2008-04-25 01:59:09 +0000538 .. method:: get_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000539
Benjamin Petersone41251e2008-04-25 01:59:09 +0000540 Return an :class:`MH` instance representing the folder whose name is
541 *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder
542 does not exist.
Georg Brandl116aa622007-08-15 14:28:22 +0000543
544
Benjamin Petersone41251e2008-04-25 01:59:09 +0000545 .. method:: add_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000546
Benjamin Petersone41251e2008-04-25 01:59:09 +0000547 Create a folder whose name is *folder* and return an :class:`MH` instance
548 representing it.
Georg Brandl116aa622007-08-15 14:28:22 +0000549
550
Benjamin Petersone41251e2008-04-25 01:59:09 +0000551 .. method:: remove_folder(folder)
Georg Brandl116aa622007-08-15 14:28:22 +0000552
Benjamin Petersone41251e2008-04-25 01:59:09 +0000553 Delete the folder whose name is *folder*. If the folder contains any
554 messages, a :exc:`NotEmptyError` exception will be raised and the folder
555 will not be deleted.
Georg Brandl116aa622007-08-15 14:28:22 +0000556
557
Benjamin Petersone41251e2008-04-25 01:59:09 +0000558 .. method:: get_sequences()
Georg Brandl116aa622007-08-15 14:28:22 +0000559
Benjamin Petersone41251e2008-04-25 01:59:09 +0000560 Return a dictionary of sequence names mapped to key lists. If there are no
561 sequences, the empty dictionary is returned.
Georg Brandl116aa622007-08-15 14:28:22 +0000562
563
Benjamin Petersone41251e2008-04-25 01:59:09 +0000564 .. method:: set_sequences(sequences)
Georg Brandl116aa622007-08-15 14:28:22 +0000565
Benjamin Petersone41251e2008-04-25 01:59:09 +0000566 Re-define the sequences that exist in the mailbox based upon *sequences*,
567 a dictionary of names mapped to key lists, like returned by
568 :meth:`get_sequences`.
Georg Brandl116aa622007-08-15 14:28:22 +0000569
570
Benjamin Petersone41251e2008-04-25 01:59:09 +0000571 .. method:: pack()
Georg Brandl116aa622007-08-15 14:28:22 +0000572
Benjamin Petersone41251e2008-04-25 01:59:09 +0000573 Rename messages in the mailbox as necessary to eliminate gaps in
574 numbering. Entries in the sequences list are updated correspondingly.
Georg Brandl116aa622007-08-15 14:28:22 +0000575
Benjamin Petersone41251e2008-04-25 01:59:09 +0000576 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000577
Benjamin Petersone41251e2008-04-25 01:59:09 +0000578 Already-issued keys are invalidated by this operation and should not be
579 subsequently used.
Georg Brandl116aa622007-08-15 14:28:22 +0000580
Benjamin Petersone41251e2008-04-25 01:59:09 +0000581 Some :class:`Mailbox` methods implemented by :class:`MH` deserve special
582 remarks:
Georg Brandl116aa622007-08-15 14:28:22 +0000583
584
Benjamin Petersone41251e2008-04-25 01:59:09 +0000585 .. method:: remove(key)
586 __delitem__(key)
587 discard(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000588
Benjamin Petersone41251e2008-04-25 01:59:09 +0000589 These methods immediately delete the message. The MH convention of marking
590 a message for deletion by prepending a comma to its name is not used.
Georg Brandl116aa622007-08-15 14:28:22 +0000591
592
Benjamin Petersone41251e2008-04-25 01:59:09 +0000593 .. method:: lock()
594 unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000595
Benjamin Petersone41251e2008-04-25 01:59:09 +0000596 Three locking mechanisms are used---dot locking and, if available, the
Georg Brandl60203b42010-10-06 10:11:56 +0000597 :c:func:`flock` and :c:func:`lockf` system calls. For MH mailboxes, locking
Benjamin Petersone41251e2008-04-25 01:59:09 +0000598 the mailbox means locking the :file:`.mh_sequences` file and, only for the
599 duration of any operations that affect them, locking individual message
600 files.
Georg Brandl116aa622007-08-15 14:28:22 +0000601
602
Benjamin Petersone41251e2008-04-25 01:59:09 +0000603 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000604
Benjamin Petersone41251e2008-04-25 01:59:09 +0000605 Depending upon the host platform, it may not be possible to remove the
606 underlying message while the returned file remains open.
Georg Brandl116aa622007-08-15 14:28:22 +0000607
608
Benjamin Petersone41251e2008-04-25 01:59:09 +0000609 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +0000610
Benjamin Petersone41251e2008-04-25 01:59:09 +0000611 All changes to MH mailboxes are immediately applied, so this method does
612 nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000613
614
Benjamin Petersone41251e2008-04-25 01:59:09 +0000615 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +0000616
Benjamin Petersone41251e2008-04-25 01:59:09 +0000617 :class:`MH` instances do not keep any open files, so this method is
618 equivalent to :meth:`unlock`.
Georg Brandl116aa622007-08-15 14:28:22 +0000619
620
621.. seealso::
622
623 `nmh - Message Handling System <http://www.nongnu.org/nmh/>`_
624 Home page of :program:`nmh`, an updated version of the original :program:`mh`.
625
Sanyam Khurana338cd832018-01-20 05:55:37 +0530626 `MH & nmh: Email for Users & Programmers <https://rand-mh.sourceforge.io/book/>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000627 A GPL-licensed book on :program:`mh` and :program:`nmh`, with some information
628 on the mailbox format.
629
630
631.. _mailbox-babyl:
632
633:class:`Babyl`
634^^^^^^^^^^^^^^
635
636
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000637.. class:: Babyl(path, factory=None, create=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000638
639 A subclass of :class:`Mailbox` for mailboxes in Babyl format. Parameter
640 *factory* is a callable object that accepts a file-like message representation
641 (which behaves as if opened in binary mode) and returns a custom representation.
642 If *factory* is ``None``, :class:`BabylMessage` is used as the default message
643 representation. If *create* is ``True``, the mailbox is created if it does not
644 exist.
645
Benjamin Petersone41251e2008-04-25 01:59:09 +0000646 Babyl is a single-file mailbox format used by the Rmail mail user agent
647 included with Emacs. The beginning of a message is indicated by a line
648 containing the two characters Control-Underscore (``'\037'``) and Control-L
649 (``'\014'``). The end of a message is indicated by the start of the next
650 message or, in the case of the last message, a line containing a
651 Control-Underscore (``'\037'``) character.
Georg Brandl116aa622007-08-15 14:28:22 +0000652
Benjamin Petersone41251e2008-04-25 01:59:09 +0000653 Messages in a Babyl mailbox have two sets of headers, original headers and
654 so-called visible headers. Visible headers are typically a subset of the
655 original headers that have been reformatted or abridged to be more
656 attractive. Each message in a Babyl mailbox also has an accompanying list of
657 :dfn:`labels`, or short strings that record extra information about the
658 message, and a list of all user-defined labels found in the mailbox is kept
659 in the Babyl options section.
Georg Brandl116aa622007-08-15 14:28:22 +0000660
Benjamin Petersone41251e2008-04-25 01:59:09 +0000661 :class:`Babyl` instances have all of the methods of :class:`Mailbox` in
662 addition to the following:
Georg Brandl116aa622007-08-15 14:28:22 +0000663
664
Benjamin Petersone41251e2008-04-25 01:59:09 +0000665 .. method:: get_labels()
Georg Brandl116aa622007-08-15 14:28:22 +0000666
Benjamin Petersone41251e2008-04-25 01:59:09 +0000667 Return a list of the names of all user-defined labels used in the mailbox.
Georg Brandl116aa622007-08-15 14:28:22 +0000668
Benjamin Petersone41251e2008-04-25 01:59:09 +0000669 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000670
Benjamin Petersone41251e2008-04-25 01:59:09 +0000671 The actual messages are inspected to determine which labels exist in
672 the mailbox rather than consulting the list of labels in the Babyl
673 options section, but the Babyl section is updated whenever the mailbox
674 is modified.
Georg Brandl116aa622007-08-15 14:28:22 +0000675
Benjamin Petersone41251e2008-04-25 01:59:09 +0000676 Some :class:`Mailbox` methods implemented by :class:`Babyl` deserve special
677 remarks:
Georg Brandl116aa622007-08-15 14:28:22 +0000678
679
Benjamin Petersone41251e2008-04-25 01:59:09 +0000680 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000681
Benjamin Petersone41251e2008-04-25 01:59:09 +0000682 In Babyl mailboxes, the headers of a message are not stored contiguously
683 with the body of the message. To generate a file-like representation, the
Martin Panter7462b6492015-11-02 03:37:02 +0000684 headers and body are copied together into an :class:`io.BytesIO` instance,
Serhiy Storchakae79be872013-08-17 00:09:55 +0300685 which has an API identical to that of a
Benjamin Petersone41251e2008-04-25 01:59:09 +0000686 file. As a result, the file-like object is truly independent of the
687 underlying mailbox but does not save memory compared to a string
688 representation.
Georg Brandl116aa622007-08-15 14:28:22 +0000689
690
Benjamin Petersone41251e2008-04-25 01:59:09 +0000691 .. method:: lock()
692 unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000693
Benjamin Petersone41251e2008-04-25 01:59:09 +0000694 Three locking mechanisms are used---dot locking and, if available, the
Georg Brandl60203b42010-10-06 10:11:56 +0000695 :c:func:`flock` and :c:func:`lockf` system calls.
Georg Brandl116aa622007-08-15 14:28:22 +0000696
697
698.. seealso::
699
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300700 `Format of Version 5 Babyl Files <https://quimby.gnus.org/notes/BABYL>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000701 A specification of the Babyl format.
702
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300703 `Reading Mail with Rmail <https://www.gnu.org/software/emacs/manual/html_node/emacs/Rmail.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000704 The Rmail manual, with some information on Babyl semantics.
705
706
707.. _mailbox-mmdf:
708
709:class:`MMDF`
710^^^^^^^^^^^^^
711
712
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000713.. class:: MMDF(path, factory=None, create=True)
Georg Brandl116aa622007-08-15 14:28:22 +0000714
715 A subclass of :class:`Mailbox` for mailboxes in MMDF format. Parameter *factory*
716 is a callable object that accepts a file-like message representation (which
717 behaves as if opened in binary mode) and returns a custom representation. If
718 *factory* is ``None``, :class:`MMDFMessage` is used as the default message
719 representation. If *create* is ``True``, the mailbox is created if it does not
720 exist.
721
Benjamin Petersone41251e2008-04-25 01:59:09 +0000722 MMDF is a single-file mailbox format invented for the Multichannel Memorandum
723 Distribution Facility, a mail transfer agent. Each message is in the same
724 form as an mbox message but is bracketed before and after by lines containing
725 four Control-A (``'\001'``) characters. As with the mbox format, the
726 beginning of each message is indicated by a line whose first five characters
727 are "From ", but additional occurrences of "From " are not transformed to
728 ">From " when storing messages because the extra message separator lines
729 prevent mistaking such occurrences for the starts of subsequent messages.
Georg Brandl116aa622007-08-15 14:28:22 +0000730
Benjamin Petersone41251e2008-04-25 01:59:09 +0000731 Some :class:`Mailbox` methods implemented by :class:`MMDF` deserve special
732 remarks:
Georg Brandl116aa622007-08-15 14:28:22 +0000733
734
Benjamin Petersone41251e2008-04-25 01:59:09 +0000735 .. method:: get_file(key)
Georg Brandl116aa622007-08-15 14:28:22 +0000736
Benjamin Petersone41251e2008-04-25 01:59:09 +0000737 Using the file after calling :meth:`flush` or :meth:`close` on the
738 :class:`MMDF` instance may yield unpredictable results or raise an
739 exception.
Georg Brandl116aa622007-08-15 14:28:22 +0000740
741
Benjamin Petersone41251e2008-04-25 01:59:09 +0000742 .. method:: lock()
743 unlock()
Georg Brandl116aa622007-08-15 14:28:22 +0000744
Benjamin Petersone41251e2008-04-25 01:59:09 +0000745 Three locking mechanisms are used---dot locking and, if available, the
Georg Brandl60203b42010-10-06 10:11:56 +0000746 :c:func:`flock` and :c:func:`lockf` system calls.
Georg Brandl116aa622007-08-15 14:28:22 +0000747
748
749.. seealso::
750
751 `mmdf man page from tin <http://www.tin.org/bin/man.cgi?section=5&topic=mmdf>`_
752 A specification of MMDF format from the documentation of tin, a newsreader.
753
Georg Brandl5d941342016-02-26 19:37:12 +0100754 `MMDF <https://en.wikipedia.org/wiki/MMDF>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000755 A Wikipedia article describing the Multichannel Memorandum Distribution
756 Facility.
757
758
759.. _mailbox-message-objects:
760
761:class:`Message` objects
762------------------------
763
764
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000765.. class:: Message(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000766
R David Murrayc5fe4072012-09-28 15:09:31 -0400767 A subclass of the :mod:`email.message` module's
768 :class:`~email.message.Message`. Subclasses of :class:`mailbox.Message` add
769 mailbox-format-specific state and behavior.
Georg Brandl116aa622007-08-15 14:28:22 +0000770
771 If *message* is omitted, the new instance is created in a default, empty state.
R David Murrayc5fe4072012-09-28 15:09:31 -0400772 If *message* is an :class:`email.message.Message` instance, its contents are
Georg Brandl116aa622007-08-15 14:28:22 +0000773 copied; furthermore, any format-specific information is converted insofar as
R. David Murrayb7deff12011-01-30 06:21:28 +0000774 possible if *message* is a :class:`Message` instance. If *message* is a string,
775 a byte string,
Georg Brandl116aa622007-08-15 14:28:22 +0000776 or a file, it should contain an :rfc:`2822`\ -compliant message, which is read
R. David Murrayb7deff12011-01-30 06:21:28 +0000777 and parsed. Files should be open in binary mode, but text mode files
778 are accepted for backward compatibility.
Georg Brandl116aa622007-08-15 14:28:22 +0000779
Benjamin Petersone41251e2008-04-25 01:59:09 +0000780 The format-specific state and behaviors offered by subclasses vary, but in
781 general it is only the properties that are not specific to a particular
782 mailbox that are supported (although presumably the properties are specific
783 to a particular mailbox format). For example, file offsets for single-file
784 mailbox formats and file names for directory-based mailbox formats are not
785 retained, because they are only applicable to the original mailbox. But state
786 such as whether a message has been read by the user or marked as important is
787 retained, because it applies to the message itself.
Georg Brandl116aa622007-08-15 14:28:22 +0000788
Benjamin Petersone41251e2008-04-25 01:59:09 +0000789 There is no requirement that :class:`Message` instances be used to represent
790 messages retrieved using :class:`Mailbox` instances. In some situations, the
791 time and memory required to generate :class:`Message` representations might
Ezio Melottie130a522011-10-19 10:58:56 +0300792 not be acceptable. For such situations, :class:`Mailbox` instances also
Benjamin Petersone41251e2008-04-25 01:59:09 +0000793 offer string and file-like representations, and a custom message factory may
794 be specified when a :class:`Mailbox` instance is initialized.
Georg Brandl116aa622007-08-15 14:28:22 +0000795
796
797.. _mailbox-maildirmessage:
798
799:class:`MaildirMessage`
800^^^^^^^^^^^^^^^^^^^^^^^
801
802
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000803.. class:: MaildirMessage(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000804
805 A message with Maildir-specific behaviors. Parameter *message* has the same
806 meaning as with the :class:`Message` constructor.
807
Benjamin Petersone41251e2008-04-25 01:59:09 +0000808 Typically, a mail user agent application moves all of the messages in the
809 :file:`new` subdirectory to the :file:`cur` subdirectory after the first time
810 the user opens and closes the mailbox, recording that the messages are old
811 whether or not they've actually been read. Each message in :file:`cur` has an
812 "info" section added to its file name to store information about its state.
813 (Some mail readers may also add an "info" section to messages in
814 :file:`new`.) The "info" section may take one of two forms: it may contain
815 "2," followed by a list of standardized flags (e.g., "2,FR") or it may
816 contain "1," followed by so-called experimental information. Standard flags
817 for Maildir messages are as follows:
Georg Brandl116aa622007-08-15 14:28:22 +0000818
Benjamin Petersone41251e2008-04-25 01:59:09 +0000819 +------+---------+--------------------------------+
820 | Flag | Meaning | Explanation |
821 +======+=========+================================+
822 | D | Draft | Under composition |
823 +------+---------+--------------------------------+
824 | F | Flagged | Marked as important |
825 +------+---------+--------------------------------+
826 | P | Passed | Forwarded, resent, or bounced |
827 +------+---------+--------------------------------+
828 | R | Replied | Replied to |
829 +------+---------+--------------------------------+
830 | S | Seen | Read |
831 +------+---------+--------------------------------+
832 | T | Trashed | Marked for subsequent deletion |
833 +------+---------+--------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +0000834
Benjamin Petersone41251e2008-04-25 01:59:09 +0000835 :class:`MaildirMessage` instances offer the following methods:
Georg Brandl116aa622007-08-15 14:28:22 +0000836
837
Benjamin Petersone41251e2008-04-25 01:59:09 +0000838 .. method:: get_subdir()
Georg Brandl116aa622007-08-15 14:28:22 +0000839
Benjamin Petersone41251e2008-04-25 01:59:09 +0000840 Return either "new" (if the message should be stored in the :file:`new`
841 subdirectory) or "cur" (if the message should be stored in the :file:`cur`
842 subdirectory).
Georg Brandl116aa622007-08-15 14:28:22 +0000843
Benjamin Petersone41251e2008-04-25 01:59:09 +0000844 .. note::
Georg Brandl116aa622007-08-15 14:28:22 +0000845
Benjamin Petersone41251e2008-04-25 01:59:09 +0000846 A message is typically moved from :file:`new` to :file:`cur` after its
847 mailbox has been accessed, whether or not the message is has been
848 read. A message ``msg`` has been read if ``"S" in msg.get_flags()`` is
849 ``True``.
Georg Brandl116aa622007-08-15 14:28:22 +0000850
851
Benjamin Petersone41251e2008-04-25 01:59:09 +0000852 .. method:: set_subdir(subdir)
Georg Brandl116aa622007-08-15 14:28:22 +0000853
Benjamin Petersone41251e2008-04-25 01:59:09 +0000854 Set the subdirectory the message should be stored in. Parameter *subdir*
855 must be either "new" or "cur".
Georg Brandl116aa622007-08-15 14:28:22 +0000856
857
Benjamin Petersone41251e2008-04-25 01:59:09 +0000858 .. method:: get_flags()
Georg Brandl116aa622007-08-15 14:28:22 +0000859
Benjamin Petersone41251e2008-04-25 01:59:09 +0000860 Return a string specifying the flags that are currently set. If the
861 message complies with the standard Maildir format, the result is the
862 concatenation in alphabetical order of zero or one occurrence of each of
863 ``'D'``, ``'F'``, ``'P'``, ``'R'``, ``'S'``, and ``'T'``. The empty string
864 is returned if no flags are set or if "info" contains experimental
865 semantics.
Georg Brandl116aa622007-08-15 14:28:22 +0000866
867
Benjamin Petersone41251e2008-04-25 01:59:09 +0000868 .. method:: set_flags(flags)
Georg Brandl116aa622007-08-15 14:28:22 +0000869
Benjamin Petersone41251e2008-04-25 01:59:09 +0000870 Set the flags specified by *flags* and unset all others.
Georg Brandl116aa622007-08-15 14:28:22 +0000871
872
Benjamin Petersone41251e2008-04-25 01:59:09 +0000873 .. method:: add_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +0000874
Benjamin Petersone41251e2008-04-25 01:59:09 +0000875 Set the flag(s) specified by *flag* without changing other flags. To add
876 more than one flag at a time, *flag* may be a string of more than one
877 character. The current "info" is overwritten whether or not it contains
878 experimental information rather than flags.
Georg Brandl116aa622007-08-15 14:28:22 +0000879
880
Benjamin Petersone41251e2008-04-25 01:59:09 +0000881 .. method:: remove_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +0000882
Benjamin Petersone41251e2008-04-25 01:59:09 +0000883 Unset the flag(s) specified by *flag* without changing other flags. To
884 remove more than one flag at a time, *flag* maybe a string of more than
885 one character. If "info" contains experimental information rather than
886 flags, the current "info" is not modified.
Georg Brandl116aa622007-08-15 14:28:22 +0000887
888
Benjamin Petersone41251e2008-04-25 01:59:09 +0000889 .. method:: get_date()
Georg Brandl116aa622007-08-15 14:28:22 +0000890
Benjamin Petersone41251e2008-04-25 01:59:09 +0000891 Return the delivery date of the message as a floating-point number
892 representing seconds since the epoch.
Georg Brandl116aa622007-08-15 14:28:22 +0000893
894
Benjamin Petersone41251e2008-04-25 01:59:09 +0000895 .. method:: set_date(date)
Georg Brandl116aa622007-08-15 14:28:22 +0000896
Benjamin Petersone41251e2008-04-25 01:59:09 +0000897 Set the delivery date of the message to *date*, a floating-point number
898 representing seconds since the epoch.
Georg Brandl116aa622007-08-15 14:28:22 +0000899
900
Benjamin Petersone41251e2008-04-25 01:59:09 +0000901 .. method:: get_info()
Georg Brandl116aa622007-08-15 14:28:22 +0000902
Benjamin Petersone41251e2008-04-25 01:59:09 +0000903 Return a string containing the "info" for a message. This is useful for
904 accessing and modifying "info" that is experimental (i.e., not a list of
905 flags).
Georg Brandl116aa622007-08-15 14:28:22 +0000906
907
Benjamin Petersone41251e2008-04-25 01:59:09 +0000908 .. method:: set_info(info)
Georg Brandl116aa622007-08-15 14:28:22 +0000909
Benjamin Petersone41251e2008-04-25 01:59:09 +0000910 Set "info" to *info*, which should be a string.
Georg Brandl116aa622007-08-15 14:28:22 +0000911
912When a :class:`MaildirMessage` instance is created based upon an
913:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
914and :mailheader:`X-Status` headers are omitted and the following conversions
915take place:
916
917+--------------------+----------------------------------------------+
918| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` |
919| | state |
920+====================+==============================================+
921| "cur" subdirectory | O flag |
922+--------------------+----------------------------------------------+
923| F flag | F flag |
924+--------------------+----------------------------------------------+
925| R flag | A flag |
926+--------------------+----------------------------------------------+
927| S flag | R flag |
928+--------------------+----------------------------------------------+
929| T flag | D flag |
930+--------------------+----------------------------------------------+
931
932When a :class:`MaildirMessage` instance is created based upon an
933:class:`MHMessage` instance, the following conversions take place:
934
935+-------------------------------+--------------------------+
936| Resulting state | :class:`MHMessage` state |
937+===============================+==========================+
938| "cur" subdirectory | "unseen" sequence |
939+-------------------------------+--------------------------+
940| "cur" subdirectory and S flag | no "unseen" sequence |
941+-------------------------------+--------------------------+
942| F flag | "flagged" sequence |
943+-------------------------------+--------------------------+
944| R flag | "replied" sequence |
945+-------------------------------+--------------------------+
946
947When a :class:`MaildirMessage` instance is created based upon a
948:class:`BabylMessage` instance, the following conversions take place:
949
950+-------------------------------+-------------------------------+
951| Resulting state | :class:`BabylMessage` state |
952+===============================+===============================+
953| "cur" subdirectory | "unseen" label |
954+-------------------------------+-------------------------------+
955| "cur" subdirectory and S flag | no "unseen" label |
956+-------------------------------+-------------------------------+
957| P flag | "forwarded" or "resent" label |
958+-------------------------------+-------------------------------+
959| R flag | "answered" label |
960+-------------------------------+-------------------------------+
961| T flag | "deleted" label |
962+-------------------------------+-------------------------------+
963
964
965.. _mailbox-mboxmessage:
966
967:class:`mboxMessage`
968^^^^^^^^^^^^^^^^^^^^
969
970
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000971.. class:: mboxMessage(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000972
973 A message with mbox-specific behaviors. Parameter *message* has the same meaning
974 as with the :class:`Message` constructor.
975
Benjamin Petersone41251e2008-04-25 01:59:09 +0000976 Messages in an mbox mailbox are stored together in a single file. The
977 sender's envelope address and the time of delivery are typically stored in a
978 line beginning with "From " that is used to indicate the start of a message,
979 though there is considerable variation in the exact format of this data among
980 mbox implementations. Flags that indicate the state of the message, such as
981 whether it has been read or marked as important, are typically stored in
982 :mailheader:`Status` and :mailheader:`X-Status` headers.
Georg Brandl116aa622007-08-15 14:28:22 +0000983
Benjamin Petersone41251e2008-04-25 01:59:09 +0000984 Conventional flags for mbox messages are as follows:
Georg Brandl116aa622007-08-15 14:28:22 +0000985
Benjamin Petersone41251e2008-04-25 01:59:09 +0000986 +------+----------+--------------------------------+
987 | Flag | Meaning | Explanation |
988 +======+==========+================================+
989 | R | Read | Read |
990 +------+----------+--------------------------------+
991 | O | Old | Previously detected by MUA |
992 +------+----------+--------------------------------+
993 | D | Deleted | Marked for subsequent deletion |
994 +------+----------+--------------------------------+
995 | F | Flagged | Marked as important |
996 +------+----------+--------------------------------+
997 | A | Answered | Replied to |
998 +------+----------+--------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +0000999
Benjamin Petersone41251e2008-04-25 01:59:09 +00001000 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the
1001 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The
1002 flags and headers typically appear in the order mentioned.
Georg Brandl116aa622007-08-15 14:28:22 +00001003
Benjamin Petersone41251e2008-04-25 01:59:09 +00001004 :class:`mboxMessage` instances offer the following methods:
Georg Brandl116aa622007-08-15 14:28:22 +00001005
1006
Benjamin Petersone41251e2008-04-25 01:59:09 +00001007 .. method:: get_from()
Georg Brandl116aa622007-08-15 14:28:22 +00001008
Benjamin Petersone41251e2008-04-25 01:59:09 +00001009 Return a string representing the "From " line that marks the start of the
1010 message in an mbox mailbox. The leading "From " and the trailing newline
1011 are excluded.
Georg Brandl116aa622007-08-15 14:28:22 +00001012
1013
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001014 .. method:: set_from(from_, time_=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001015
Benjamin Petersone41251e2008-04-25 01:59:09 +00001016 Set the "From " line to *from_*, which should be specified without a
1017 leading "From " or trailing newline. For convenience, *time_* may be
1018 specified and will be formatted appropriately and appended to *from_*. If
Serhiy Storchakabfdcd432013-10-13 23:09:14 +03001019 *time_* is specified, it should be a :class:`time.struct_time` instance, a
Benjamin Petersone41251e2008-04-25 01:59:09 +00001020 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use
1021 :meth:`time.gmtime`).
Georg Brandl116aa622007-08-15 14:28:22 +00001022
1023
Benjamin Petersone41251e2008-04-25 01:59:09 +00001024 .. method:: get_flags()
Georg Brandl116aa622007-08-15 14:28:22 +00001025
Benjamin Petersone41251e2008-04-25 01:59:09 +00001026 Return a string specifying the flags that are currently set. If the
1027 message complies with the conventional format, the result is the
1028 concatenation in the following order of zero or one occurrence of each of
1029 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
Georg Brandl116aa622007-08-15 14:28:22 +00001030
1031
Benjamin Petersone41251e2008-04-25 01:59:09 +00001032 .. method:: set_flags(flags)
Georg Brandl116aa622007-08-15 14:28:22 +00001033
Benjamin Petersone41251e2008-04-25 01:59:09 +00001034 Set the flags specified by *flags* and unset all others. Parameter *flags*
1035 should be the concatenation in any order of zero or more occurrences of
1036 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
Georg Brandl116aa622007-08-15 14:28:22 +00001037
1038
Benjamin Petersone41251e2008-04-25 01:59:09 +00001039 .. method:: add_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +00001040
Benjamin Petersone41251e2008-04-25 01:59:09 +00001041 Set the flag(s) specified by *flag* without changing other flags. To add
1042 more than one flag at a time, *flag* may be a string of more than one
1043 character.
Georg Brandl116aa622007-08-15 14:28:22 +00001044
1045
Benjamin Petersone41251e2008-04-25 01:59:09 +00001046 .. method:: remove_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +00001047
Benjamin Petersone41251e2008-04-25 01:59:09 +00001048 Unset the flag(s) specified by *flag* without changing other flags. To
1049 remove more than one flag at a time, *flag* maybe a string of more than
1050 one character.
Georg Brandl116aa622007-08-15 14:28:22 +00001051
1052When an :class:`mboxMessage` instance is created based upon a
1053:class:`MaildirMessage` instance, a "From " line is generated based upon the
1054:class:`MaildirMessage` instance's delivery date, and the following conversions
1055take place:
1056
1057+-----------------+-------------------------------+
1058| Resulting state | :class:`MaildirMessage` state |
1059+=================+===============================+
1060| R flag | S flag |
1061+-----------------+-------------------------------+
1062| O flag | "cur" subdirectory |
1063+-----------------+-------------------------------+
1064| D flag | T flag |
1065+-----------------+-------------------------------+
1066| F flag | F flag |
1067+-----------------+-------------------------------+
1068| A flag | R flag |
1069+-----------------+-------------------------------+
1070
1071When an :class:`mboxMessage` instance is created based upon an
1072:class:`MHMessage` instance, the following conversions take place:
1073
1074+-------------------+--------------------------+
1075| Resulting state | :class:`MHMessage` state |
1076+===================+==========================+
1077| R flag and O flag | no "unseen" sequence |
1078+-------------------+--------------------------+
1079| O flag | "unseen" sequence |
1080+-------------------+--------------------------+
1081| F flag | "flagged" sequence |
1082+-------------------+--------------------------+
1083| A flag | "replied" sequence |
1084+-------------------+--------------------------+
1085
1086When an :class:`mboxMessage` instance is created based upon a
1087:class:`BabylMessage` instance, the following conversions take place:
1088
1089+-------------------+-----------------------------+
1090| Resulting state | :class:`BabylMessage` state |
1091+===================+=============================+
1092| R flag and O flag | no "unseen" label |
1093+-------------------+-----------------------------+
1094| O flag | "unseen" label |
1095+-------------------+-----------------------------+
1096| D flag | "deleted" label |
1097+-------------------+-----------------------------+
1098| A flag | "answered" label |
1099+-------------------+-----------------------------+
1100
1101When a :class:`Message` instance is created based upon an :class:`MMDFMessage`
1102instance, the "From " line is copied and all flags directly correspond:
1103
1104+-----------------+----------------------------+
1105| Resulting state | :class:`MMDFMessage` state |
1106+=================+============================+
1107| R flag | R flag |
1108+-----------------+----------------------------+
1109| O flag | O flag |
1110+-----------------+----------------------------+
1111| D flag | D flag |
1112+-----------------+----------------------------+
1113| F flag | F flag |
1114+-----------------+----------------------------+
1115| A flag | A flag |
1116+-----------------+----------------------------+
1117
1118
1119.. _mailbox-mhmessage:
1120
1121:class:`MHMessage`
1122^^^^^^^^^^^^^^^^^^
1123
1124
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001125.. class:: MHMessage(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001126
1127 A message with MH-specific behaviors. Parameter *message* has the same meaning
1128 as with the :class:`Message` constructor.
1129
Benjamin Petersone41251e2008-04-25 01:59:09 +00001130 MH messages do not support marks or flags in the traditional sense, but they
1131 do support sequences, which are logical groupings of arbitrary messages. Some
1132 mail reading programs (although not the standard :program:`mh` and
1133 :program:`nmh`) use sequences in much the same way flags are used with other
1134 formats, as follows:
Georg Brandl116aa622007-08-15 14:28:22 +00001135
Benjamin Petersone41251e2008-04-25 01:59:09 +00001136 +----------+------------------------------------------+
1137 | Sequence | Explanation |
1138 +==========+==========================================+
1139 | unseen | Not read, but previously detected by MUA |
1140 +----------+------------------------------------------+
1141 | replied | Replied to |
1142 +----------+------------------------------------------+
1143 | flagged | Marked as important |
1144 +----------+------------------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00001145
Benjamin Petersone41251e2008-04-25 01:59:09 +00001146 :class:`MHMessage` instances offer the following methods:
Georg Brandl116aa622007-08-15 14:28:22 +00001147
1148
Benjamin Petersone41251e2008-04-25 01:59:09 +00001149 .. method:: get_sequences()
Georg Brandl116aa622007-08-15 14:28:22 +00001150
Benjamin Petersone41251e2008-04-25 01:59:09 +00001151 Return a list of the names of sequences that include this message.
Georg Brandl116aa622007-08-15 14:28:22 +00001152
1153
Benjamin Petersone41251e2008-04-25 01:59:09 +00001154 .. method:: set_sequences(sequences)
Georg Brandl116aa622007-08-15 14:28:22 +00001155
Benjamin Petersone41251e2008-04-25 01:59:09 +00001156 Set the list of sequences that include this message.
Georg Brandl116aa622007-08-15 14:28:22 +00001157
1158
Benjamin Petersone41251e2008-04-25 01:59:09 +00001159 .. method:: add_sequence(sequence)
Georg Brandl116aa622007-08-15 14:28:22 +00001160
Benjamin Petersone41251e2008-04-25 01:59:09 +00001161 Add *sequence* to the list of sequences that include this message.
Georg Brandl116aa622007-08-15 14:28:22 +00001162
1163
Benjamin Petersone41251e2008-04-25 01:59:09 +00001164 .. method:: remove_sequence(sequence)
Georg Brandl116aa622007-08-15 14:28:22 +00001165
Benjamin Petersone41251e2008-04-25 01:59:09 +00001166 Remove *sequence* from the list of sequences that include this message.
Georg Brandl116aa622007-08-15 14:28:22 +00001167
1168When an :class:`MHMessage` instance is created based upon a
1169:class:`MaildirMessage` instance, the following conversions take place:
1170
1171+--------------------+-------------------------------+
1172| Resulting state | :class:`MaildirMessage` state |
1173+====================+===============================+
1174| "unseen" sequence | no S flag |
1175+--------------------+-------------------------------+
1176| "replied" sequence | R flag |
1177+--------------------+-------------------------------+
1178| "flagged" sequence | F flag |
1179+--------------------+-------------------------------+
1180
1181When an :class:`MHMessage` instance is created based upon an
1182:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
1183and :mailheader:`X-Status` headers are omitted and the following conversions
1184take place:
1185
1186+--------------------+----------------------------------------------+
1187| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` |
1188| | state |
1189+====================+==============================================+
1190| "unseen" sequence | no R flag |
1191+--------------------+----------------------------------------------+
1192| "replied" sequence | A flag |
1193+--------------------+----------------------------------------------+
1194| "flagged" sequence | F flag |
1195+--------------------+----------------------------------------------+
1196
1197When an :class:`MHMessage` instance is created based upon a
1198:class:`BabylMessage` instance, the following conversions take place:
1199
1200+--------------------+-----------------------------+
1201| Resulting state | :class:`BabylMessage` state |
1202+====================+=============================+
1203| "unseen" sequence | "unseen" label |
1204+--------------------+-----------------------------+
1205| "replied" sequence | "answered" label |
1206+--------------------+-----------------------------+
1207
1208
1209.. _mailbox-babylmessage:
1210
1211:class:`BabylMessage`
1212^^^^^^^^^^^^^^^^^^^^^
1213
1214
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001215.. class:: BabylMessage(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001216
1217 A message with Babyl-specific behaviors. Parameter *message* has the same
1218 meaning as with the :class:`Message` constructor.
1219
Benjamin Petersone41251e2008-04-25 01:59:09 +00001220 Certain message labels, called :dfn:`attributes`, are defined by convention
1221 to have special meanings. The attributes are as follows:
Georg Brandl116aa622007-08-15 14:28:22 +00001222
Benjamin Petersone41251e2008-04-25 01:59:09 +00001223 +-----------+------------------------------------------+
1224 | Label | Explanation |
1225 +===========+==========================================+
1226 | unseen | Not read, but previously detected by MUA |
1227 +-----------+------------------------------------------+
1228 | deleted | Marked for subsequent deletion |
1229 +-----------+------------------------------------------+
1230 | filed | Copied to another file or mailbox |
1231 +-----------+------------------------------------------+
1232 | answered | Replied to |
1233 +-----------+------------------------------------------+
1234 | forwarded | Forwarded |
1235 +-----------+------------------------------------------+
1236 | edited | Modified by the user |
1237 +-----------+------------------------------------------+
1238 | resent | Resent |
1239 +-----------+------------------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00001240
Benjamin Petersone41251e2008-04-25 01:59:09 +00001241 By default, Rmail displays only visible headers. The :class:`BabylMessage`
1242 class, though, uses the original headers because they are more
1243 complete. Visible headers may be accessed explicitly if desired.
Georg Brandl116aa622007-08-15 14:28:22 +00001244
Benjamin Petersone41251e2008-04-25 01:59:09 +00001245 :class:`BabylMessage` instances offer the following methods:
Georg Brandl116aa622007-08-15 14:28:22 +00001246
1247
Benjamin Petersone41251e2008-04-25 01:59:09 +00001248 .. method:: get_labels()
Georg Brandl116aa622007-08-15 14:28:22 +00001249
Benjamin Petersone41251e2008-04-25 01:59:09 +00001250 Return a list of labels on the message.
Georg Brandl116aa622007-08-15 14:28:22 +00001251
1252
Benjamin Petersone41251e2008-04-25 01:59:09 +00001253 .. method:: set_labels(labels)
Georg Brandl116aa622007-08-15 14:28:22 +00001254
Benjamin Petersone41251e2008-04-25 01:59:09 +00001255 Set the list of labels on the message to *labels*.
Georg Brandl116aa622007-08-15 14:28:22 +00001256
1257
Benjamin Petersone41251e2008-04-25 01:59:09 +00001258 .. method:: add_label(label)
Georg Brandl116aa622007-08-15 14:28:22 +00001259
Benjamin Petersone41251e2008-04-25 01:59:09 +00001260 Add *label* to the list of labels on the message.
Georg Brandl116aa622007-08-15 14:28:22 +00001261
1262
Benjamin Petersone41251e2008-04-25 01:59:09 +00001263 .. method:: remove_label(label)
Georg Brandl116aa622007-08-15 14:28:22 +00001264
Benjamin Petersone41251e2008-04-25 01:59:09 +00001265 Remove *label* from the list of labels on the message.
Georg Brandl116aa622007-08-15 14:28:22 +00001266
1267
Benjamin Petersone41251e2008-04-25 01:59:09 +00001268 .. method:: get_visible()
Georg Brandl116aa622007-08-15 14:28:22 +00001269
Benjamin Petersone41251e2008-04-25 01:59:09 +00001270 Return an :class:`Message` instance whose headers are the message's
1271 visible headers and whose body is empty.
Georg Brandl116aa622007-08-15 14:28:22 +00001272
1273
Benjamin Petersone41251e2008-04-25 01:59:09 +00001274 .. method:: set_visible(visible)
Georg Brandl116aa622007-08-15 14:28:22 +00001275
Benjamin Petersone41251e2008-04-25 01:59:09 +00001276 Set the message's visible headers to be the same as the headers in
1277 *message*. Parameter *visible* should be a :class:`Message` instance, an
R David Murray53202502012-09-28 15:19:16 -04001278 :class:`email.message.Message` instance, a string, or a file-like object
Benjamin Petersone41251e2008-04-25 01:59:09 +00001279 (which should be open in text mode).
Georg Brandl116aa622007-08-15 14:28:22 +00001280
1281
Benjamin Petersone41251e2008-04-25 01:59:09 +00001282 .. method:: update_visible()
Georg Brandl116aa622007-08-15 14:28:22 +00001283
Benjamin Petersone41251e2008-04-25 01:59:09 +00001284 When a :class:`BabylMessage` instance's original headers are modified, the
1285 visible headers are not automatically modified to correspond. This method
1286 updates the visible headers as follows: each visible header with a
1287 corresponding original header is set to the value of the original header,
1288 each visible header without a corresponding original header is removed,
1289 and any of :mailheader:`Date`, :mailheader:`From`, :mailheader:`Reply-To`,
1290 :mailheader:`To`, :mailheader:`CC`, and :mailheader:`Subject` that are
1291 present in the original headers but not the visible headers are added to
1292 the visible headers.
Georg Brandl116aa622007-08-15 14:28:22 +00001293
1294When a :class:`BabylMessage` instance is created based upon a
1295:class:`MaildirMessage` instance, the following conversions take place:
1296
1297+-------------------+-------------------------------+
1298| Resulting state | :class:`MaildirMessage` state |
1299+===================+===============================+
1300| "unseen" label | no S flag |
1301+-------------------+-------------------------------+
1302| "deleted" label | T flag |
1303+-------------------+-------------------------------+
1304| "answered" label | R flag |
1305+-------------------+-------------------------------+
1306| "forwarded" label | P flag |
1307+-------------------+-------------------------------+
1308
1309When a :class:`BabylMessage` instance is created based upon an
1310:class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status`
1311and :mailheader:`X-Status` headers are omitted and the following conversions
1312take place:
1313
1314+------------------+----------------------------------------------+
1315| Resulting state | :class:`mboxMessage` or :class:`MMDFMessage` |
1316| | state |
1317+==================+==============================================+
1318| "unseen" label | no R flag |
1319+------------------+----------------------------------------------+
1320| "deleted" label | D flag |
1321+------------------+----------------------------------------------+
1322| "answered" label | A flag |
1323+------------------+----------------------------------------------+
1324
1325When a :class:`BabylMessage` instance is created based upon an
1326:class:`MHMessage` instance, the following conversions take place:
1327
1328+------------------+--------------------------+
1329| Resulting state | :class:`MHMessage` state |
1330+==================+==========================+
1331| "unseen" label | "unseen" sequence |
1332+------------------+--------------------------+
1333| "answered" label | "replied" sequence |
1334+------------------+--------------------------+
1335
1336
1337.. _mailbox-mmdfmessage:
1338
1339:class:`MMDFMessage`
1340^^^^^^^^^^^^^^^^^^^^
1341
1342
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001343.. class:: MMDFMessage(message=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001344
1345 A message with MMDF-specific behaviors. Parameter *message* has the same meaning
1346 as with the :class:`Message` constructor.
1347
Benjamin Petersone41251e2008-04-25 01:59:09 +00001348 As with message in an mbox mailbox, MMDF messages are stored with the
1349 sender's address and the delivery date in an initial line beginning with
1350 "From ". Likewise, flags that indicate the state of the message are
1351 typically stored in :mailheader:`Status` and :mailheader:`X-Status` headers.
Georg Brandl116aa622007-08-15 14:28:22 +00001352
Benjamin Petersone41251e2008-04-25 01:59:09 +00001353 Conventional flags for MMDF messages are identical to those of mbox message
1354 and are as follows:
Georg Brandl116aa622007-08-15 14:28:22 +00001355
Benjamin Petersone41251e2008-04-25 01:59:09 +00001356 +------+----------+--------------------------------+
1357 | Flag | Meaning | Explanation |
1358 +======+==========+================================+
1359 | R | Read | Read |
1360 +------+----------+--------------------------------+
1361 | O | Old | Previously detected by MUA |
1362 +------+----------+--------------------------------+
1363 | D | Deleted | Marked for subsequent deletion |
1364 +------+----------+--------------------------------+
1365 | F | Flagged | Marked as important |
1366 +------+----------+--------------------------------+
1367 | A | Answered | Replied to |
1368 +------+----------+--------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00001369
Benjamin Petersone41251e2008-04-25 01:59:09 +00001370 The "R" and "O" flags are stored in the :mailheader:`Status` header, and the
1371 "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The
1372 flags and headers typically appear in the order mentioned.
Georg Brandl116aa622007-08-15 14:28:22 +00001373
Benjamin Petersone41251e2008-04-25 01:59:09 +00001374 :class:`MMDFMessage` instances offer the following methods, which are
1375 identical to those offered by :class:`mboxMessage`:
Georg Brandl116aa622007-08-15 14:28:22 +00001376
1377
Benjamin Petersone41251e2008-04-25 01:59:09 +00001378 .. method:: get_from()
Georg Brandl116aa622007-08-15 14:28:22 +00001379
Benjamin Petersone41251e2008-04-25 01:59:09 +00001380 Return a string representing the "From " line that marks the start of the
1381 message in an mbox mailbox. The leading "From " and the trailing newline
1382 are excluded.
Georg Brandl116aa622007-08-15 14:28:22 +00001383
1384
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001385 .. method:: set_from(from_, time_=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001386
Benjamin Petersone41251e2008-04-25 01:59:09 +00001387 Set the "From " line to *from_*, which should be specified without a
1388 leading "From " or trailing newline. For convenience, *time_* may be
1389 specified and will be formatted appropriately and appended to *from_*. If
Serhiy Storchakabfdcd432013-10-13 23:09:14 +03001390 *time_* is specified, it should be a :class:`time.struct_time` instance, a
Benjamin Petersone41251e2008-04-25 01:59:09 +00001391 tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use
1392 :meth:`time.gmtime`).
Georg Brandl116aa622007-08-15 14:28:22 +00001393
1394
Benjamin Petersone41251e2008-04-25 01:59:09 +00001395 .. method:: get_flags()
Georg Brandl116aa622007-08-15 14:28:22 +00001396
Benjamin Petersone41251e2008-04-25 01:59:09 +00001397 Return a string specifying the flags that are currently set. If the
1398 message complies with the conventional format, the result is the
1399 concatenation in the following order of zero or one occurrence of each of
1400 ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
Georg Brandl116aa622007-08-15 14:28:22 +00001401
1402
Benjamin Petersone41251e2008-04-25 01:59:09 +00001403 .. method:: set_flags(flags)
Georg Brandl116aa622007-08-15 14:28:22 +00001404
Benjamin Petersone41251e2008-04-25 01:59:09 +00001405 Set the flags specified by *flags* and unset all others. Parameter *flags*
1406 should be the concatenation in any order of zero or more occurrences of
1407 each of ``'R'``, ``'O'``, ``'D'``, ``'F'``, and ``'A'``.
Georg Brandl116aa622007-08-15 14:28:22 +00001408
1409
Benjamin Petersone41251e2008-04-25 01:59:09 +00001410 .. method:: add_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +00001411
Benjamin Petersone41251e2008-04-25 01:59:09 +00001412 Set the flag(s) specified by *flag* without changing other flags. To add
1413 more than one flag at a time, *flag* may be a string of more than one
1414 character.
Georg Brandl116aa622007-08-15 14:28:22 +00001415
1416
Benjamin Petersone41251e2008-04-25 01:59:09 +00001417 .. method:: remove_flag(flag)
Georg Brandl116aa622007-08-15 14:28:22 +00001418
Benjamin Petersone41251e2008-04-25 01:59:09 +00001419 Unset the flag(s) specified by *flag* without changing other flags. To
1420 remove more than one flag at a time, *flag* maybe a string of more than
1421 one character.
Georg Brandl116aa622007-08-15 14:28:22 +00001422
1423When an :class:`MMDFMessage` instance is created based upon a
1424:class:`MaildirMessage` instance, a "From " line is generated based upon the
1425:class:`MaildirMessage` instance's delivery date, and the following conversions
1426take place:
1427
1428+-----------------+-------------------------------+
1429| Resulting state | :class:`MaildirMessage` state |
1430+=================+===============================+
1431| R flag | S flag |
1432+-----------------+-------------------------------+
1433| O flag | "cur" subdirectory |
1434+-----------------+-------------------------------+
1435| D flag | T flag |
1436+-----------------+-------------------------------+
1437| F flag | F flag |
1438+-----------------+-------------------------------+
1439| A flag | R flag |
1440+-----------------+-------------------------------+
1441
1442When an :class:`MMDFMessage` instance is created based upon an
1443:class:`MHMessage` instance, the following conversions take place:
1444
1445+-------------------+--------------------------+
1446| Resulting state | :class:`MHMessage` state |
1447+===================+==========================+
1448| R flag and O flag | no "unseen" sequence |
1449+-------------------+--------------------------+
1450| O flag | "unseen" sequence |
1451+-------------------+--------------------------+
1452| F flag | "flagged" sequence |
1453+-------------------+--------------------------+
1454| A flag | "replied" sequence |
1455+-------------------+--------------------------+
1456
1457When an :class:`MMDFMessage` instance is created based upon a
1458:class:`BabylMessage` instance, the following conversions take place:
1459
1460+-------------------+-----------------------------+
1461| Resulting state | :class:`BabylMessage` state |
1462+===================+=============================+
1463| R flag and O flag | no "unseen" label |
1464+-------------------+-----------------------------+
1465| O flag | "unseen" label |
1466+-------------------+-----------------------------+
1467| D flag | "deleted" label |
1468+-------------------+-----------------------------+
1469| A flag | "answered" label |
1470+-------------------+-----------------------------+
1471
1472When an :class:`MMDFMessage` instance is created based upon an
1473:class:`mboxMessage` instance, the "From " line is copied and all flags directly
1474correspond:
1475
1476+-----------------+----------------------------+
1477| Resulting state | :class:`mboxMessage` state |
1478+=================+============================+
1479| R flag | R flag |
1480+-----------------+----------------------------+
1481| O flag | O flag |
1482+-----------------+----------------------------+
1483| D flag | D flag |
1484+-----------------+----------------------------+
1485| F flag | F flag |
1486+-----------------+----------------------------+
1487| A flag | A flag |
1488+-----------------+----------------------------+
1489
1490
1491Exceptions
1492----------
1493
1494The following exception classes are defined in the :mod:`mailbox` module:
1495
1496
Benjamin Petersone41251e2008-04-25 01:59:09 +00001497.. exception:: Error()
Georg Brandl116aa622007-08-15 14:28:22 +00001498
1499 The based class for all other module-specific exceptions.
1500
1501
Benjamin Petersone41251e2008-04-25 01:59:09 +00001502.. exception:: NoSuchMailboxError()
Georg Brandl116aa622007-08-15 14:28:22 +00001503
1504 Raised when a mailbox is expected but is not found, such as when instantiating a
1505 :class:`Mailbox` subclass with a path that does not exist (and with the *create*
1506 parameter set to ``False``), or when opening a folder that does not exist.
1507
1508
Georg Brandl734e2682008-08-12 08:18:18 +00001509.. exception:: NotEmptyError()
Georg Brandl116aa622007-08-15 14:28:22 +00001510
1511 Raised when a mailbox is not empty but is expected to be, such as when deleting
1512 a folder that contains messages.
1513
1514
Benjamin Petersone41251e2008-04-25 01:59:09 +00001515.. exception:: ExternalClashError()
Georg Brandl116aa622007-08-15 14:28:22 +00001516
1517 Raised when some mailbox-related condition beyond the control of the program
1518 causes it to be unable to proceed, such as when failing to acquire a lock that
1519 another program already holds a lock, or when a uniquely-generated file name
1520 already exists.
1521
1522
Benjamin Petersone41251e2008-04-25 01:59:09 +00001523.. exception:: FormatError()
Georg Brandl116aa622007-08-15 14:28:22 +00001524
1525 Raised when the data in a file cannot be parsed, such as when an :class:`MH`
1526 instance attempts to read a corrupted :file:`.mh_sequences` file.
1527
1528
Georg Brandl116aa622007-08-15 14:28:22 +00001529.. _mailbox-examples:
1530
1531Examples
1532--------
1533
1534A simple example of printing the subjects of all messages in a mailbox that seem
1535interesting::
1536
1537 import mailbox
1538 for message in mailbox.mbox('~/mbox'):
1539 subject = message['subject'] # Could possibly be None.
1540 if subject and 'python' in subject.lower():
Georg Brandl6911e3c2007-09-04 07:15:32 +00001541 print(subject)
Georg Brandl116aa622007-08-15 14:28:22 +00001542
1543To copy all mail from a Babyl mailbox to an MH mailbox, converting all of the
1544format-specific information that can be converted::
1545
1546 import mailbox
1547 destination = mailbox.MH('~/Mail')
1548 destination.lock()
1549 for message in mailbox.Babyl('~/RMAIL'):
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001550 destination.add(mailbox.MHMessage(message))
Georg Brandl116aa622007-08-15 14:28:22 +00001551 destination.flush()
1552 destination.unlock()
1553
1554This example sorts mail from several mailing lists into different mailboxes,
1555being careful to avoid mail corruption due to concurrent modification by other
1556programs, mail loss due to interruption of the program, or premature termination
1557due to malformed messages in the mailbox::
1558
1559 import mailbox
Ezio Melotti956040a2013-12-14 12:42:29 +02001560 import email.errors
Georg Brandl116aa622007-08-15 14:28:22 +00001561
1562 list_names = ('python-list', 'python-dev', 'python-bugs')
1563
Georg Brandlf6945182008-02-01 11:56:49 +00001564 boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
Georg Brandl116aa622007-08-15 14:28:22 +00001565 inbox = mailbox.Maildir('~/Maildir', factory=None)
1566
1567 for key in inbox.iterkeys():
1568 try:
1569 message = inbox[key]
Ezio Melotti956040a2013-12-14 12:42:29 +02001570 except email.errors.MessageParseError:
Georg Brandl116aa622007-08-15 14:28:22 +00001571 continue # The message is malformed. Just leave it.
1572
1573 for name in list_names:
1574 list_id = message['list-id']
1575 if list_id and name in list_id:
1576 # Get mailbox to use
1577 box = boxes[name]
1578
1579 # Write copy to disk before removing original.
1580 # If there's a crash, you might duplicate a message, but
1581 # that's better than losing a message completely.
1582 box.lock()
1583 box.add(message)
Georg Brandl48310cd2009-01-03 21:18:54 +00001584 box.flush()
Georg Brandl116aa622007-08-15 14:28:22 +00001585 box.unlock()
1586
1587 # Remove original message
1588 inbox.lock()
1589 inbox.discard(key)
1590 inbox.flush()
1591 inbox.unlock()
1592 break # Found destination, so stop looking.
1593
1594 for box in boxes.itervalues():
1595 box.close()
1596