annotate Lib/imaplib.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 88d965be8617
children 256e9f00d061
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 """IMAP4 client.
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 Based on RFC 2060.
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
5 Public class: IMAP4
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
6 Public variable: Debug
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
7 Public functions: Internaldate2tuple
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
8 Int2AP
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
9 ParseFlags
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
10 Time2Internaldate
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 """
8546
dc8daa748c40 Piers' latest version, labeled 2.11. This time he integrated my
Guido van Rossum <guido@python.org>
parents: 8520
diff changeset
12
11870
d7eca5b0960a Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents: 11842
diff changeset
13 # Author: Piers Lauder <piers@cs.su.oz.au> December 1997.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
14 #
11870
d7eca5b0960a Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents: 11842
diff changeset
15 # Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998.
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
16 # String method conversion by ESR, February 2001.
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
17 # GET/SETACL contributed by Anthony Baxter <anthony@interlink.com.au> April 2001.
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
18 # IMAP4_SSL contributed by Tino Lange <Tino.Lange@isg.de> March 2002.
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
19 # GET/SETQUOTA contributed by Andreas Zeidler <az@kreativkombinat.de> June 2002.
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
20 # PROXYAUTH contributed by Rick Holbert <holbert.13@osu.edu> November 2002.
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
21 # GET/SETANNOTATION contributed by Tomas Lindroos <skitta@abo.fi> June 2005.
11870
d7eca5b0960a Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents: 11842
diff changeset
22
35488
ce5b7532520a updated __version__
Piers Lauder <piers@cs.su.oz.au>
parents: 35487
diff changeset
23 __version__ = "2.58"
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
25 import binascii, os, random, re, socket, sys, time
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
43093
1d57fb7efb15 Don't lie in __all__ attributes when SSL is not available: only add the SSL
Thomas Wouters <thomas@python.org>
parents: 43008
diff changeset
27 __all__ = ["IMAP4", "IMAP4_stream", "Internaldate2tuple",
16194
f4ac060a841b __all__: removed "error", "abort", "readonly", as these are not
Barry Warsaw <barry@python.org>
parents: 16160
diff changeset
28 "Int2AP", "ParseFlags", "Time2Internaldate"]
16160
46920b60cd33 added a few more __all__ lists
Skip Montanaro <skip@pobox.com>
parents: 15868
diff changeset
29
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
30 # Globals
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 CRLF = '\r\n'
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 Debug = 0
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 IMAP4_PORT = 143
22178
6fa56c43a1ba fixed missing IMAP4_SSL_PORT
Piers Lauder <piers@cs.su.oz.au>
parents: 22173
diff changeset
35 IMAP4_SSL_PORT = 993
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
36 AllowedVersions = ('IMAP4REV1', 'IMAP4') # Most recent first
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
38 # Commands
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
39
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 Commands = {
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
41 # name valid states
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
42 'APPEND': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
43 'AUTHENTICATE': ('NONAUTH',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
44 'CAPABILITY': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
45 'CHECK': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
46 'CLOSE': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
47 'COPY': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
48 'CREATE': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
49 'DELETE': ('AUTH', 'SELECTED'),
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
50 'DELETEACL': ('AUTH', 'SELECTED'),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
51 'EXAMINE': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
52 'EXPUNGE': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
53 'FETCH': ('SELECTED',),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
54 'GETACL': ('AUTH', 'SELECTED'),
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
55 'GETANNOTATION':('AUTH', 'SELECTED'),
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
56 'GETQUOTA': ('AUTH', 'SELECTED'),
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
57 'GETQUOTAROOT': ('AUTH', 'SELECTED'),
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
58 'MYRIGHTS': ('AUTH', 'SELECTED'),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
59 'LIST': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
60 'LOGIN': ('NONAUTH',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
61 'LOGOUT': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
62 'LSUB': ('AUTH', 'SELECTED'),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
63 'NAMESPACE': ('AUTH', 'SELECTED'),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
64 'NOOP': ('NONAUTH', 'AUTH', 'SELECTED', 'LOGOUT'),
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
65 'PARTIAL': ('SELECTED',), # NB: obsolete
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
66 'PROXYAUTH': ('AUTH',),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
67 'RENAME': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
68 'SEARCH': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
69 'SELECT': ('AUTH', 'SELECTED'),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
70 'SETACL': ('AUTH', 'SELECTED'),
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
71 'SETANNOTATION':('AUTH', 'SELECTED'),
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
72 'SETQUOTA': ('AUTH', 'SELECTED'),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
73 'SORT': ('SELECTED',),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
74 'STATUS': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
75 'STORE': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
76 'SUBSCRIBE': ('AUTH', 'SELECTED'),
30893
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
77 'THREAD': ('SELECTED',),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
78 'UID': ('SELECTED',),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
79 'UNSUBSCRIBE': ('AUTH', 'SELECTED'),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
80 }
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
82 # Patterns to match server responses
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
83
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
84 Continuation = re.compile(r'\+( (?P<data>.*))?')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 Flags = re.compile(r'.*FLAGS \((?P<flags>[^\)]*)\)')
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 InternalDate = re.compile(r'.*INTERNALDATE "'
34645
fa3cdd4f9cd0 Fix bug in InternalDate regexp that failed to allow leading 0 in day - courtesy of Rimon Barr <rimon.barr@cornell.edu>
Piers Lauder <piers@cs.su.oz.au>
parents: 33689
diff changeset
87 r'(?P<day>[ 0123][0-9])-(?P<mon>[A-Z][a-z][a-z])-(?P<year>[0-9][0-9][0-9][0-9])'
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
88 r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
89 r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
90 r'"')
11803
c2286a1c2f29 Patches by Piers Lauder.
Guido van Rossum <guido@python.org>
parents: 11562
diff changeset
91 Literal = re.compile(r'.*{(?P<size>\d+)}$')
28900
0e35c159741b improved CRLF regex for previous fix
Piers Lauder <piers@cs.su.oz.au>
parents: 28899
diff changeset
92 MapCRLF = re.compile(r'\r\n|\r|\n')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 Response_code = re.compile(r'\[(?P<type>[A-Z-]+)( (?P<data>[^\]]*))?\]')
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
94 Untagged_response = re.compile(r'\* (?P<type>[A-Z-]+)( (?P<data>.*))?')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 Untagged_status = re.compile(r'\* (?P<data>\d+) (?P<type>[A-Z-]+)( (?P<data2>.*))?')
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 class IMAP4:
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
101 """IMAP4 client class.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
103 Instantiate with: IMAP4([host[, port]])
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
105 host - host's name (default: localhost);
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
106 port - port number (default: standard IMAP4 port).
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
108 All IMAP4rev1 commands are supported by methods of the same
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
109 name (in lower-case).
8453
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
110
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
111 All arguments to commands are converted to strings, except for
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
112 AUTHENTICATE, and the last argument to APPEND which is passed as
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
113 an IMAP4 literal. If necessary (the string contains any
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
114 non-printing characters or white-space and isn't enclosed with
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
115 either parentheses or double quotes) each string is quoted.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
116 However, the 'password' argument to the LOGIN command is always
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
117 quoted. If you want to avoid having an argument string quoted
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
118 (eg: the 'flags' argument to STORE) then enclose the string in
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
119 parentheses (eg: "(\Deleted)").
8453
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
120
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
121 Each command returns a tuple: (type, [data, ...]) where 'type'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
122 is usually 'OK' or 'NO', and 'data' is either the text from the
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
123 tagged response, or untagged results from command. Each 'data'
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
124 is either a string, or a tuple. If a tuple, then the first part
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
125 is the header of the response, and the second part contains
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
126 the data (ie: 'literal' value).
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
128 Errors raise the exception class <instance>.error("<reason>").
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
129 IMAP4 server errors raise <instance>.abort("<reason>"),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
130 which is a sub-class of 'error'. Mailbox status changes
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
131 from READ-WRITE to READ-ONLY raise the exception class
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
132 <instance>.readonly("<reason>"), which is a sub-class of 'abort'.
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
133
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
134 "error" exceptions imply a program error.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
135 "abort" exceptions imply the connection should be reset, and
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
136 the command re-tried.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
137 "readonly" exceptions imply the command should be re-tried.
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
138
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
139 Note: to use this module, you must read the RFCs pertaining to the
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
140 IMAP4 protocol, as the semantics of the arguments to each IMAP4
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
141 command are left to the invoker, not to mention the results. Also,
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
142 most IMAP servers implement a sub-set of the commands available here.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
143 """
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
145 class error(Exception): pass # Logical errors - debug required
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
146 class abort(error): pass # Service errors - close and retry
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
147 class readonly(abort): pass # Mailbox status changed to READ-ONLY
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
148
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
149 mustquote = re.compile(r"[^\w!#$%&'*+,.:;<=>?^`|~-]")
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
151 def __init__(self, host = '', port = IMAP4_PORT):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
152 self.debug = Debug
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
153 self.state = 'LOGOUT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
154 self.literal = None # A literal argument to a command
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
155 self.tagged_commands = {} # Tagged commands awaiting response
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
156 self.untagged_responses = {} # {typ: [data, ...], ...}
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
157 self.continuation_response = '' # Last continuation response
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
158 self.is_readonly = False # READ-ONLY desired state
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
159 self.tagnum = 0
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
161 # Open socket to server.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
162
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
163 self.open(host, port)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
164
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
165 # Create unique tag for this session,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
166 # and compile tagged response matcher.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
167
35205
e2636d108d7d fixed tag generation to avoid null tags
Piers Lauder <piers@cs.su.oz.au>
parents: 34986
diff changeset
168 self.tagpre = Int2AP(random.randint(4096, 65535))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
169 self.tagre = re.compile(r'(?P<tag>'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
170 + self.tagpre
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
171 + r'\d+) (?P<type>[A-Z]+) (?P<data>.*)')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
172
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
173 # Get server welcome message,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
174 # request and store CAPABILITY response.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
176 if __debug__:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
177 self._cmd_log_len = 10
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
178 self._cmd_log_idx = 0
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
179 self._cmd_log = {} # Last `_cmd_log_len' interactions
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
180 if self.debug >= 1:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
181 self._mesg('imaplib version %s' % __version__)
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
182 self._mesg('new IMAP4 connection, tag=%s' % self.tagpre)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
184 self.welcome = self._get_response()
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
185 if 'PREAUTH' in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
186 self.state = 'AUTH'
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
187 elif 'OK' in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
188 self.state = 'NONAUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
189 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
190 raise self.error(self.welcome)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
191
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
192 typ, dat = self.capability()
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
193 if dat == [None]:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
194 raise self.error('no CAPABILITY response from server')
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
195 self.capabilities = tuple(dat[-1].upper().split())
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
196
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
197 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
198 if self.debug >= 3:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30893
diff changeset
199 self._mesg('CAPABILITIES: %r' % (self.capabilities,))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
200
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
201 for version in AllowedVersions:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
202 if not version in self.capabilities:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
203 continue
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
204 self.PROTOCOL_VERSION = version
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
205 return
8546
dc8daa748c40 Piers' latest version, labeled 2.11. This time he integrated my
Guido van Rossum <guido@python.org>
parents: 8520
diff changeset
206
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
207 raise self.error('server not IMAP4 compliant')
7990
de10566dec5c New version doesn't require REV1 capability.
Guido van Rossum <guido@python.org>
parents: 7924
diff changeset
208
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
210 def __getattr__(self, attr):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
211 # Allow UPPERCASE variants of IMAP4 command methods.
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
212 if attr in Commands:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
213 return getattr(self, attr.lower())
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
214 raise AttributeError("Unknown IMAP4 command: '%s'" % attr)
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
215
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
216
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
217
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
218 # Overridable methods
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
219
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
220
23694
8b9d9130820e open method changed to use arguments and set instance host/port values (instead of __init__)
Piers Lauder <piers@cs.su.oz.au>
parents: 23620
diff changeset
221 def open(self, host = '', port = IMAP4_PORT):
8b9d9130820e open method changed to use arguments and set instance host/port values (instead of __init__)
Piers Lauder <piers@cs.su.oz.au>
parents: 23620
diff changeset
222 """Setup connection to remote server on "host:port"
8b9d9130820e open method changed to use arguments and set instance host/port values (instead of __init__)
Piers Lauder <piers@cs.su.oz.au>
parents: 23620
diff changeset
223 (default: localhost:standard IMAP4 port).
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
224 This connection will be used by the routines:
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
225 read, readline, send, shutdown.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
226 """
23694
8b9d9130820e open method changed to use arguments and set instance host/port values (instead of __init__)
Piers Lauder <piers@cs.su.oz.au>
parents: 23620
diff changeset
227 self.host = host
8b9d9130820e open method changed to use arguments and set instance host/port values (instead of __init__)
Piers Lauder <piers@cs.su.oz.au>
parents: 23620
diff changeset
228 self.port = port
54093
88d965be8617 Merged revisions 72662 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45473
diff changeset
229 self.sock = socket.create_connection((host, port))
20430
5d5ad951a6d6 SF bug #469910 by Alfonso Baciero: Bugfix for imaplib for macintosh
Guido van Rossum <guido@python.org>
parents: 19227
diff changeset
230 self.file = self.sock.makefile('rb')
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
231
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
232
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
233 def read(self, size):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
234 """Read 'size' bytes from remote."""
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
235 return self.file.read(size)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
236
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
237
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
238 def readline(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
239 """Read line from remote."""
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
240 return self.file.readline()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
241
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
242
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
243 def send(self, data):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
244 """Send data to remote."""
21963
2faa23facef7 The Grande 'sendall()' patch, copied from release21-maint. Fixes #516715.
Martin v. Löwis <martin@v.loewis.de>
parents: 21649
diff changeset
245 self.sock.sendall(data)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
246
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
247
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
248 def shutdown(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
249 """Close I/O established in "open"."""
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
250 self.file.close()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
251 self.sock.close()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
252
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
253
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
254 def socket(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
255 """Return socket instance used to connect to IMAP4 server.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
256
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
257 socket = <instance>.socket()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
258 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
259 return self.sock
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
260
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
261
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
262
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
263 # Utility methods
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
264
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
265
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
266 def recent(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
267 """Return most recent 'RECENT' responses if any exist,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
268 else prompt server for an update using the 'NOOP' command.
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
269
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
270 (typ, [data]) = <instance>.recent()
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
271
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
272 'data' is None if no new messages,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
273 else list of RECENT responses, most recent last.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
274 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
275 name = 'RECENT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
276 typ, dat = self._untagged_response('OK', [None], name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
277 if dat[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
278 return typ, dat
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
279 typ, dat = self.noop() # Prod server for response
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
280 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
281
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
282
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
283 def response(self, code):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
284 """Return data for response 'code' if received, or None.
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
285
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
286 Old value for response 'code' is cleared.
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
287
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
288 (code, [data]) = <instance>.response(code)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
289 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
290 return self._untagged_response(code, [None], code.upper())
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
291
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
292
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
293
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
294 # IMAP4 commands
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
295
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
297 def append(self, mailbox, flags, date_time, message):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
298 """Append message to named mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
299
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
300 (typ, [data]) = <instance>.append(mailbox, flags, date_time, message)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
301
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
302 All args except `message' can be None.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
303 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
304 name = 'APPEND'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
305 if not mailbox:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
306 mailbox = 'INBOX'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
307 if flags:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
308 if (flags[0],flags[-1]) != ('(',')'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
309 flags = '(%s)' % flags
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
310 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
311 flags = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
312 if date_time:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
313 date_time = Time2Internaldate(date_time)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
314 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
315 date_time = None
28899
081ef7b6be04 added code to canonicalise line endings in data sent via "append" - fix for bug report 723962
Piers Lauder <piers@cs.su.oz.au>
parents: 28414
diff changeset
316 self.literal = MapCRLF.sub(CRLF, message)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
317 return self._simple_command(name, mailbox, flags, date_time)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
318
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
319
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
320 def authenticate(self, mechanism, authobject):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
321 """Authenticate command - requires response processing.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
322
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
323 'mechanism' specifies which authentication mechanism is to
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
324 be used - it must appear in <instance>.capabilities in the
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
325 form AUTH=<mechanism>.
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
326
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
327 'authobject' must be a callable object:
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
328
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
329 data = authobject(response)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
330
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
331 It will be called to process server continuation responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
332 It should return data that will be encoded and sent to server.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
333 It should return None if the client abort response '*' should
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
334 be sent instead.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
335 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
336 mech = mechanism.upper()
29660
9a4bcfddbfa1 Comment out cap, it was unused.
Neal Norwitz <nnorwitz@gmail.com>
parents: 28900
diff changeset
337 # XXX: shouldn't this code be removed, not commented out?
9a4bcfddbfa1 Comment out cap, it was unused.
Neal Norwitz <nnorwitz@gmail.com>
parents: 28900
diff changeset
338 #cap = 'AUTH=%s' % mech
26387
fcf9734e1021 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 26336
diff changeset
339 #if not cap in self.capabilities: # Let the server decide!
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
340 # raise self.error("Server doesn't allow %s authentication." % mech)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
341 self.literal = _Authenticator(authobject).process
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
342 typ, dat = self._simple_command('AUTHENTICATE', mech)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
343 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
344 raise self.error(dat[-1])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
345 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
346 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
347
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
348
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
349 def capability(self):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
350 """(typ, [data]) = <instance>.capability()
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
351 Fetch capabilities list from server."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
352
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
353 name = 'CAPABILITY'
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
354 typ, dat = self._simple_command(name)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
355 return self._untagged_response(typ, dat, name)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
356
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
357
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
358 def check(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
359 """Checkpoint mailbox on server.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
360
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
361 (typ, [data]) = <instance>.check()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
362 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
363 return self._simple_command('CHECK')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
364
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
365
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
366 def close(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
367 """Close currently selected mailbox.
7924
de90bbe85013 Piers' new version (but I unfolded a few doc strings).
Guido van Rossum <guido@python.org>
parents: 7918
diff changeset
368
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
369 Deleted messages are removed from writable mailbox.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
370 This is the recommended command before 'LOGOUT'.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
371
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
372 (typ, [data]) = <instance>.close()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
373 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
374 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
375 typ, dat = self._simple_command('CLOSE')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
376 finally:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
377 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
378 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
379
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
380
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
381 def copy(self, message_set, new_mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
382 """Copy 'message_set' messages onto end of 'new_mailbox'.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
383
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
384 (typ, [data]) = <instance>.copy(message_set, new_mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
385 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
386 return self._simple_command('COPY', message_set, new_mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
387
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
388
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
389 def create(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
390 """Create new mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
391
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
392 (typ, [data]) = <instance>.create(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
393 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
394 return self._simple_command('CREATE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
396
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
397 def delete(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
398 """Delete old mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
399
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
400 (typ, [data]) = <instance>.delete(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
401 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
402 return self._simple_command('DELETE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
403
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
404 def deleteacl(self, mailbox, who):
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
405 """Delete the ACLs (remove any rights) set for who on mailbox.
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
406
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
407 (typ, [data]) = <instance>.deleteacl(mailbox, who)
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
408 """
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
409 return self._simple_command('DELETEACL', mailbox, who)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
410
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
411 def expunge(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
412 """Permanently remove deleted items from selected mailbox.
7924
de90bbe85013 Piers' new version (but I unfolded a few doc strings).
Guido van Rossum <guido@python.org>
parents: 7918
diff changeset
413
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
414 Generates 'EXPUNGE' response for each deleted message.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
415
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
416 (typ, [data]) = <instance>.expunge()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
417
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
418 'data' is list of 'EXPUNGE'd message numbers in order received.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
419 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
420 name = 'EXPUNGE'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
421 typ, dat = self._simple_command(name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
422 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
423
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
425 def fetch(self, message_set, message_parts):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
426 """Fetch (parts of) messages.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
427
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
428 (typ, [data, ...]) = <instance>.fetch(message_set, message_parts)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
429
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
430 'message_parts' should be a string of selected parts
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
431 enclosed in parentheses, eg: "(UID BODY[TEXT])".
12751
2c2b40eb3a65 Piers Lauder <piers@cs.su.oz.au>:
Fred Drake <fdrake@acm.org>
parents: 12081
diff changeset
432
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
433 'data' are tuples of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
434 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
435 name = 'FETCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
436 typ, dat = self._simple_command(name, message_set, message_parts)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
437 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
438
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
439
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
440 def getacl(self, mailbox):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
441 """Get the ACLs for a mailbox.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
442
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
443 (typ, [data]) = <instance>.getacl(mailbox)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
444 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
445 typ, dat = self._simple_command('GETACL', mailbox)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
446 return self._untagged_response(typ, dat, 'ACL')
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
447
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
448
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
449 def getannotation(self, mailbox, entry, attribute):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
450 """(typ, [data]) = <instance>.getannotation(mailbox, entry, attribute)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
451 Retrieve ANNOTATIONs."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
452
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
453 typ, dat = self._simple_command('GETANNOTATION', mailbox, entry, attribute)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
454 return self._untagged_response(typ, dat, 'ANNOTATION')
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
455
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
456
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
457 def getquota(self, root):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
458 """Get the quota root's resource usage and limits.
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
459
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
460 Part of the IMAP4 QUOTA extension defined in rfc2087.
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
461
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
462 (typ, [data]) = <instance>.getquota(root)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
463 """
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
464 typ, dat = self._simple_command('GETQUOTA', root)
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
465 return self._untagged_response(typ, dat, 'QUOTA')
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
466
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
467
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
468 def getquotaroot(self, mailbox):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
469 """Get the list of quota roots for the named mailbox.
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
470
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
471 (typ, [[QUOTAROOT responses...], [QUOTA responses]]) = <instance>.getquotaroot(mailbox)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
472 """
33077
743abac9f9fe Fix typo in getquotaroot parameter reported by Thierry FLORAC. Also amplify doc string for select to indicate proper way to obtain other responses.
Piers Lauder <piers@cs.su.oz.au>
parents: 32828
diff changeset
473 typ, dat = self._simple_command('GETQUOTAROOT', mailbox)
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
474 typ, quota = self._untagged_response(typ, dat, 'QUOTA')
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
475 typ, quotaroot = self._untagged_response(typ, dat, 'QUOTAROOT')
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
476 return typ, [quotaroot, quota]
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
477
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
478
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
479 def list(self, directory='""', pattern='*'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
480 """List mailbox names in directory matching pattern.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
481
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
482 (typ, [data]) = <instance>.list(directory='""', pattern='*')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
483
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
484 'data' is list of LIST responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
485 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
486 name = 'LIST'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
487 typ, dat = self._simple_command(name, directory, pattern)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
488 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
489
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
490
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
491 def login(self, user, password):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
492 """Identify client using plaintext password.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
493
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
494 (typ, [data]) = <instance>.login(user, password)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
495
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
496 NB: 'password' will be quoted.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
497 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
498 typ, dat = self._simple_command('LOGIN', user, self._quote(password))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
499 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
500 raise self.error(dat[-1])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
501 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
502 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
503
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
504
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
505 def login_cram_md5(self, user, password):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
506 """ Force use of CRAM-MD5 authentication.
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
507
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
508 (typ, [data]) = <instance>.login_cram_md5(user, password)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
509 """
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
510 self.user, self.password = user, password
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
511 return self.authenticate('CRAM-MD5', self._CRAM_MD5_AUTH)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
512
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
513
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
514 def _CRAM_MD5_AUTH(self, challenge):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
515 """ Authobject to use with CRAM-MD5 authentication. """
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
516 import hmac
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
517 return self.user + " " + hmac.HMAC(self.password, challenge).hexdigest()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
518
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
519
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
520 def logout(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
521 """Shutdown connection to server.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
522
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
523 (typ, [data]) = <instance>.logout()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
524
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
525 Returns server 'BYE' response.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
526 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
527 self.state = 'LOGOUT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
528 try: typ, dat = self._simple_command('LOGOUT')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
529 except: typ, dat = 'NO', ['%s: %s' % sys.exc_info()[:2]]
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
530 self.shutdown()
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
531 if 'BYE' in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
532 return 'BYE', self.untagged_responses['BYE']
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
533 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
534
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
535
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
536 def lsub(self, directory='""', pattern='*'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
537 """List 'subscribed' mailbox names in directory matching pattern.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
538
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
539 (typ, [data, ...]) = <instance>.lsub(directory='""', pattern='*')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
540
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
541 'data' are tuples of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
542 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
543 name = 'LSUB'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
544 typ, dat = self._simple_command(name, directory, pattern)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
545 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
546
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
547 def myrights(self, mailbox):
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
548 """Show my ACLs for a mailbox (i.e. the rights that I have on mailbox).
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
549
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
550 (typ, [data]) = <instance>.myrights(mailbox)
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
551 """
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
552 typ,dat = self._simple_command('MYRIGHTS', mailbox)
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
553 return self._untagged_response(typ, dat, 'MYRIGHTS')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
554
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
555 def namespace(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
556 """ Returns IMAP namespaces ala rfc2342
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
557
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
558 (typ, [data, ...]) = <instance>.namespace()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
559 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
560 name = 'NAMESPACE'
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
561 typ, dat = self._simple_command(name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
562 return self._untagged_response(typ, dat, name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
563
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
564
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
565 def noop(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
566 """Send NOOP command.
8453
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
567
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
568 (typ, [data]) = <instance>.noop()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
569 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
570 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
571 if self.debug >= 3:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
572 self._dump_ur(self.untagged_responses)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
573 return self._simple_command('NOOP')
8453
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
574
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
575
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
576 def partial(self, message_num, message_part, start, length):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
577 """Fetch truncated part of a message.
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
578
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
579 (typ, [data, ...]) = <instance>.partial(message_num, message_part, start, length)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
580
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
581 'data' is tuple of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
582 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
583 name = 'PARTIAL'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
584 typ, dat = self._simple_command(name, message_num, message_part, start, length)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
585 return self._untagged_response(typ, dat, 'FETCH')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
586
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
587
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
588 def proxyauth(self, user):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
589 """Assume authentication as "user".
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
590
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
591 Allows an authorised administrator to proxy into any user's
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
592 mailbox.
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
593
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
594 (typ, [data]) = <instance>.proxyauth(user)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
595 """
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
596
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
597 name = 'PROXYAUTH'
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
598 return self._simple_command('PROXYAUTH', user)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
599
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
600
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
601 def rename(self, oldmailbox, newmailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
602 """Rename old mailbox name to new.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
603
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
604 (typ, [data]) = <instance>.rename(oldmailbox, newmailbox)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
605 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
606 return self._simple_command('RENAME', oldmailbox, newmailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
607
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
608
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
609 def search(self, charset, *criteria):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
610 """Search mailbox for matching messages.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
611
28414
0cf4e3240380 Replace criterium with criterion. Fixes #705120.
Martin v. Löwis <martin@v.loewis.de>
parents: 28089
diff changeset
612 (typ, [data]) = <instance>.search(charset, criterion, ...)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
613
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
614 'data' is space separated list of matching message numbers.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
615 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
616 name = 'SEARCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
617 if charset:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
618 typ, dat = self._simple_command(name, 'CHARSET', charset, *criteria)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
619 else:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
620 typ, dat = self._simple_command(name, *criteria)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
621 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
622
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
623
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
624 def select(self, mailbox='INBOX', readonly=False):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
625 """Select a mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
626
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
627 Flush all untagged responses.
8363
52d7a9e71221 Subject: bug fixes for imaplib.py
Guido van Rossum <guido@python.org>
parents: 8213
diff changeset
628
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
629 (typ, [data]) = <instance>.select(mailbox='INBOX', readonly=False)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
630
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
631 'data' is count of messages in mailbox ('EXISTS' response).
33077
743abac9f9fe Fix typo in getquotaroot parameter reported by Thierry FLORAC. Also amplify doc string for select to indicate proper way to obtain other responses.
Piers Lauder <piers@cs.su.oz.au>
parents: 32828
diff changeset
632
743abac9f9fe Fix typo in getquotaroot parameter reported by Thierry FLORAC. Also amplify doc string for select to indicate proper way to obtain other responses.
Piers Lauder <piers@cs.su.oz.au>
parents: 32828
diff changeset
633 Mandated responses are ('FLAGS', 'EXISTS', 'RECENT', 'UIDVALIDITY'), so
743abac9f9fe Fix typo in getquotaroot parameter reported by Thierry FLORAC. Also amplify doc string for select to indicate proper way to obtain other responses.
Piers Lauder <piers@cs.su.oz.au>
parents: 32828
diff changeset
634 other responses should be obtained via <instance>.response('FLAGS') etc.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
635 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
636 self.untagged_responses = {} # Flush old responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
637 self.is_readonly = readonly
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
638 if readonly:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
639 name = 'EXAMINE'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
640 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
641 name = 'SELECT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
642 typ, dat = self._simple_command(name, mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
643 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
644 self.state = 'AUTH' # Might have been 'SELECTED'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
645 return typ, dat
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
646 self.state = 'SELECTED'
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
647 if 'READ-ONLY' in self.untagged_responses \
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
648 and not readonly:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
649 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
650 if self.debug >= 1:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
651 self._dump_ur(self.untagged_responses)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
652 raise self.readonly('%s is not writable' % mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
653 return typ, self.untagged_responses.get('EXISTS', [None])
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
654
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
655
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
656 def setacl(self, mailbox, who, what):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
657 """Set a mailbox acl.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
658
31798
c76606f372d1 fix name in setacl method doc string
Piers Lauder <piers@cs.su.oz.au>
parents: 31515
diff changeset
659 (typ, [data]) = <instance>.setacl(mailbox, who, what)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
660 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
661 return self._simple_command('SETACL', mailbox, who, what)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
662
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
663
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
664 def setannotation(self, *args):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
665 """(typ, [data]) = <instance>.setannotation(mailbox[, entry, attribute]+)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
666 Set ANNOTATIONs."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
667
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
668 typ, dat = self._simple_command('SETANNOTATION', *args)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
669 return self._untagged_response(typ, dat, 'ANNOTATION')
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
670
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
671
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
672 def setquota(self, root, limits):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
673 """Set the quota root's resource limits.
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
674
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
675 (typ, [data]) = <instance>.setquota(root, limits)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
676 """
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
677 typ, dat = self._simple_command('SETQUOTA', root, limits)
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
678 return self._untagged_response(typ, dat, 'QUOTA')
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
679
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
680
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
681 def sort(self, sort_criteria, charset, *search_criteria):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
682 """IMAP4rev1 extension SORT command.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
683
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
684 (typ, [data]) = <instance>.sort(sort_criteria, charset, search_criteria, ...)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
685 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
686 name = 'SORT'
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
687 #if not name in self.capabilities: # Let the server decide!
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
688 # raise self.error('unimplemented extension command: %s' % name)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
689 if (sort_criteria[0],sort_criteria[-1]) != ('(',')'):
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
690 sort_criteria = '(%s)' % sort_criteria
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
691 typ, dat = self._simple_command(name, sort_criteria, charset, *search_criteria)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
692 return self._untagged_response(typ, dat, name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
693
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
694
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
695 def status(self, mailbox, names):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
696 """Request named status conditions for mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
697
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
698 (typ, [data]) = <instance>.status(mailbox, names)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
699 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
700 name = 'STATUS'
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
701 #if self.PROTOCOL_VERSION == 'IMAP4': # Let the server decide!
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
702 # raise self.error('%s unimplemented in IMAP4 (obtain IMAP4rev1 server, or re-code)' % name)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
703 typ, dat = self._simple_command(name, mailbox, names)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
704 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
705
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
706
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
707 def store(self, message_set, command, flags):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
708 """Alters flag dispositions for messages in mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
709
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
710 (typ, [data]) = <instance>.store(message_set, command, flags)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
711 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
712 if (flags[0],flags[-1]) != ('(',')'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
713 flags = '(%s)' % flags # Avoid quoting the flags
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
714 typ, dat = self._simple_command('STORE', message_set, command, flags)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
715 return self._untagged_response(typ, dat, 'FETCH')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
716
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
717
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
718 def subscribe(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
719 """Subscribe to new mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
720
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
721 (typ, [data]) = <instance>.subscribe(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
722 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
723 return self._simple_command('SUBSCRIBE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
724
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
725
30893
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
726 def thread(self, threading_algorithm, charset, *search_criteria):
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
727 """IMAPrev1 extension THREAD command.
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
728
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
729 (type, [data]) = <instance>.thread(threading_alogrithm, charset, search_criteria, ...)
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
730 """
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
731 name = 'THREAD'
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
732 typ, dat = self._simple_command(name, threading_algorithm, charset, *search_criteria)
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
733 return self._untagged_response(typ, dat, name)
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
734
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
735
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
736 def uid(self, command, *args):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
737 """Execute "command arg ..." with messages identified by UID,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
738 rather than message number.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
739
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
740 (typ, [data]) = <instance>.uid(command, arg1, arg2, ...)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
741
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
742 Returns response appropriate to 'command'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
743 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
744 command = command.upper()
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
745 if not command in Commands:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
746 raise self.error("Unknown IMAP4 UID command: %s" % command)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
747 if self.state not in Commands[command]:
41160
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
748 raise self.error("command %s illegal in state %s, "
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
749 "only allowed in states %s" %
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
750 (command, self.state,
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
751 ', '.join(Commands[command])))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
752 name = 'UID'
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
753 typ, dat = self._simple_command(name, command, *args)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
754 if command in ('SEARCH', 'SORT'):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
755 name = command
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
756 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
757 name = 'FETCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
758 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
759
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
760
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
761 def unsubscribe(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
762 """Unsubscribe from old mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
763
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
764 (typ, [data]) = <instance>.unsubscribe(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
765 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
766 return self._simple_command('UNSUBSCRIBE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
767
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
768
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
769 def xatom(self, name, *args):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
770 """Allow simple extension commands
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
771 notified by server in CAPABILITY response.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
772
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
773 Assumes command is legal in current state.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
774
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
775 (typ, [data]) = <instance>.xatom(name, arg, ...)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
776
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
777 Returns response appropriate to extension command `name'.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
778 """
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
779 name = name.upper()
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
780 #if not name in self.capabilities: # Let the server decide!
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
781 # raise self.error('unknown extension command: %s' % name)
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
782 if not name in Commands:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
783 Commands[name] = (self.state,)
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
784 return self._simple_command(name, *args)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
785
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
786
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
787
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
788 # Private methods
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
789
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
790
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
791 def _append_untagged(self, typ, dat):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
792
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
793 if dat is None: dat = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
794 ur = self.untagged_responses
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
795 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
796 if self.debug >= 5:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
797 self._mesg('untagged_responses[%s] %s += ["%s"]' %
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
798 (typ, len(ur.get(typ,'')), dat))
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
799 if typ in ur:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
800 ur[typ].append(dat)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
801 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
802 ur[typ] = [dat]
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
803
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
804
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
805 def _check_bye(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
806 bye = self.untagged_responses.get('BYE')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
807 if bye:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
808 raise self.abort(bye[-1])
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
809
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
810
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
811 def _command(self, name, *args):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
812
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
813 if self.state not in Commands[name]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
814 self.literal = None
41160
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
815 raise self.error("command %s illegal in state %s, "
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
816 "only allowed in states %s" %
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
817 (name, self.state,
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
818 ', '.join(Commands[name])))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
819
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
820 for typ in ('OK', 'NO', 'BAD'):
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
821 if typ in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
822 del self.untagged_responses[typ]
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
823
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
824 if 'READ-ONLY' in self.untagged_responses \
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
825 and not self.is_readonly:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
826 raise self.readonly('mailbox status changed to READ-ONLY')
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
827
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
828 tag = self._new_tag()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
829 data = '%s %s' % (tag, name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
830 for arg in args:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
831 if arg is None: continue
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
832 data = '%s %s' % (data, self._checkquote(arg))
8453
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
833
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
834 literal = self.literal
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
835 if literal is not None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
836 self.literal = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
837 if type(literal) is type(self._command):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
838 literator = literal
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
839 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
840 literator = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
841 data = '%s {%s}' % (data, len(literal))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
842
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
843 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
844 if self.debug >= 4:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
845 self._mesg('> %s' % data)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
846 else:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
847 self._log('> %s' % data)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
848
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
849 try:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
850 self.send('%s%s' % (data, CRLF))
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
851 except (socket.error, OSError), val:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
852 raise self.abort('socket error: %s' % val)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
853
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
854 if literal is None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
855 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
856
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
857 while 1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
858 # Wait for continuation response
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
859
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
860 while self._get_response():
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
861 if self.tagged_commands[tag]: # BAD/NO?
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
862 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
863
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
864 # Send literal
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
865
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
866 if literator:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
867 literal = literator(self.continuation_response)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
868
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
869 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
870 if self.debug >= 4:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
871 self._mesg('write literal size %s' % len(literal))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
872
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
873 try:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
874 self.send(literal)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
875 self.send(CRLF)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
876 except (socket.error, OSError), val:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
877 raise self.abort('socket error: %s' % val)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
878
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
879 if not literator:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
880 break
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
881
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
882 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
883
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
884
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
885 def _command_complete(self, name, tag):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
886 self._check_bye()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
887 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
888 typ, data = self._get_tagged_response(tag)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
889 except self.abort, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
890 raise self.abort('command: %s => %s' % (name, val))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
891 except self.error, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
892 raise self.error('command: %s => %s' % (name, val))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
893 self._check_bye()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
894 if typ == 'BAD':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
895 raise self.error('%s command error: %s %s' % (name, typ, data))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
896 return typ, data
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
897
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
898
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
899 def _get_response(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
900
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
901 # Read response and store.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
902 #
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
903 # Returns None for continuation responses,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
904 # otherwise first response line received.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
905
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
906 resp = self._get_line()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
907
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
908 # Command completion response?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
909
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
910 if self._match(self.tagre, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
911 tag = self.mo.group('tag')
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
912 if not tag in self.tagged_commands:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
913 raise self.abort('unexpected tagged response: %s' % resp)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
914
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
915 typ = self.mo.group('type')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
916 dat = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
917 self.tagged_commands[tag] = (typ, [dat])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
918 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
919 dat2 = None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
920
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
921 # '*' (untagged) responses?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
922
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
923 if not self._match(Untagged_response, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
924 if self._match(Untagged_status, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
925 dat2 = self.mo.group('data2')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
926
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
927 if self.mo is None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
928 # Only other possibility is '+' (continuation) response...
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
929
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
930 if self._match(Continuation, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
931 self.continuation_response = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
932 return None # NB: indicates continuation
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
933
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
934 raise self.abort("unexpected response: '%s'" % resp)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
935
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
936 typ = self.mo.group('type')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
937 dat = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
938 if dat is None: dat = '' # Null untagged response
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
939 if dat2: dat = dat + ' ' + dat2
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
940
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
941 # Is there a literal to come?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
942
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
943 while self._match(Literal, dat):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
944
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
945 # Read literal direct from connection.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
946
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
947 size = int(self.mo.group('size'))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
948 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
949 if self.debug >= 4:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
950 self._mesg('read literal size %s' % size)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
951 data = self.read(size)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
952
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
953 # Store response with literal as tuple
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
954
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
955 self._append_untagged(typ, (dat, data))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
956
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
957 # Read trailer - possibly containing another literal
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
958
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
959 dat = self._get_line()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
960
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
961 self._append_untagged(typ, dat)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
962
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
963 # Bracketed response information?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
964
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
965 if typ in ('OK', 'NO', 'BAD') and self._match(Response_code, dat):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
966 self._append_untagged(self.mo.group('type'), self.mo.group('data'))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
967
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
968 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
969 if self.debug >= 1 and typ in ('NO', 'BAD', 'BYE'):
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
970 self._mesg('%s response: %s' % (typ, dat))
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
971
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
972 return resp
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
973
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
974
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
975 def _get_tagged_response(self, tag):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
976
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
977 while 1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
978 result = self.tagged_commands[tag]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
979 if result is not None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
980 del self.tagged_commands[tag]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
981 return result
11803
c2286a1c2f29 Patches by Piers Lauder.
Guido van Rossum <guido@python.org>
parents: 11562
diff changeset
982
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
983 # Some have reported "unexpected response" exceptions.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
984 # Note that ignoring them here causes loops.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
985 # Instead, send me details of the unexpected response and
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
986 # I'll update the code in `_get_response()'.
11803
c2286a1c2f29 Patches by Piers Lauder.
Guido van Rossum <guido@python.org>
parents: 11562
diff changeset
987
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
988 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
989 self._get_response()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
990 except self.abort, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
991 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
992 if self.debug >= 1:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
993 self.print_log()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
994 raise
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
995
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
996
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
997 def _get_line(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
998
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
999 line = self.readline()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1000 if not line:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1001 raise self.abort('socket error: EOF')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1003 # Protocol mandates all lines terminated by CRLF
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1005 line = line[:-2]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1006 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1007 if self.debug >= 4:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1008 self._mesg('< %s' % line)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1009 else:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1010 self._log('< %s' % line)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1011 return line
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1014 def _match(self, cre, s):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1016 # Run compiled regular expression match method on 's'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1017 # Save result, return success.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1019 self.mo = cre.match(s)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1020 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1021 if self.mo is not None and self.debug >= 5:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30893
diff changeset
1022 self._mesg("\tmatched r'%s' => %r" % (cre.pattern, self.mo.groups()))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1023 return self.mo is not None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1024
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1026 def _new_tag(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1028 tag = '%s%s' % (self.tagpre, self.tagnum)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1029 self.tagnum = self.tagnum + 1
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1030 self.tagged_commands[tag] = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1031 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1032
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1033
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1034 def _checkquote(self, arg):
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1035
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1036 # Must quote command args if non-alphanumeric chars present,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1037 # and not already quoted.
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1038
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1039 if type(arg) is not type(''):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1040 return arg
33689
a5c88f2e86a3 Fix bug in _checkquote that raised an exception on empty "arg".
Piers Lauder <piers@cs.su.oz.au>
parents: 33597
diff changeset
1041 if len(arg) >= 2 and (arg[0],arg[-1]) in (('(',')'),('"','"')):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1042 return arg
33689
a5c88f2e86a3 Fix bug in _checkquote that raised an exception on empty "arg".
Piers Lauder <piers@cs.su.oz.au>
parents: 33597
diff changeset
1043 if arg and self.mustquote.search(arg) is None:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1044 return arg
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1045 return self._quote(arg)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1046
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1047
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1048 def _quote(self, arg):
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1049
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1050 arg = arg.replace('\\', '\\\\')
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1051 arg = arg.replace('"', '\\"')
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1052
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1053 return '"%s"' % arg
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1054
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1055
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1056 def _simple_command(self, name, *args):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1058 return self._command_complete(name, self._command(name, *args))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1059
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1060
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1061 def _untagged_response(self, typ, dat, name):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1063 if typ == 'NO':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1064 return typ, dat
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
1065 if not name in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1066 return typ, [None]
24058
37ffce2d9c3c Code modernization. Replace v=s[i]; del s[i] with single lookup v=s.pop(i)
Raymond Hettinger <python@rcn.com>
parents: 23971
diff changeset
1067 data = self.untagged_responses.pop(name)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1068 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1069 if self.debug >= 5:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1070 self._mesg('untagged_responses[%s] => %s' % (name, data))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1071 return typ, data
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1074 if __debug__:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1075
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1076 def _mesg(self, s, secs=None):
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1077 if secs is None:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1078 secs = time.time()
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1079 tm = time.strftime('%M:%S', time.localtime(secs))
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1080 sys.stderr.write(' %s.%02d %s\n' % (tm, (secs*100)%100, s))
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1081 sys.stderr.flush()
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1082
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1083 def _dump_ur(self, dict):
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1084 # Dump untagged responses (in `dict').
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1085 l = dict.items()
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1086 if not l: return
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1087 t = '\n\t\t'
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1088 l = map(lambda x:'%s: "%s"' % (x[0], x[1][0] and '" "'.join(x[1]) or ''), l)
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1089 self._mesg('untagged responses dump:%s%s' % (t, t.join(l)))
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1090
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1091 def _log(self, line):
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1092 # Keep log of last `_cmd_log_len' interactions for debugging.
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1093 self._cmd_log[self._cmd_log_idx] = (line, time.time())
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1094 self._cmd_log_idx += 1
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1095 if self._cmd_log_idx >= self._cmd_log_len:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1096 self._cmd_log_idx = 0
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1097
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1098 def print_log(self):
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1099 self._mesg('last %d IMAP4 interactions:' % len(self._cmd_log))
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1100 i, n = self._cmd_log_idx, self._cmd_log_len
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1101 while n:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1102 try:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1103 self._mesg(*self._cmd_log[i])
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1104 except:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1105 pass
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1106 i += 1
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1107 if i >= self._cmd_log_len:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1108 i = 0
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1109 n -= 1
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1110
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1111
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1113 try:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1114 import ssl
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1115 except ImportError:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1116 pass
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1117 else:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1118 class IMAP4_SSL(IMAP4):
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1119
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1120 """IMAP4 client class over SSL connection
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1121
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1122 Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile]]]])
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1123
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1124 host - host's name (default: localhost);
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1125 port - port number (default: standard IMAP4 SSL port).
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1126 keyfile - PEM formatted file that contains your private key (default: None);
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1127 certfile - PEM formatted certificate chain file (default: None);
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1128
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1129 for more documentation see the docstring of the parent class IMAP4.
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1130 """
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1131
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1132
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1133 def __init__(self, host = '', port = IMAP4_SSL_PORT, keyfile = None, certfile = None):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1134 self.keyfile = keyfile
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1135 self.certfile = certfile
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1136 IMAP4.__init__(self, host, port)
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1137
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1138
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1139 def open(self, host = '', port = IMAP4_SSL_PORT):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1140 """Setup connection to remote server on "host:port".
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1141 (default: localhost:standard IMAP4 SSL port).
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1142 This connection will be used by the routines:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1143 read, readline, send, shutdown.
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1144 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1145 self.host = host
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1146 self.port = port
54093
88d965be8617 Merged revisions 72662 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45473
diff changeset
1147 self.sock = socket.create_connection((host, port))
43325
193020bf52dc More work on SSL support.
Bill Janssen <janssen@parc.com>
parents: 43162
diff changeset
1148 self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1149
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1150
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1151 def read(self, size):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1152 """Read 'size' bytes from remote."""
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1153 # sslobj.read() sometimes returns < size bytes
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1154 chunks = []
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1155 read = 0
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1156 while read < size:
45473
eec4c1e9e9cc #1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
Andrew M. Kuchling <amk@amk.ca>
parents: 43325
diff changeset
1157 data = self.sslobj.read(min(size-read, 16384))
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1158 read += len(data)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1159 chunks.append(data)
23961
7d8c6b889b54 Fix IMAP4_SSL read and send methods to take account of short data
Piers Lauder <piers@cs.su.oz.au>
parents: 23880
diff changeset
1160
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1161 return ''.join(chunks)
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1162
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1163
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1164 def readline(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1165 """Read line from remote."""
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1166 line = []
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1167 while 1:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1168 char = self.sslobj.read(1)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1169 line.append(char)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1170 if char == "\n": return ''.join(line)
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1171
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1172
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1173 def send(self, data):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1174 """Send data to remote."""
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1175 bytes = len(data)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1176 while bytes > 0:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1177 sent = self.sslobj.write(data)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1178 if sent == bytes:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1179 break # avoid copy
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1180 data = data[sent:]
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1181 bytes = bytes - sent
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1182
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1183
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1184 def shutdown(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1185 """Close I/O established in "open"."""
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1186 self.sock.close()
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1187
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1188
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1189 def socket(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1190 """Return socket instance used to connect to IMAP4 server.
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1191
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1192 socket = <instance>.socket()
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1193 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1194 return self.sock
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1195
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1196
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1197 def ssl(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1198 """Return SSLObject instance used to communicate with the IMAP4 server.
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1199
43325
193020bf52dc More work on SSL support.
Bill Janssen <janssen@parc.com>
parents: 43162
diff changeset
1200 ssl = ssl.wrap_socket(<instance>.socket)
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1201 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1202 return self.sslobj
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1203
43093
1d57fb7efb15 Don't lie in __all__ attributes when SSL is not available: only add the SSL
Thomas Wouters <thomas@python.org>
parents: 43008
diff changeset
1204 __all__.append("IMAP4_SSL")
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1205
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1206
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1207 class IMAP4_stream(IMAP4):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1208
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1209 """IMAP4 client class over a stream
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1210
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1211 Instantiate with: IMAP4_stream(command)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1212
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1213 where "command" is a string that can be passed to os.popen2()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1214
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1215 for more documentation see the docstring of the parent class IMAP4.
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1216 """
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1217
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1218
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1219 def __init__(self, command):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1220 self.command = command
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1221 IMAP4.__init__(self)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1222
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1223
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1224 def open(self, host = None, port = None):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1225 """Setup a stream connection.
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1226 This connection will be used by the routines:
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1227 read, readline, send, shutdown.
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1228 """
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1229 self.host = None # For compatibility with parent class
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1230 self.port = None
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1231 self.sock = None
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1232 self.file = None
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1233 self.writefile, self.readfile = os.popen2(self.command)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1234
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1235
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1236 def read(self, size):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1237 """Read 'size' bytes from remote."""
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1238 return self.readfile.read(size)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1239
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1240
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1241 def readline(self):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1242 """Read line from remote."""
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1243 return self.readfile.readline()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1244
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1245
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1246 def send(self, data):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1247 """Send data to remote."""
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1248 self.writefile.write(data)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1249 self.writefile.flush()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1250
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1251
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1252 def shutdown(self):
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1253 """Close I/O established in "open"."""
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1254 self.readfile.close()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1255 self.writefile.close()
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1256
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1257
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1258
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1259 class _Authenticator:
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1260
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1261 """Private class to provide en/decoding
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1262 for base64-based authentication conversation.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1263 """
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1264
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1265 def __init__(self, mechinst):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1266 self.mech = mechinst # Callable object to provide/process data
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1267
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1268 def process(self, data):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1269 ret = self.mech(self.decode(data))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1270 if ret is None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1271 return '*' # Abort conversation
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1272 return self.encode(ret)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1273
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1274 def encode(self, inp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1275 #
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1276 # Invoke binascii.b2a_base64 iteratively with
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1277 # short even length buffers, strip the trailing
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1278 # line feed from the result and append. "Even"
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1279 # means a number that factors to both 6 and 8,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1280 # so when it gets to the end of the 8-bit input
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1281 # there's no partial 6-bit output.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1282 #
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1283 oup = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1284 while inp:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1285 if len(inp) > 48:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1286 t = inp[:48]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1287 inp = inp[48:]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1288 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1289 t = inp
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1290 inp = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1291 e = binascii.b2a_base64(t)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1292 if e:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1293 oup = oup + e[:-1]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1294 return oup
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1295
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1296 def decode(self, inp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1297 if not inp:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1298 return ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1299 return binascii.a2b_base64(inp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1300
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1301
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1302
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1303 Mon2num = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1304 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1305
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1306 def Internaldate2tuple(resp):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1307 """Convert IMAP4 INTERNALDATE to UT.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1308
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1309 Returns Python time module tuple.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1310 """
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1311
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1312 mo = InternalDate.match(resp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1313 if not mo:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1314 return None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1316 mon = Mon2num[mo.group('mon')]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1317 zonen = mo.group('zonen')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318
16732
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1319 day = int(mo.group('day'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1320 year = int(mo.group('year'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1321 hour = int(mo.group('hour'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1322 min = int(mo.group('min'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1323 sec = int(mo.group('sec'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1324 zoneh = int(mo.group('zoneh'))
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1325 zonem = int(mo.group('zonem'))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1327 # INTERNALDATE timezone must be subtracted to get UT
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1328
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1329 zone = (zoneh*60 + zonem)*60
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1330 if zonen == '-':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1331 zone = -zone
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1332
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1333 tt = (year, mon, day, hour, min, sec, -1, -1, -1)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1335 utc = time.mktime(tt)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1337 # Following is necessary because the time module has no 'mkgmtime'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1338 # 'mktime' assumes arg in local timezone, so adds timezone/altzone.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1339
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1340 lt = time.localtime(utc)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1341 if time.daylight and lt[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1342 zone = zone + time.altzone
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1343 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1344 zone = zone + time.timezone
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1345
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1346 return time.localtime(utc - zone)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1348
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1349
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1350 def Int2AP(num):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1351
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1352 """Convert integer to A-P string representation."""
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1353
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1354 val = ''; AP = 'ABCDEFGHIJKLMNOP'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1355 num = int(abs(num))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1356 while num:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1357 num, mod = divmod(num, 16)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1358 val = AP[mod] + val
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1359 return val
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1360
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1361
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363 def ParseFlags(resp):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1365 """Convert IMAP4 flags response to python tuple."""
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1366
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1367 mo = Flags.match(resp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1368 if not mo:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1369 return ()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1371 return tuple(mo.group('flags').split())
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1373
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374 def Time2Internaldate(date_time):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1376 """Convert 'date_time' to IMAP4 INTERNALDATE representation.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1377
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1378 Return string in form: '"DD-Mmm-YYYY HH:MM:SS +HHMM"'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1379 """
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380
21649
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1381 if isinstance(date_time, (int, float)):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1382 tt = time.localtime(date_time)
21649
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1383 elif isinstance(date_time, (tuple, time.struct_time)):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1384 tt = date_time
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
1385 elif isinstance(date_time, str) and (date_time[0],date_time[-1]) == ('"','"'):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1386 return date_time # Assume in correct format
21649
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1387 else:
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1388 raise ValueError("date_time not of a known type")
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1389
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1390 dt = time.strftime("%d-%b-%Y %H:%M:%S", tt)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1391 if dt[0] == '0':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1392 dt = ' ' + dt[1:]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1393 if time.daylight and tt[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1394 zone = -time.altzone
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1395 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1396 zone = -time.timezone
33597
355b15e4a4da Use floor division operator.
Raymond Hettinger <python@rcn.com>
parents: 33077
diff changeset
1397 return '"' + dt + " %+03d%02d" % divmod(zone//60, 60) + '"'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1399
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1400
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1401 if __name__ == '__main__':
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1402
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1403 # To test: invoke either as 'python imaplib.py [IMAP4_server_hostname]'
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1404 # or 'python imaplib.py -s "rsh IMAP4_server_hostname exec /etc/rimapd"'
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1405 # to test the IMAP4_stream class
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1406
19227
84b60213159b Remove redundant 'import sys' (PyChecker).
Guido van Rossum <guido@python.org>
parents: 19003
diff changeset
1407 import getopt, getpass
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1408
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1409 try:
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1410 optlist, args = getopt.getopt(sys.argv[1:], 'd:s:')
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1411 except getopt.error, val:
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1412 optlist, args = (), ()
8458
57dae1c7ea84 Improve the self-test code a bit: read a host from sys.argv[1] if set,
Guido van Rossum <guido@python.org>
parents: 8453
diff changeset
1413
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1414 stream_command = None
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1415 for opt,val in optlist:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1416 if opt == '-d':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1417 Debug = int(val)
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1418 elif opt == '-s':
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1419 stream_command = val
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1420 if not args: args = (stream_command,)
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1421
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1422 if not args: args = ('',)
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1423
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1424 host = args[0]
8546
dc8daa748c40 Piers' latest version, labeled 2.11. This time he integrated my
Guido van Rossum <guido@python.org>
parents: 8520
diff changeset
1425
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1426 USER = getpass.getuser()
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
1427 PASSWD = getpass.getpass("IMAP password for %s on %s: " % (USER, host or "localhost"))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1428
28899
081ef7b6be04 added code to canonicalise line endings in data sent via "append" - fix for bug report 723962
Piers Lauder <piers@cs.su.oz.au>
parents: 28414
diff changeset
1429 test_mesg = 'From: %(user)s@localhost%(lf)sSubject: IMAP4 test%(lf)s%(lf)sdata...%(lf)s' % {'user':USER, 'lf':'\n'}
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1430 test_seq1 = (
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1431 ('login', (USER, PASSWD)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1432 ('create', ('/tmp/xxx 1',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1433 ('rename', ('/tmp/xxx 1', '/tmp/yyy')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1434 ('CREATE', ('/tmp/yyz 2',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1435 ('append', ('/tmp/yyz 2', None, None, test_mesg)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1436 ('list', ('/tmp', 'yy*')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1437 ('select', ('/tmp/yyz 2',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1438 ('search', (None, 'SUBJECT', 'test')),
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1439 ('fetch', ('1', '(FLAGS INTERNALDATE RFC822)')),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1440 ('store', ('1', 'FLAGS', '(\Deleted)')),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
1441 ('namespace', ()),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1442 ('expunge', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1443 ('recent', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1444 ('close', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1445 )
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1446
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1447 test_seq2 = (
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1448 ('select', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1449 ('response',('UIDVALIDITY',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1450 ('uid', ('SEARCH', 'ALL')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1451 ('response', ('EXISTS',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1452 ('append', (None, None, None, test_mesg)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1453 ('recent', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1454 ('logout', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1455 )
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1457 def run(cmd, args):
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1458 M._mesg('%s %s' % (cmd, args))
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1459 typ, dat = getattr(M, cmd)(*args)
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1460 M._mesg('%s => %s %s' % (cmd, typ, dat))
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1461 if typ == 'NO': raise dat[0]
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1462 return dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1463
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1464 try:
26336
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1465 if stream_command:
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1466 M = IMAP4_stream(stream_command)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1467 else:
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1468 M = IMAP4(host)
10871f44e7db added new IMAP4_stream class; added proxyauth command; added login_cram_md5 method
Piers Lauder <piers@cs.su.oz.au>
parents: 25955
diff changeset
1469 if M.state == 'AUTH':
26387
fcf9734e1021 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 26336
diff changeset
1470 test_seq1 = test_seq1[1:] # Login not needed
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1471 M._mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30893
diff changeset
1472 M._mesg('CAPABILITIES = %r' % (M.capabilities,))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1473
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1474 for cmd,args in test_seq1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1475 run(cmd, args)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1476
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1477 for ml in run('list', ('/tmp/', 'yy%')):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1478 mo = re.match(r'.*"([^"]+)"$', ml)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1479 if mo: path = mo.group(1)
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1480 else: path = ml.split()[-1]
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1481 run('delete', (path,))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1482
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1483 for cmd,args in test_seq2:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1484 dat = run(cmd, args)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1485
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1486 if (cmd,args) != ('uid', ('SEARCH', 'ALL')):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1487 continue
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1488
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1489 uid = dat[-1].split()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1490 if not uid: continue
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1491 run('uid', ('FETCH', '%s' % uid[-1],
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1492 '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1493
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1494 print '\nAll tests OK.'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1496 except:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1497 print '\nTests failed.'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1499 if not Debug:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1500 print '''
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1501 If you would like to see debugging output,
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1502 try: %s -d5
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1503 ''' % sys.argv[0]
7990
de10566dec5c New version doesn't require REV1 capability.
Guido van Rossum <guido@python.org>
parents: 7924
diff changeset
1504
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1505 raise