blob: 3cbb45c9de036f2ff73ee566f10b27a2d137a405 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`imaplib` --- IMAP4 protocol client
2========================================
3
4.. module:: imaplib
5 :synopsis: IMAP4 protocol client (requires sockets).
6.. moduleauthor:: Piers Lauder <piers@communitysolutions.com.au>
7.. sectionauthor:: Piers Lauder <piers@communitysolutions.com.au>
Christian Heimes5b5e81c2007-12-31 16:14:33 +00008.. revised by ESR, January 2000
9.. changes for IMAP4_SSL by Tino Lange <Tino.Lange@isg.de>, March 2002
10.. changes for IMAP4_stream by Piers Lauder <piers@communitysolutions.com.au>,
11 November 2002
Georg Brandl116aa622007-08-15 14:28:22 +000012
13
14.. index::
15 pair: IMAP4; protocol
16 pair: IMAP4_SSL; protocol
17 pair: IMAP4_stream; protocol
18
Georg Brandl116aa622007-08-15 14:28:22 +000019This module defines three classes, :class:`IMAP4`, :class:`IMAP4_SSL` and
20:class:`IMAP4_stream`, which encapsulate a connection to an IMAP4 server and
21implement a large subset of the IMAP4rev1 client protocol as defined in
22:rfc:`2060`. It is backward compatible with IMAP4 (:rfc:`1730`) servers, but
23note that the ``STATUS`` command is not supported in IMAP4.
24
25Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the
26base class:
27
28
29.. class:: IMAP4([host[, port]])
30
31 This class implements the actual IMAP4 protocol. The connection is created and
32 protocol version (IMAP4 or IMAP4rev1) is determined when the instance is
33 initialized. If *host* is not specified, ``''`` (the local host) is used. If
34 *port* is omitted, the standard IMAP4 port (143) is used.
35
36Three exceptions are defined as attributes of the :class:`IMAP4` class:
37
38
39.. exception:: IMAP4.error
40
41 Exception raised on any errors. The reason for the exception is passed to the
42 constructor as a string.
43
44
45.. exception:: IMAP4.abort
46
47 IMAP4 server errors cause this exception to be raised. This is a sub-class of
48 :exc:`IMAP4.error`. Note that closing the instance and instantiating a new one
49 will usually allow recovery from this exception.
50
51
52.. exception:: IMAP4.readonly
53
54 This exception is raised when a writable mailbox has its status changed by the
55 server. This is a sub-class of :exc:`IMAP4.error`. Some other client now has
56 write permission, and the mailbox will need to be re-opened to re-obtain write
57 permission.
58
59There's also a subclass for secure connections:
60
61
62.. class:: IMAP4_SSL([host[, port[, keyfile[, certfile]]]])
63
64 This is a subclass derived from :class:`IMAP4` that connects over an SSL
65 encrypted socket (to use this class you need a socket module that was compiled
66 with SSL support). If *host* is not specified, ``''`` (the local host) is used.
67 If *port* is omitted, the standard IMAP4-over-SSL port (993) is used. *keyfile*
68 and *certfile* are also optional - they can contain a PEM formatted private key
69 and certificate chain file for the SSL connection.
70
71The second subclass allows for connections created by a child process:
72
73
74.. class:: IMAP4_stream(command)
75
76 This is a subclass derived from :class:`IMAP4` that connects to the
77 ``stdin/stdout`` file descriptors created by passing *command* to
Christian Heimesfb5faf02008-11-05 19:39:50 +000078 ``subprocess.Popen()``.
Georg Brandl116aa622007-08-15 14:28:22 +000079
Georg Brandl116aa622007-08-15 14:28:22 +000080
81The following utility functions are defined:
82
83
84.. function:: Internaldate2tuple(datestr)
85
86 Converts an IMAP4 INTERNALDATE string to Coordinated Universal Time. Returns a
87 :mod:`time` module tuple.
88
89
90.. function:: Int2AP(num)
91
92 Converts an integer into a string representation using characters from the set
93 [``A`` .. ``P``].
94
95
96.. function:: ParseFlags(flagstr)
97
98 Converts an IMAP4 ``FLAGS`` response to a tuple of individual flags.
99
100
101.. function:: Time2Internaldate(date_time)
102
103 Converts a :mod:`time` module tuple to an IMAP4 ``INTERNALDATE`` representation.
104 Returns a string in the form: ``"DD-Mmm-YYYY HH:MM:SS +HHMM"`` (including
105 double-quotes).
106
107Note that IMAP4 message numbers change as the mailbox changes; in particular,
108after an ``EXPUNGE`` command performs deletions the remaining messages are
109renumbered. So it is highly advisable to use UIDs instead, with the UID command.
110
111At the end of the module, there is a test section that contains a more extensive
112example of usage.
113
114
115.. seealso::
116
117 Documents describing the protocol, and sources and binaries for servers
118 implementing it, can all be found at the University of Washington's *IMAP
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000119 Information Center* (http://www.washington.edu/imap/).
Georg Brandl116aa622007-08-15 14:28:22 +0000120
121
122.. _imap4-objects:
123
124IMAP4 Objects
125-------------
126
127All IMAP4rev1 commands are represented by methods of the same name, either
128upper-case or lower-case.
129
130All arguments to commands are converted to strings, except for ``AUTHENTICATE``,
131and the last argument to ``APPEND`` which is passed as an IMAP4 literal. If
132necessary (the string contains IMAP4 protocol-sensitive characters and isn't
133enclosed with either parentheses or double quotes) each string is quoted.
134However, the *password* argument to the ``LOGIN`` command is always quoted. If
135you want to avoid having an argument string quoted (eg: the *flags* argument to
136``STORE``) then enclose the string in parentheses (eg: ``r'(\Deleted)'``).
137
138Each command returns a tuple: ``(type, [data, ...])`` where *type* is usually
139``'OK'`` or ``'NO'``, and *data* is either the text from the command response,
140or mandated results from the command. Each *data* is either a string, or a
141tuple. If a tuple, then the first part is the header of the response, and the
142second part contains the data (ie: 'literal' value).
143
144The *message_set* options to commands below is a string specifying one or more
145messages to be acted upon. It may be a simple message number (``'1'``), a range
146of message numbers (``'2:4'``), or a group of non-contiguous ranges separated by
147commas (``'1:3,6:9'``). A range can contain an asterisk to indicate an infinite
148upper bound (``'3:*'``).
149
150An :class:`IMAP4` instance has the following methods:
151
152
153.. method:: IMAP4.append(mailbox, flags, date_time, message)
154
155 Append *message* to named mailbox.
156
157
158.. method:: IMAP4.authenticate(mechanism, authobject)
159
160 Authenticate command --- requires response processing.
161
162 *mechanism* specifies which authentication mechanism is to be used - it should
163 appear in the instance variable ``capabilities`` in the form ``AUTH=mechanism``.
164
165 *authobject* must be a callable object::
166
167 data = authobject(response)
168
169 It will be called to process server continuation responses. It should return
170 ``data`` that will be encoded and sent to server. It should return ``None`` if
171 the client abort response ``*`` should be sent instead.
172
173
174.. method:: IMAP4.check()
175
176 Checkpoint mailbox on server.
177
178
179.. method:: IMAP4.close()
180
181 Close currently selected mailbox. Deleted messages are removed from writable
182 mailbox. This is the recommended command before ``LOGOUT``.
183
184
185.. method:: IMAP4.copy(message_set, new_mailbox)
186
187 Copy *message_set* messages onto end of *new_mailbox*.
188
189
190.. method:: IMAP4.create(mailbox)
191
192 Create new mailbox named *mailbox*.
193
194
195.. method:: IMAP4.delete(mailbox)
196
197 Delete old mailbox named *mailbox*.
198
199
200.. method:: IMAP4.deleteacl(mailbox, who)
201
202 Delete the ACLs (remove any rights) set for who on mailbox.
203
Georg Brandl116aa622007-08-15 14:28:22 +0000204
205.. method:: IMAP4.expunge()
206
207 Permanently remove deleted items from selected mailbox. Generates an ``EXPUNGE``
208 response for each deleted message. Returned data contains a list of ``EXPUNGE``
209 message numbers in order received.
210
211
212.. method:: IMAP4.fetch(message_set, message_parts)
213
214 Fetch (parts of) messages. *message_parts* should be a string of message part
215 names enclosed within parentheses, eg: ``"(UID BODY[TEXT])"``. Returned data
216 are tuples of message part envelope and data.
217
218
219.. method:: IMAP4.getacl(mailbox)
220
221 Get the ``ACL``\ s for *mailbox*. The method is non-standard, but is supported
222 by the ``Cyrus`` server.
223
224
225.. method:: IMAP4.getannotation(mailbox, entry, attribute)
226
227 Retrieve the specified ``ANNOTATION``\ s for *mailbox*. The method is
228 non-standard, but is supported by the ``Cyrus`` server.
229
Georg Brandl116aa622007-08-15 14:28:22 +0000230
231.. method:: IMAP4.getquota(root)
232
233 Get the ``quota`` *root*'s resource usage and limits. This method is part of the
234 IMAP4 QUOTA extension defined in rfc2087.
235
Georg Brandl116aa622007-08-15 14:28:22 +0000236
237.. method:: IMAP4.getquotaroot(mailbox)
238
239 Get the list of ``quota`` ``roots`` for the named *mailbox*. This method is part
240 of the IMAP4 QUOTA extension defined in rfc2087.
241
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243.. method:: IMAP4.list([directory[, pattern]])
244
245 List mailbox names in *directory* matching *pattern*. *directory* defaults to
246 the top-level mail folder, and *pattern* defaults to match anything. Returned
247 data contains a list of ``LIST`` responses.
248
249
250.. method:: IMAP4.login(user, password)
251
252 Identify the client using a plaintext password. The *password* will be quoted.
253
254
255.. method:: IMAP4.login_cram_md5(user, password)
256
257 Force use of ``CRAM-MD5`` authentication when identifying the client to protect
258 the password. Will only work if the server ``CAPABILITY`` response includes the
259 phrase ``AUTH=CRAM-MD5``.
260
Georg Brandl116aa622007-08-15 14:28:22 +0000261
262.. method:: IMAP4.logout()
263
264 Shutdown connection to server. Returns server ``BYE`` response.
265
266
267.. method:: IMAP4.lsub([directory[, pattern]])
268
269 List subscribed mailbox names in directory matching pattern. *directory*
270 defaults to the top level directory and *pattern* defaults to match any mailbox.
271 Returned data are tuples of message part envelope and data.
272
273
274.. method:: IMAP4.myrights(mailbox)
275
276 Show my ACLs for a mailbox (i.e. the rights that I have on mailbox).
277
Georg Brandl116aa622007-08-15 14:28:22 +0000278
279.. method:: IMAP4.namespace()
280
281 Returns IMAP namespaces as defined in RFC2342.
282
Georg Brandl116aa622007-08-15 14:28:22 +0000283
284.. method:: IMAP4.noop()
285
286 Send ``NOOP`` to server.
287
288
289.. method:: IMAP4.open(host, port)
290
291 Opens socket to *port* at *host*. The connection objects established by this
292 method will be used in the ``read``, ``readline``, ``send``, and ``shutdown``
293 methods. You may override this method.
294
295
296.. method:: IMAP4.partial(message_num, message_part, start, length)
297
298 Fetch truncated part of a message. Returned data is a tuple of message part
299 envelope and data.
300
301
302.. method:: IMAP4.proxyauth(user)
303
304 Assume authentication as *user*. Allows an authorised administrator to proxy
305 into any user's mailbox.
306
Georg Brandl116aa622007-08-15 14:28:22 +0000307
308.. method:: IMAP4.read(size)
309
310 Reads *size* bytes from the remote server. You may override this method.
311
312
313.. method:: IMAP4.readline()
314
315 Reads one line from the remote server. You may override this method.
316
317
318.. method:: IMAP4.recent()
319
320 Prompt server for an update. Returned data is ``None`` if no new messages, else
321 value of ``RECENT`` response.
322
323
324.. method:: IMAP4.rename(oldmailbox, newmailbox)
325
326 Rename mailbox named *oldmailbox* to *newmailbox*.
327
328
329.. method:: IMAP4.response(code)
330
331 Return data for response *code* if received, or ``None``. Returns the given
332 code, instead of the usual type.
333
334
335.. method:: IMAP4.search(charset, criterion[, ...])
336
337 Search mailbox for matching messages. *charset* may be ``None``, in which case
338 no ``CHARSET`` will be specified in the request to the server. The IMAP
339 protocol requires that at least one criterion be specified; an exception will be
340 raised when the server returns an error.
341
342 Example::
343
344 # M is a connected IMAP4 instance...
345 typ, msgnums = M.search(None, 'FROM', '"LDJ"')
346
347 # or:
348 typ, msgnums = M.search(None, '(FROM "LDJ")')
349
350
351.. method:: IMAP4.select([mailbox[, readonly]])
352
353 Select a mailbox. Returned data is the count of messages in *mailbox*
354 (``EXISTS`` response). The default *mailbox* is ``'INBOX'``. If the *readonly*
355 flag is set, modifications to the mailbox are not allowed.
356
357
358.. method:: IMAP4.send(data)
359
360 Sends ``data`` to the remote server. You may override this method.
361
362
363.. method:: IMAP4.setacl(mailbox, who, what)
364
365 Set an ``ACL`` for *mailbox*. The method is non-standard, but is supported by
366 the ``Cyrus`` server.
367
368
369.. method:: IMAP4.setannotation(mailbox, entry, attribute[, ...])
370
371 Set ``ANNOTATION``\ s for *mailbox*. The method is non-standard, but is
372 supported by the ``Cyrus`` server.
373
Georg Brandl116aa622007-08-15 14:28:22 +0000374
375.. method:: IMAP4.setquota(root, limits)
376
377 Set the ``quota`` *root*'s resource *limits*. This method is part of the IMAP4
378 QUOTA extension defined in rfc2087.
379
Georg Brandl116aa622007-08-15 14:28:22 +0000380
381.. method:: IMAP4.shutdown()
382
383 Close connection established in ``open``. You may override this method.
384
385
386.. method:: IMAP4.socket()
387
388 Returns socket instance used to connect to server.
389
390
391.. method:: IMAP4.sort(sort_criteria, charset, search_criterion[, ...])
392
393 The ``sort`` command is a variant of ``search`` with sorting semantics for the
394 results. Returned data contains a space separated list of matching message
395 numbers.
396
397 Sort has two arguments before the *search_criterion* argument(s); a
398 parenthesized list of *sort_criteria*, and the searching *charset*. Note that
399 unlike ``search``, the searching *charset* argument is mandatory. There is also
400 a ``uid sort`` command which corresponds to ``sort`` the way that ``uid search``
401 corresponds to ``search``. The ``sort`` command first searches the mailbox for
402 messages that match the given searching criteria using the charset argument for
403 the interpretation of strings in the searching criteria. It then returns the
404 numbers of matching messages.
405
406 This is an ``IMAP4rev1`` extension command.
407
408
409.. method:: IMAP4.status(mailbox, names)
410
411 Request named status conditions for *mailbox*.
412
413
414.. method:: IMAP4.store(message_set, command, flag_list)
415
416 Alters flag dispositions for messages in mailbox. *command* is specified by
417 section 6.4.6 of :rfc:`2060` as being one of "FLAGS", "+FLAGS", or "-FLAGS",
418 optionally with a suffix of ".SILENT".
419
420 For example, to set the delete flag on all messages::
421
422 typ, data = M.search(None, 'ALL')
423 for num in data[0].split():
424 M.store(num, '+FLAGS', '\\Deleted')
425 M.expunge()
426
427
428.. method:: IMAP4.subscribe(mailbox)
429
430 Subscribe to new mailbox.
431
432
433.. method:: IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])
434
435 The ``thread`` command is a variant of ``search`` with threading semantics for
436 the results. Returned data contains a space separated list of thread members.
437
438 Thread members consist of zero or more messages numbers, delimited by spaces,
439 indicating successive parent and child.
440
441 Thread has two arguments before the *search_criterion* argument(s); a
442 *threading_algorithm*, and the searching *charset*. Note that unlike
443 ``search``, the searching *charset* argument is mandatory. There is also a
444 ``uid thread`` command which corresponds to ``thread`` the way that ``uid
445 search`` corresponds to ``search``. The ``thread`` command first searches the
446 mailbox for messages that match the given searching criteria using the charset
447 argument for the interpretation of strings in the searching criteria. It then
448 returns the matching messages threaded according to the specified threading
449 algorithm.
450
451 This is an ``IMAP4rev1`` extension command.
452
Georg Brandl116aa622007-08-15 14:28:22 +0000453
454.. method:: IMAP4.uid(command, arg[, ...])
455
456 Execute command args with messages identified by UID, rather than message
457 number. Returns response appropriate to command. At least one argument must be
458 supplied; if none are provided, the server will return an error and an exception
459 will be raised.
460
461
462.. method:: IMAP4.unsubscribe(mailbox)
463
464 Unsubscribe from old mailbox.
465
466
467.. method:: IMAP4.xatom(name[, arg[, ...]])
468
469 Allow simple extension commands notified by server in ``CAPABILITY`` response.
470
Georg Brandl116aa622007-08-15 14:28:22 +0000471The following attributes are defined on instances of :class:`IMAP4`:
472
473
474.. attribute:: IMAP4.PROTOCOL_VERSION
475
476 The most recent supported protocol in the ``CAPABILITY`` response from the
477 server.
478
479
480.. attribute:: IMAP4.debug
481
482 Integer value to control debugging output. The initialize value is taken from
483 the module variable ``Debug``. Values greater than three trace each command.
484
485
486.. _imap4-example:
487
488IMAP4 Example
489-------------
490
491Here is a minimal example (without error checking) that opens a mailbox and
492retrieves and prints all messages::
493
494 import getpass, imaplib
495
496 M = imaplib.IMAP4()
497 M.login(getpass.getuser(), getpass.getpass())
498 M.select()
499 typ, data = M.search(None, 'ALL')
500 for num in data[0].split():
501 typ, data = M.fetch(num, '(RFC822)')
Georg Brandl6911e3c2007-09-04 07:15:32 +0000502 print('Message %s\n%s\n' % (num, data[0][1]))
Georg Brandl116aa622007-08-15 14:28:22 +0000503 M.close()
504 M.logout()
505