blob: 038355c49fc83f87046f30f074ee581ca0c0c371 [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
Antoine Pitrou08728162011-05-06 18:49:52 +020067.. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=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
Antoine Pitrou08728162011-05-06 18:49:52 +020074 and certificate chain file for the SSL connection. *ssl_context* parameter is a
75 :class:`ssl.SSLContext` object which allows bundling SSL configuration
76 options, certificates and private keys into a single (potentially long-lived)
77 structure. Note that the *keyfile*/*certfile* parameters are mutually exclusive with *ssl_context*,
78 a :class:`ValueError` is thrown if *keyfile*/*certfile* is provided along with *ssl_context*.
79
80 .. versionchanged:: 3.3
81 *ssl_context* parameter added.
Georg Brandl116aa622007-08-15 14:28:22 +000082
Antoine Pitrouf3b001f2010-11-12 18:49:16 +000083
Georg Brandl116aa622007-08-15 14:28:22 +000084The second subclass allows for connections created by a child process:
85
86
87.. class:: IMAP4_stream(command)
88
89 This is a subclass derived from :class:`IMAP4` that connects to the
90 ``stdin/stdout`` file descriptors created by passing *command* to
Christian Heimesfb5faf02008-11-05 19:39:50 +000091 ``subprocess.Popen()``.
Georg Brandl116aa622007-08-15 14:28:22 +000092
Georg Brandl116aa622007-08-15 14:28:22 +000093
94The following utility functions are defined:
95
96
97.. function:: Internaldate2tuple(datestr)
98
Alexander Belopolsky41a99bc2011-01-19 19:53:30 +000099 Parse an IMAP4 ``INTERNALDATE`` string and return corresponding local
100 time. The return value is a :class:`time.struct_time` tuple or
101 None if the string has wrong format.
Georg Brandl116aa622007-08-15 14:28:22 +0000102
103.. function:: Int2AP(num)
104
105 Converts an integer into a string representation using characters from the set
106 [``A`` .. ``P``].
107
108
109.. function:: ParseFlags(flagstr)
110
111 Converts an IMAP4 ``FLAGS`` response to a tuple of individual flags.
112
113
114.. function:: Time2Internaldate(date_time)
115
Alexander Belopolsky41a99bc2011-01-19 19:53:30 +0000116 Convert *date_time* to an IMAP4 ``INTERNALDATE`` representation. The
117 return value is a string in the form: ``"DD-Mmm-YYYY HH:MM:SS
118 +HHMM"`` (including double-quotes). The *date_time* argument can be a
Florent Xicluna45c6c3e2011-11-11 19:55:21 +0100119 number (int or float) representing seconds since epoch (as returned
Alexander Belopolsky41a99bc2011-01-19 19:53:30 +0000120 by :func:`time.time`), a 9-tuple representing local time (as returned by
121 :func:`time.localtime`), or a double-quoted string. In the last case, it
122 is assumed to already be in the correct format.
Georg Brandl116aa622007-08-15 14:28:22 +0000123
124Note that IMAP4 message numbers change as the mailbox changes; in particular,
125after an ``EXPUNGE`` command performs deletions the remaining messages are
126renumbered. So it is highly advisable to use UIDs instead, with the UID command.
127
128At the end of the module, there is a test section that contains a more extensive
129example of usage.
130
131
132.. seealso::
133
134 Documents describing the protocol, and sources and binaries for servers
135 implementing it, can all be found at the University of Washington's *IMAP
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000136 Information Center* (http://www.washington.edu/imap/).
Georg Brandl116aa622007-08-15 14:28:22 +0000137
138
139.. _imap4-objects:
140
141IMAP4 Objects
142-------------
143
144All IMAP4rev1 commands are represented by methods of the same name, either
145upper-case or lower-case.
146
147All arguments to commands are converted to strings, except for ``AUTHENTICATE``,
148and the last argument to ``APPEND`` which is passed as an IMAP4 literal. If
149necessary (the string contains IMAP4 protocol-sensitive characters and isn't
150enclosed with either parentheses or double quotes) each string is quoted.
151However, the *password* argument to the ``LOGIN`` command is always quoted. If
152you want to avoid having an argument string quoted (eg: the *flags* argument to
153``STORE``) then enclose the string in parentheses (eg: ``r'(\Deleted)'``).
154
155Each command returns a tuple: ``(type, [data, ...])`` where *type* is usually
156``'OK'`` or ``'NO'``, and *data* is either the text from the command response,
157or mandated results from the command. Each *data* is either a string, or a
158tuple. If a tuple, then the first part is the header of the response, and the
159second part contains the data (ie: 'literal' value).
160
161The *message_set* options to commands below is a string specifying one or more
162messages to be acted upon. It may be a simple message number (``'1'``), a range
163of message numbers (``'2:4'``), or a group of non-contiguous ranges separated by
164commas (``'1:3,6:9'``). A range can contain an asterisk to indicate an infinite
165upper bound (``'3:*'``).
166
167An :class:`IMAP4` instance has the following methods:
168
169
170.. method:: IMAP4.append(mailbox, flags, date_time, message)
171
172 Append *message* to named mailbox.
173
174
175.. method:: IMAP4.authenticate(mechanism, authobject)
176
177 Authenticate command --- requires response processing.
178
179 *mechanism* specifies which authentication mechanism is to be used - it should
180 appear in the instance variable ``capabilities`` in the form ``AUTH=mechanism``.
181
182 *authobject* must be a callable object::
183
184 data = authobject(response)
185
186 It will be called to process server continuation responses. It should return
187 ``data`` that will be encoded and sent to server. It should return ``None`` if
188 the client abort response ``*`` should be sent instead.
189
190
191.. method:: IMAP4.check()
192
193 Checkpoint mailbox on server.
194
195
196.. method:: IMAP4.close()
197
198 Close currently selected mailbox. Deleted messages are removed from writable
199 mailbox. This is the recommended command before ``LOGOUT``.
200
201
202.. method:: IMAP4.copy(message_set, new_mailbox)
203
204 Copy *message_set* messages onto end of *new_mailbox*.
205
206
207.. method:: IMAP4.create(mailbox)
208
209 Create new mailbox named *mailbox*.
210
211
212.. method:: IMAP4.delete(mailbox)
213
214 Delete old mailbox named *mailbox*.
215
216
217.. method:: IMAP4.deleteacl(mailbox, who)
218
219 Delete the ACLs (remove any rights) set for who on mailbox.
220
Georg Brandl116aa622007-08-15 14:28:22 +0000221
222.. method:: IMAP4.expunge()
223
224 Permanently remove deleted items from selected mailbox. Generates an ``EXPUNGE``
225 response for each deleted message. Returned data contains a list of ``EXPUNGE``
226 message numbers in order received.
227
228
229.. method:: IMAP4.fetch(message_set, message_parts)
230
231 Fetch (parts of) messages. *message_parts* should be a string of message part
232 names enclosed within parentheses, eg: ``"(UID BODY[TEXT])"``. Returned data
233 are tuples of message part envelope and data.
234
235
236.. method:: IMAP4.getacl(mailbox)
237
238 Get the ``ACL``\ s for *mailbox*. The method is non-standard, but is supported
239 by the ``Cyrus`` server.
240
241
242.. method:: IMAP4.getannotation(mailbox, entry, attribute)
243
244 Retrieve the specified ``ANNOTATION``\ s for *mailbox*. The method is
245 non-standard, but is supported by the ``Cyrus`` server.
246
Georg Brandl116aa622007-08-15 14:28:22 +0000247
248.. method:: IMAP4.getquota(root)
249
250 Get the ``quota`` *root*'s resource usage and limits. This method is part of the
251 IMAP4 QUOTA extension defined in rfc2087.
252
Georg Brandl116aa622007-08-15 14:28:22 +0000253
254.. method:: IMAP4.getquotaroot(mailbox)
255
256 Get the list of ``quota`` ``roots`` for the named *mailbox*. This method is part
257 of the IMAP4 QUOTA extension defined in rfc2087.
258
Georg Brandl116aa622007-08-15 14:28:22 +0000259
260.. method:: IMAP4.list([directory[, pattern]])
261
262 List mailbox names in *directory* matching *pattern*. *directory* defaults to
263 the top-level mail folder, and *pattern* defaults to match anything. Returned
264 data contains a list of ``LIST`` responses.
265
266
267.. method:: IMAP4.login(user, password)
268
269 Identify the client using a plaintext password. The *password* will be quoted.
270
271
272.. method:: IMAP4.login_cram_md5(user, password)
273
274 Force use of ``CRAM-MD5`` authentication when identifying the client to protect
275 the password. Will only work if the server ``CAPABILITY`` response includes the
276 phrase ``AUTH=CRAM-MD5``.
277
Georg Brandl116aa622007-08-15 14:28:22 +0000278
279.. method:: IMAP4.logout()
280
281 Shutdown connection to server. Returns server ``BYE`` response.
282
283
Georg Brandl3dd33882009-06-01 17:35:27 +0000284.. method:: IMAP4.lsub(directory='""', pattern='*')
Georg Brandl116aa622007-08-15 14:28:22 +0000285
286 List subscribed mailbox names in directory matching pattern. *directory*
287 defaults to the top level directory and *pattern* defaults to match any mailbox.
288 Returned data are tuples of message part envelope and data.
289
290
291.. method:: IMAP4.myrights(mailbox)
292
293 Show my ACLs for a mailbox (i.e. the rights that I have on mailbox).
294
Georg Brandl116aa622007-08-15 14:28:22 +0000295
296.. method:: IMAP4.namespace()
297
298 Returns IMAP namespaces as defined in RFC2342.
299
Georg Brandl116aa622007-08-15 14:28:22 +0000300
301.. method:: IMAP4.noop()
302
303 Send ``NOOP`` to server.
304
305
306.. method:: IMAP4.open(host, port)
307
Antoine Pitroufdded562011-02-07 15:58:11 +0000308 Opens socket to *port* at *host*. This method is implicitly called by
309 the :class:`IMAP4` constructor. The connection objects established by this
Georg Brandl116aa622007-08-15 14:28:22 +0000310 method will be used in the ``read``, ``readline``, ``send``, and ``shutdown``
Antoine Pitroufdded562011-02-07 15:58:11 +0000311 methods. You may override this method.
Georg Brandl116aa622007-08-15 14:28:22 +0000312
313
314.. method:: IMAP4.partial(message_num, message_part, start, length)
315
316 Fetch truncated part of a message. Returned data is a tuple of message part
317 envelope and data.
318
319
320.. method:: IMAP4.proxyauth(user)
321
322 Assume authentication as *user*. Allows an authorised administrator to proxy
323 into any user's mailbox.
324
Georg Brandl116aa622007-08-15 14:28:22 +0000325
326.. method:: IMAP4.read(size)
327
328 Reads *size* bytes from the remote server. You may override this method.
329
330
331.. method:: IMAP4.readline()
332
333 Reads one line from the remote server. You may override this method.
334
335
336.. method:: IMAP4.recent()
337
338 Prompt server for an update. Returned data is ``None`` if no new messages, else
339 value of ``RECENT`` response.
340
341
342.. method:: IMAP4.rename(oldmailbox, newmailbox)
343
344 Rename mailbox named *oldmailbox* to *newmailbox*.
345
346
347.. method:: IMAP4.response(code)
348
349 Return data for response *code* if received, or ``None``. Returns the given
350 code, instead of the usual type.
351
352
353.. method:: IMAP4.search(charset, criterion[, ...])
354
355 Search mailbox for matching messages. *charset* may be ``None``, in which case
356 no ``CHARSET`` will be specified in the request to the server. The IMAP
357 protocol requires that at least one criterion be specified; an exception will be
358 raised when the server returns an error.
359
360 Example::
361
362 # M is a connected IMAP4 instance...
363 typ, msgnums = M.search(None, 'FROM', '"LDJ"')
364
365 # or:
366 typ, msgnums = M.search(None, '(FROM "LDJ")')
367
368
Georg Brandl3dd33882009-06-01 17:35:27 +0000369.. method:: IMAP4.select(mailbox='INBOX', readonly=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000370
371 Select a mailbox. Returned data is the count of messages in *mailbox*
372 (``EXISTS`` response). The default *mailbox* is ``'INBOX'``. If the *readonly*
373 flag is set, modifications to the mailbox are not allowed.
374
375
376.. method:: IMAP4.send(data)
377
378 Sends ``data`` to the remote server. You may override this method.
379
380
381.. method:: IMAP4.setacl(mailbox, who, what)
382
383 Set an ``ACL`` for *mailbox*. The method is non-standard, but is supported by
384 the ``Cyrus`` server.
385
386
387.. method:: IMAP4.setannotation(mailbox, entry, attribute[, ...])
388
389 Set ``ANNOTATION``\ s for *mailbox*. The method is non-standard, but is
390 supported by the ``Cyrus`` server.
391
Georg Brandl116aa622007-08-15 14:28:22 +0000392
393.. method:: IMAP4.setquota(root, limits)
394
395 Set the ``quota`` *root*'s resource *limits*. This method is part of the IMAP4
396 QUOTA extension defined in rfc2087.
397
Georg Brandl116aa622007-08-15 14:28:22 +0000398
399.. method:: IMAP4.shutdown()
400
Antoine Pitroufdded562011-02-07 15:58:11 +0000401 Close connection established in ``open``. This method is implicitly
402 called by :meth:`IMAP4.logout`. You may override this method.
Georg Brandl116aa622007-08-15 14:28:22 +0000403
404
405.. method:: IMAP4.socket()
406
407 Returns socket instance used to connect to server.
408
409
410.. method:: IMAP4.sort(sort_criteria, charset, search_criterion[, ...])
411
412 The ``sort`` command is a variant of ``search`` with sorting semantics for the
413 results. Returned data contains a space separated list of matching message
414 numbers.
415
416 Sort has two arguments before the *search_criterion* argument(s); a
417 parenthesized list of *sort_criteria*, and the searching *charset*. Note that
418 unlike ``search``, the searching *charset* argument is mandatory. There is also
419 a ``uid sort`` command which corresponds to ``sort`` the way that ``uid search``
420 corresponds to ``search``. The ``sort`` command first searches the mailbox for
421 messages that match the given searching criteria using the charset argument for
422 the interpretation of strings in the searching criteria. It then returns the
423 numbers of matching messages.
424
425 This is an ``IMAP4rev1`` extension command.
426
427
Antoine Pitrouf3b001f2010-11-12 18:49:16 +0000428.. method:: IMAP4.starttls(ssl_context=None)
429
430 Send a ``STARTTLS`` command. The *ssl_context* argument is optional
431 and should be a :class:`ssl.SSLContext` object. This will enable
432 encryption on the IMAP connection.
433
434 .. versionadded:: 3.2
435
436
Georg Brandl116aa622007-08-15 14:28:22 +0000437.. method:: IMAP4.status(mailbox, names)
438
439 Request named status conditions for *mailbox*.
440
441
442.. method:: IMAP4.store(message_set, command, flag_list)
443
444 Alters flag dispositions for messages in mailbox. *command* is specified by
445 section 6.4.6 of :rfc:`2060` as being one of "FLAGS", "+FLAGS", or "-FLAGS",
446 optionally with a suffix of ".SILENT".
447
448 For example, to set the delete flag on all messages::
449
450 typ, data = M.search(None, 'ALL')
451 for num in data[0].split():
452 M.store(num, '+FLAGS', '\\Deleted')
453 M.expunge()
454
455
456.. method:: IMAP4.subscribe(mailbox)
457
458 Subscribe to new mailbox.
459
460
461.. method:: IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])
462
463 The ``thread`` command is a variant of ``search`` with threading semantics for
464 the results. Returned data contains a space separated list of thread members.
465
466 Thread members consist of zero or more messages numbers, delimited by spaces,
467 indicating successive parent and child.
468
469 Thread has two arguments before the *search_criterion* argument(s); a
470 *threading_algorithm*, and the searching *charset*. Note that unlike
471 ``search``, the searching *charset* argument is mandatory. There is also a
472 ``uid thread`` command which corresponds to ``thread`` the way that ``uid
473 search`` corresponds to ``search``. The ``thread`` command first searches the
474 mailbox for messages that match the given searching criteria using the charset
475 argument for the interpretation of strings in the searching criteria. It then
476 returns the matching messages threaded according to the specified threading
477 algorithm.
478
479 This is an ``IMAP4rev1`` extension command.
480
Georg Brandl116aa622007-08-15 14:28:22 +0000481
482.. method:: IMAP4.uid(command, arg[, ...])
483
484 Execute command args with messages identified by UID, rather than message
485 number. Returns response appropriate to command. At least one argument must be
486 supplied; if none are provided, the server will return an error and an exception
487 will be raised.
488
489
490.. method:: IMAP4.unsubscribe(mailbox)
491
492 Unsubscribe from old mailbox.
493
494
Georg Brandl3dd33882009-06-01 17:35:27 +0000495.. method:: IMAP4.xatom(name[, ...])
Georg Brandl116aa622007-08-15 14:28:22 +0000496
497 Allow simple extension commands notified by server in ``CAPABILITY`` response.
498
Georg Brandl116aa622007-08-15 14:28:22 +0000499
Georg Brandl3dd33882009-06-01 17:35:27 +0000500The following attributes are defined on instances of :class:`IMAP4`:
Georg Brandl116aa622007-08-15 14:28:22 +0000501
502.. attribute:: IMAP4.PROTOCOL_VERSION
503
504 The most recent supported protocol in the ``CAPABILITY`` response from the
505 server.
506
507
508.. attribute:: IMAP4.debug
509
510 Integer value to control debugging output. The initialize value is taken from
511 the module variable ``Debug``. Values greater than three trace each command.
512
513
514.. _imap4-example:
515
516IMAP4 Example
517-------------
518
519Here is a minimal example (without error checking) that opens a mailbox and
520retrieves and prints all messages::
521
522 import getpass, imaplib
523
524 M = imaplib.IMAP4()
525 M.login(getpass.getuser(), getpass.getpass())
526 M.select()
527 typ, data = M.search(None, 'ALL')
528 for num in data[0].split():
529 typ, data = M.fetch(num, '(RFC822)')
Georg Brandl6911e3c2007-09-04 07:15:32 +0000530 print('Message %s\n%s\n' % (num, data[0][1]))
Georg Brandl116aa622007-08-15 14:28:22 +0000531 M.close()
532 M.logout()
533