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