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