annotate Lib/imaplib.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 0dee36595699
children 74eeefc4137f
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
66136
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
25 import binascii, errno, random, re, socket, subprocess, 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()
66136
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
251 try:
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
252 self.sock.shutdown(socket.SHUT_RDWR)
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
253 except socket.error as e:
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
254 # The server might already have closed the connection
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
255 if e.errno != errno.ENOTCONN:
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
256 raise
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
257 finally:
a5b39d89dccb Merged revisions 86391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66132
diff changeset
258 self.sock.close()
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
259
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 def socket(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
262 """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
263
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
264 socket = <instance>.socket()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
265 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
266 return self.sock
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
267
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
268
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
269
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
270 # Utility methods
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
271
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
272
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
273 def recent(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
274 """Return most recent 'RECENT' responses if any exist,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
275 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
276
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
277 (typ, [data]) = <instance>.recent()
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
278
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
279 'data' is None if no new messages,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
280 else list of RECENT responses, most recent last.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
281 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
282 name = 'RECENT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
283 typ, dat = self._untagged_response('OK', [None], name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
284 if dat[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
285 return typ, dat
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
286 typ, dat = self.noop() # Prod server for response
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
287 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
288
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
289
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
290 def response(self, code):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
291 """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
292
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
293 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
294
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
295 (code, [data]) = <instance>.response(code)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
296 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
297 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
298
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
299
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
300
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
301 # IMAP4 commands
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
302
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
303
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
304 def append(self, mailbox, flags, date_time, message):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
305 """Append message to named mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
306
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
307 (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
308
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
309 All args except `message' can be None.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
310 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
311 name = 'APPEND'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
312 if not mailbox:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
313 mailbox = 'INBOX'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
314 if flags:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
315 if (flags[0],flags[-1]) != ('(',')'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
316 flags = '(%s)' % flags
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
317 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
318 flags = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
319 if date_time:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
320 date_time = Time2Internaldate(date_time)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
321 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
322 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
323 self.literal = MapCRLF.sub(CRLF, message)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
324 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
325
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
326
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
327 def authenticate(self, mechanism, authobject):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
328 """Authenticate command - requires response processing.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
329
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
330 'mechanism' specifies which authentication mechanism is to
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
331 be used - it must appear in <instance>.capabilities in the
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
332 form AUTH=<mechanism>.
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
333
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
334 '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
335
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
336 data = authobject(response)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
337
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
338 It will be called to process server continuation responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
339 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
340 It should return None if the client abort response '*' should
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
341 be sent instead.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
342 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
343 mech = mechanism.upper()
29660
9a4bcfddbfa1 Comment out cap, it was unused.
Neal Norwitz <nnorwitz@gmail.com>
parents: 28900
diff changeset
344 # 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
345 #cap = 'AUTH=%s' % mech
26387
fcf9734e1021 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 26336
diff changeset
346 #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
347 # raise self.error("Server doesn't allow %s authentication." % mech)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
348 self.literal = _Authenticator(authobject).process
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
349 typ, dat = self._simple_command('AUTHENTICATE', mech)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
350 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
351 raise self.error(dat[-1])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
352 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
353 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
354
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
355
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
356 def capability(self):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
357 """(typ, [data]) = <instance>.capability()
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
358 Fetch capabilities list from server."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
359
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
360 name = 'CAPABILITY'
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
361 typ, dat = self._simple_command(name)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
362 return self._untagged_response(typ, dat, name)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
363
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
364
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
365 def check(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
366 """Checkpoint mailbox on server.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
367
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
368 (typ, [data]) = <instance>.check()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
369 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
370 return self._simple_command('CHECK')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
371
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
372
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
373 def close(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
374 """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
375
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
376 Deleted messages are removed from writable mailbox.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
377 This is the recommended command before 'LOGOUT'.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
378
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
379 (typ, [data]) = <instance>.close()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
380 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
381 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
382 typ, dat = self._simple_command('CLOSE')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
383 finally:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
384 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
385 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
386
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
387
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
388 def copy(self, message_set, new_mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
389 """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
390
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
391 (typ, [data]) = <instance>.copy(message_set, new_mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
392 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
393 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
394
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
396 def create(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
397 """Create new mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
398
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
399 (typ, [data]) = <instance>.create(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
400 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
401 return self._simple_command('CREATE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
403
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
404 def delete(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
405 """Delete old mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
406
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
407 (typ, [data]) = <instance>.delete(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
408 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
409 return self._simple_command('DELETE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
410
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
411 def deleteacl(self, mailbox, who):
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
412 """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
413
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
414 (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
415 """
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
416 return self._simple_command('DELETEACL', mailbox, who)
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 def expunge(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
419 """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
420
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
421 Generates 'EXPUNGE' response for each deleted message.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
422
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
423 (typ, [data]) = <instance>.expunge()
7918
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 'data' is list of 'EXPUNGE'd message numbers in order received.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
426 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
427 name = 'EXPUNGE'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
428 typ, dat = self._simple_command(name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
429 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
430
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
431
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
432 def fetch(self, message_set, message_parts):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
433 """Fetch (parts of) messages.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
434
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
435 (typ, [data, ...]) = <instance>.fetch(message_set, message_parts)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
436
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
437 'message_parts' should be a string of selected parts
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
438 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
439
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
440 'data' are tuples of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
441 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
442 name = 'FETCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
443 typ, dat = self._simple_command(name, message_set, message_parts)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
444 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
445
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
446
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
447 def getacl(self, mailbox):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
448 """Get the ACLs for a mailbox.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
449
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
450 (typ, [data]) = <instance>.getacl(mailbox)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
451 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
452 typ, dat = self._simple_command('GETACL', mailbox)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
453 return self._untagged_response(typ, dat, 'ACL')
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
454
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
455
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
456 def getannotation(self, mailbox, entry, attribute):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
457 """(typ, [data]) = <instance>.getannotation(mailbox, entry, attribute)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
458 Retrieve ANNOTATIONs."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
459
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
460 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
461 return self._untagged_response(typ, dat, 'ANNOTATION')
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
462
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
463
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
464 def getquota(self, root):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
465 """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
466
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
467 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
468
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
469 (typ, [data]) = <instance>.getquota(root)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
470 """
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
471 typ, dat = self._simple_command('GETQUOTA', root)
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
472 return self._untagged_response(typ, dat, 'QUOTA')
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
473
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
474
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
475 def getquotaroot(self, mailbox):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
476 """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
477
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
478 (typ, [[QUOTAROOT responses...], [QUOTA responses]]) = <instance>.getquotaroot(mailbox)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
479 """
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
480 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
481 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
482 typ, quotaroot = self._untagged_response(typ, dat, 'QUOTAROOT')
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
483 return typ, [quotaroot, quota]
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
484
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
485
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
486 def list(self, directory='""', pattern='*'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
487 """List mailbox names in directory matching pattern.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
488
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
489 (typ, [data]) = <instance>.list(directory='""', pattern='*')
7918
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 'data' is list of LIST responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
492 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
493 name = 'LIST'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
494 typ, dat = self._simple_command(name, directory, pattern)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
495 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
496
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
497
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
498 def login(self, user, password):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
499 """Identify client using plaintext password.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
500
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
501 (typ, [data]) = <instance>.login(user, password)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
502
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
503 NB: 'password' will be quoted.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
504 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
505 typ, dat = self._simple_command('LOGIN', user, self._quote(password))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
506 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
507 raise self.error(dat[-1])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
508 self.state = 'AUTH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
509 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
510
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
511
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
512 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
513 """ 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
514
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 (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
516 """
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 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
518 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
519
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
520
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
521 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
522 """ 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
523 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
524 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
525
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
526
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
527 def logout(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
528 """Shutdown connection to server.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
530 (typ, [data]) = <instance>.logout()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
531
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
532 Returns server 'BYE' response.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
533 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
534 self.state = 'LOGOUT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
535 try: typ, dat = self._simple_command('LOGOUT')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
536 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
537 self.shutdown()
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
538 if 'BYE' in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
539 return 'BYE', self.untagged_responses['BYE']
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
540 return typ, dat
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
541
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
542
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
543 def lsub(self, directory='""', pattern='*'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
544 """List 'subscribed' mailbox names in directory matching pattern.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
545
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
546 (typ, [data, ...]) = <instance>.lsub(directory='""', pattern='*')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
547
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
548 'data' are tuples of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
549 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
550 name = 'LSUB'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
551 typ, dat = self._simple_command(name, directory, pattern)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
552 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
553
32828
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
554 def myrights(self, mailbox):
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
555 """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
556
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
557 (typ, [data]) = <instance>.myrights(mailbox)
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
558 """
07a57d89b1e0 Patch #998149: imaplib deleteacl and myrights.
Martin v. Löwis <martin@v.loewis.de>
parents: 32179
diff changeset
559 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
560 return self._untagged_response(typ, dat, 'MYRIGHTS')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
561
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
562 def namespace(self):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
563 """ Returns IMAP namespaces ala rfc2342
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
564
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
565 (typ, [data, ...]) = <instance>.namespace()
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
566 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
567 name = 'NAMESPACE'
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
568 typ, dat = self._simple_command(name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
569 return self._untagged_response(typ, dat, name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
570
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
571
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
572 def noop(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
573 """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
574
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
575 (typ, [data]) = <instance>.noop()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
576 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
577 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
578 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
579 self._dump_ur(self.untagged_responses)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
580 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
581
4e59d890a4bd Piers Lauders' latest version, with some of my own changes reapplied.
Guido van Rossum <guido@python.org>
parents: 8394
diff changeset
582
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
583 def partial(self, message_num, message_part, start, length):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
584 """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
585
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
586 (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
587
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
588 'data' is tuple of message part envelope and data.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
589 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
590 name = 'PARTIAL'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
591 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
592 return self._untagged_response(typ, dat, 'FETCH')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
593
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
594
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
595 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
596 """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
597
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 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
599 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
600
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
601 (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
602 """
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
603
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 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
605 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
606
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
607
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
608 def rename(self, oldmailbox, newmailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
609 """Rename old mailbox name to new.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
610
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
611 (typ, [data]) = <instance>.rename(oldmailbox, newmailbox)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
612 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
613 return self._simple_command('RENAME', oldmailbox, newmailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
614
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
615
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
616 def search(self, charset, *criteria):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
617 """Search mailbox for matching messages.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
618
28414
0cf4e3240380 Replace criterium with criterion. Fixes #705120.
Martin v. Löwis <martin@v.loewis.de>
parents: 28089
diff changeset
619 (typ, [data]) = <instance>.search(charset, criterion, ...)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
620
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
621 'data' is space separated list of matching message numbers.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
622 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
623 name = 'SEARCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
624 if charset:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
625 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
626 else:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
627 typ, dat = self._simple_command(name, *criteria)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
628 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
629
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
630
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
631 def select(self, mailbox='INBOX', readonly=False):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
632 """Select a mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
633
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
634 Flush all untagged responses.
8363
52d7a9e71221 Subject: bug fixes for imaplib.py
Guido van Rossum <guido@python.org>
parents: 8213
diff changeset
635
35487
4681a8fa46d0 changed select() so readonly flag is treated as a boolean
Piers Lauder <piers@cs.su.oz.au>
parents: 35205
diff changeset
636 (typ, [data]) = <instance>.select(mailbox='INBOX', readonly=False)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
637
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
638 '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
639
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
640 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
641 other responses should be obtained via <instance>.response('FLAGS') etc.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
642 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
643 self.untagged_responses = {} # Flush old responses.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
644 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
645 if readonly:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
646 name = 'EXAMINE'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
647 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
648 name = 'SELECT'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
649 typ, dat = self._simple_command(name, mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
650 if typ != 'OK':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
651 self.state = 'AUTH' # Might have been 'SELECTED'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
652 return typ, dat
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
653 self.state = 'SELECTED'
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
654 if 'READ-ONLY' in self.untagged_responses \
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
655 and not readonly:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
656 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
657 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
658 self._dump_ur(self.untagged_responses)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
659 raise self.readonly('%s is not writable' % mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
660 return typ, self.untagged_responses.get('EXISTS', [None])
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
661
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
662
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
663 def setacl(self, mailbox, who, what):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
664 """Set a mailbox acl.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
665
31798
c76606f372d1 fix name in setacl method doc string
Piers Lauder <piers@cs.su.oz.au>
parents: 31515
diff changeset
666 (typ, [data]) = <instance>.setacl(mailbox, who, what)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
667 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
668 return self._simple_command('SETACL', mailbox, who, what)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
669
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
670
34986
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
671 def setannotation(self, *args):
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
672 """(typ, [data]) = <instance>.setannotation(mailbox[, entry, attribute]+)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
673 Set ANNOTATIONs."""
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
674
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
675 typ, dat = self._simple_command('SETANNOTATION', *args)
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
676 return self._untagged_response(typ, dat, 'ANNOTATION')
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
677
9854472b921b added GET/SETANNOTATION methods
Piers Lauder <piers@cs.su.oz.au>
parents: 34645
diff changeset
678
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
679 def setquota(self, root, limits):
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
680 """Set the quota root's resource limits.
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
681
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
682 (typ, [data]) = <instance>.setquota(root, limits)
23880
bbaeaf2719c4 Whitespace normalization (tabs -> spaces)
Neal Norwitz <nnorwitz@gmail.com>
parents: 23878
diff changeset
683 """
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
684 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
685 return self._untagged_response(typ, dat, 'QUOTA')
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
686
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
687
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
688 def sort(self, sort_criteria, charset, *search_criteria):
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
689 """IMAP4rev1 extension SORT command.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
690
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
691 (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
692 """
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
693 name = 'SORT'
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
694 #if not name in self.capabilities: # Let the server decide!
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
695 # 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
696 if (sort_criteria[0],sort_criteria[-1]) != ('(',')'):
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
697 sort_criteria = '(%s)' % sort_criteria
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
698 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
699 return self._untagged_response(typ, dat, name)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
700
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
701
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
702 def status(self, mailbox, names):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
703 """Request named status conditions for mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
704
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
705 (typ, [data]) = <instance>.status(mailbox, names)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
706 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
707 name = 'STATUS'
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
708 #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
709 # 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
710 typ, dat = self._simple_command(name, mailbox, names)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
711 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
712
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
713
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
714 def store(self, message_set, command, flags):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
715 """Alters flag dispositions for messages in mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
716
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
717 (typ, [data]) = <instance>.store(message_set, command, flags)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
718 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
719 if (flags[0],flags[-1]) != ('(',')'):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
720 flags = '(%s)' % flags # Avoid quoting the flags
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
721 typ, dat = self._simple_command('STORE', message_set, command, flags)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
722 return self._untagged_response(typ, dat, 'FETCH')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
723
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
724
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
725 def subscribe(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
726 """Subscribe to new mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
727
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
728 (typ, [data]) = <instance>.subscribe(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
729 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
730 return self._simple_command('SUBSCRIBE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
731
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
732
30893
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
733 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
734 """IMAPrev1 extension THREAD command.
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
735
57924
3b86b23c58fe Merged revisions 77041 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57663
diff changeset
736 (type, [data]) = <instance>.thread(threading_algorithm, charset, search_criteria, ...)
30893
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
737 """
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
738 name = 'THREAD'
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
739 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
740 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
741
1e6863ddd84b Patch #798297: Add IMAP THREAD command.
Martin v. Löwis <martin@v.loewis.de>
parents: 29660
diff changeset
742
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
743 def uid(self, command, *args):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
744 """Execute "command arg ..." with messages identified by UID,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
745 rather than message number.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
746
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
747 (typ, [data]) = <instance>.uid(command, arg1, arg2, ...)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
748
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
749 Returns response appropriate to 'command'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
750 """
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
751 command = command.upper()
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
752 if not command in Commands:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
753 raise self.error("Unknown IMAP4 UID command: %s" % command)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
754 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
755 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
756 "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
757 (command, self.state,
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
758 ', '.join(Commands[command])))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
759 name = 'UID'
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
760 typ, dat = self._simple_command(name, command, *args)
63442
bf5c630daaf7 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59834
diff changeset
761 if command in ('SEARCH', 'SORT', 'THREAD'):
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
762 name = command
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
763 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
764 name = 'FETCH'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
765 return self._untagged_response(typ, dat, name)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
766
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
767
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
768 def unsubscribe(self, mailbox):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
769 """Unsubscribe from old mailbox.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
770
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
771 (typ, [data]) = <instance>.unsubscribe(mailbox)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
772 """
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
773 return self._simple_command('UNSUBSCRIBE', mailbox)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
774
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
775
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
776 def xatom(self, name, *args):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
777 """Allow simple extension commands
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
778 notified by server in CAPABILITY response.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
779
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
780 Assumes command is legal in current state.
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
781
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
782 (typ, [data]) = <instance>.xatom(name, arg, ...)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
783
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
784 Returns response appropriate to extension command `name'.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
785 """
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
786 name = name.upper()
18787
f999d3609f74 Whitespace normalization, plus:
Tim Peters <tim.peters@gmail.com>
parents: 18765
diff changeset
787 #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
788 # 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
789 if not name in Commands:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
790 Commands[name] = (self.state,)
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
791 return self._simple_command(name, *args)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
792
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
793
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
794
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
795 # Private methods
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
796
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
797
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
798 def _append_untagged(self, typ, dat):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
799
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
800 if dat is None: dat = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
801 ur = self.untagged_responses
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
802 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
803 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
804 self._mesg('untagged_responses[%s] %s += ["%s"]' %
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
805 (typ, len(ur.get(typ,'')), dat))
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
806 if typ in ur:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
807 ur[typ].append(dat)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
808 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
809 ur[typ] = [dat]
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
810
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
811
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
812 def _check_bye(self):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
813 bye = self.untagged_responses.get('BYE')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
814 if bye:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
815 raise self.abort(bye[-1])
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
816
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
817
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
818 def _command(self, name, *args):
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 if self.state not in Commands[name]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
821 self.literal = None
41160
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
822 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
823 "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
824 (name, self.state,
0c122fe827d7 Patch #1605192: list allowed states in error messages for imaplib.
Georg Brandl <georg@python.org>
parents: 35488
diff changeset
825 ', '.join(Commands[name])))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
826
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
827 for typ in ('OK', 'NO', 'BAD'):
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
828 if typ in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
829 del self.untagged_responses[typ]
9152
a307656c7788 New version from Piers Lauder, who writes:
Guido van Rossum <guido@python.org>
parents: 8546
diff changeset
830
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
831 if 'READ-ONLY' in self.untagged_responses \
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
832 and not self.is_readonly:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
833 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
834
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
835 tag = self._new_tag()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
836 data = '%s %s' % (tag, name)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
837 for arg in args:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
838 if arg is None: continue
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
839 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
840
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
841 literal = self.literal
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
842 if literal is not None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
843 self.literal = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
844 if type(literal) is type(self._command):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
845 literator = literal
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
846 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
847 literator = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
848 data = '%s {%s}' % (data, len(literal))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
849
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
850 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
851 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
852 self._mesg('> %s' % data)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
853 else:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
854 self._log('> %s' % data)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
855
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
856 try:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
857 self.send('%s%s' % (data, CRLF))
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
858 except (socket.error, OSError), val:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
859 raise self.abort('socket error: %s' % val)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
860
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
861 if literal is None:
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 while 1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
865 # Wait for continuation response
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
866
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
867 while self._get_response():
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
868 if self.tagged_commands[tag]: # BAD/NO?
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
869 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
870
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
871 # Send literal
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
872
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
873 if literator:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
874 literal = literator(self.continuation_response)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
875
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
876 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
877 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
878 self._mesg('write literal size %s' % len(literal))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
879
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
880 try:
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
881 self.send(literal)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
882 self.send(CRLF)
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
883 except (socket.error, OSError), val:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
884 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
885
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
886 if not literator:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
887 break
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
888
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
889 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
890
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
891
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
892 def _command_complete(self, name, tag):
66132
1817b7088d8d Merged revisions 86388 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66129
diff changeset
893 # BYE is expected after LOGOUT
1817b7088d8d Merged revisions 86388 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66129
diff changeset
894 if name != 'LOGOUT':
1817b7088d8d Merged revisions 86388 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66129
diff changeset
895 self._check_bye()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
896 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
897 typ, data = self._get_tagged_response(tag)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
898 except self.abort, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
899 raise self.abort('command: %s => %s' % (name, val))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
900 except self.error, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
901 raise self.error('command: %s => %s' % (name, val))
66132
1817b7088d8d Merged revisions 86388 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66129
diff changeset
902 if name != 'LOGOUT':
1817b7088d8d Merged revisions 86388 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66129
diff changeset
903 self._check_bye()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
904 if typ == 'BAD':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
905 raise self.error('%s command error: %s %s' % (name, typ, data))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
906 return typ, data
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
907
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
908
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
909 def _get_response(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
910
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
911 # Read response and store.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
912 #
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
913 # Returns None for continuation responses,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
914 # otherwise first response line received.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
915
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
916 resp = self._get_line()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
917
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
918 # Command completion response?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
919
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
920 if self._match(self.tagre, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
921 tag = self.mo.group('tag')
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
922 if not tag in self.tagged_commands:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
923 raise self.abort('unexpected tagged response: %s' % resp)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
924
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
925 typ = self.mo.group('type')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
926 dat = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
927 self.tagged_commands[tag] = (typ, [dat])
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
928 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
929 dat2 = None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
930
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
931 # '*' (untagged) responses?
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
932
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
933 if not self._match(Untagged_response, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
934 if self._match(Untagged_status, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
935 dat2 = self.mo.group('data2')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
936
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
937 if self.mo is None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
938 # Only other possibility is '+' (continuation) response...
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
939
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
940 if self._match(Continuation, resp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
941 self.continuation_response = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
942 return None # NB: indicates continuation
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
943
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
944 raise self.abort("unexpected response: '%s'" % resp)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
945
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
946 typ = self.mo.group('type')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
947 dat = self.mo.group('data')
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
948 if dat is None: dat = '' # Null untagged response
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
949 if dat2: dat = dat + ' ' + dat2
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
950
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
951 # Is there a literal to come?
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 while self._match(Literal, dat):
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 # Read literal direct from connection.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
956
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
957 size = int(self.mo.group('size'))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
958 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
959 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
960 self._mesg('read literal size %s' % size)
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
961 data = self.read(size)
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 # Store response with literal as tuple
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 self._append_untagged(typ, (dat, data))
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
966
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
967 # Read trailer - possibly containing another literal
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
968
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
969 dat = self._get_line()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
970
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
971 self._append_untagged(typ, dat)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
972
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
973 # Bracketed response information?
7918
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 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
976 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
977
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
978 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
979 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
980 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
981
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
982 return resp
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
983
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
984
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
985 def _get_tagged_response(self, tag):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
986
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
987 while 1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
988 result = self.tagged_commands[tag]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
989 if result is not None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
990 del self.tagged_commands[tag]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
991 return result
11803
c2286a1c2f29 Patches by Piers Lauder.
Guido van Rossum <guido@python.org>
parents: 11562
diff changeset
992
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
993 # Some have reported "unexpected response" exceptions.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
994 # Note that ignoring them here causes loops.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
995 # Instead, send me details of the unexpected response and
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
996 # I'll update the code in `_get_response()'.
11803
c2286a1c2f29 Patches by Piers Lauder.
Guido van Rossum <guido@python.org>
parents: 11562
diff changeset
997
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
998 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
999 self._get_response()
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1000 except self.abort, val:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1001 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1002 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
1003 self.print_log()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1004 raise
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1007 def _get_line(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
1009 line = self.readline()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1010 if not line:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1011 raise self.abort('socket error: EOF')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1013 # Protocol mandates all lines terminated by CRLF
57663
256e9f00d061 Merged revisions 76726-76727 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 54093
diff changeset
1014 if not line.endswith('\r\n'):
256e9f00d061 Merged revisions 76726-76727 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 54093
diff changeset
1015 raise self.abort('socket error: unterminated line')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1016
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1017 line = line[:-2]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1018 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1019 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
1020 self._mesg('< %s' % line)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1021 else:
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1022 self._log('< %s' % line)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1023 return line
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 _match(self, cre, s):
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 # Run compiled regular expression match method on 's'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1029 # Save result, return success.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1030
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1031 self.mo = cre.match(s)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1032 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1033 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
1034 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
1035 return self.mo is not None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1037
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1038 def _new_tag(self):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1039
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1040 tag = '%s%s' % (self.tagpre, self.tagnum)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1041 self.tagnum = self.tagnum + 1
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1042 self.tagged_commands[tag] = None
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1043 return tag
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1046 def _checkquote(self, arg):
11562
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 # Must quote command args if non-alphanumeric chars present,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1049 # and not already quoted.
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1050
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1051 if type(arg) is not type(''):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1052 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
1053 if len(arg) >= 2 and (arg[0],arg[-1]) in (('(',')'),('"','"')):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1054 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
1055 if arg and self.mustquote.search(arg) is None:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1056 return arg
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1057 return self._quote(arg)
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1058
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1059
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1060 def _quote(self, arg):
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1061
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1062 arg = arg.replace('\\', '\\\\')
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1063 arg = arg.replace('"', '\\"')
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1064
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1065 return '"%s"' % arg
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1066
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1067
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1068 def _simple_command(self, name, *args):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1070 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
1071
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1073 def _untagged_response(self, typ, dat, name):
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1075 if typ == 'NO':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1076 return typ, dat
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 23613
diff changeset
1077 if not name in self.untagged_responses:
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1078 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
1079 data = self.untagged_responses.pop(name)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1080 if __debug__:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1081 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
1082 self._mesg('untagged_responses[%s] => %s' % (name, data))
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1083 return typ, data
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085
21988
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1086 if __debug__:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1087
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1088 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
1089 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
1090 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
1091 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
1092 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
1093 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
1094
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1095 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
1096 # 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
1097 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
1098 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
1099 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
1100 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
1101 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
1102
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1103 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
1104 # 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
1105 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
1106 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
1107 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
1108 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
1109
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1110 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
1111 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
1112 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
1113 while n:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1114 try:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1115 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
1116 except:
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1117 pass
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1118 i += 1
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1119 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
1120 i = 0
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1121 n -= 1
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1122
f92e868eb440 moved command logging routines into IMAP4 class: thread safe/faster
Piers Lauder <piers@cs.su.oz.au>
parents: 21963
diff changeset
1123
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1125 try:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1126 import ssl
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1127 except ImportError:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1128 pass
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1129 else:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1130 class IMAP4_SSL(IMAP4):
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1131
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1132 """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
1133
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1134 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
1135
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1136 host - host's name (default: localhost);
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1137 port - port number (default: standard IMAP4 SSL port).
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1138 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
1139 certfile - PEM formatted certificate chain file (default: None);
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1140
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1141 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
1142 """
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1143
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1144
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1145 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
1146 self.keyfile = keyfile
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1147 self.certfile = certfile
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1148 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
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 open(self, host = '', port = IMAP4_SSL_PORT):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1152 """Setup connection to remote server on "host:port".
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1153 (default: localhost:standard IMAP4 SSL port).
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1154 This connection will be used by the routines:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1155 read, readline, send, shutdown.
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1156 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1157 self.host = host
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1158 self.port = port
54093
88d965be8617 Merged revisions 72662 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 45473
diff changeset
1159 self.sock = socket.create_connection((host, port))
43325
193020bf52dc More work on SSL support.
Bill Janssen <janssen@parc.com>
parents: 43162
diff changeset
1160 self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
70351
0dee36595699 Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid
Charles-François Natali <neologix@free.fr>
parents: 68588
diff changeset
1161 self.file = self.sslobj.makefile('rb')
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 read(self, size):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1165 """Read 'size' bytes from remote."""
70351
0dee36595699 Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid
Charles-François Natali <neologix@free.fr>
parents: 68588
diff changeset
1166 return self.file.read(size)
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1167
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1168
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1169 def readline(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1170 """Read line from remote."""
70351
0dee36595699 Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid
Charles-François Natali <neologix@free.fr>
parents: 68588
diff changeset
1171 return self.file.readline()
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1172
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1173
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1174 def send(self, data):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1175 """Send data to remote."""
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1176 bytes = len(data)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1177 while bytes > 0:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1178 sent = self.sslobj.write(data)
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1179 if sent == bytes:
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1180 break # avoid copy
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1181 data = data[sent:]
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1182 bytes = bytes - sent
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1183
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1184
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1185 def shutdown(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1186 """Close I/O established in "open"."""
70351
0dee36595699 Issue #1441530: In imaplib, use makefile() to wrap the SSL socket to avoid
Charles-François Natali <neologix@free.fr>
parents: 68588
diff changeset
1187 self.file.close()
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1188 self.sock.close()
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1189
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1190
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1191 def socket(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1192 """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
1193
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1194 socket = <instance>.socket()
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1195 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1196 return self.sock
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1197
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1198
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1199 def ssl(self):
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1200 """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
1201
43325
193020bf52dc More work on SSL support.
Bill Janssen <janssen@parc.com>
parents: 43162
diff changeset
1202 ssl = ssl.wrap_socket(<instance>.socket)
43008
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1203 """
4771639fc049 This contains a number of things:
Bill Janssen <janssen@parc.com>
parents: 41160
diff changeset
1204 return self.sslobj
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1205
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
1206 __all__.append("IMAP4_SSL")
22173
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1207
c5c9e36c3909 add SSL class submitted by Tino Lange
Piers Lauder <piers@cs.su.oz.au>
parents: 21988
diff changeset
1208
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
1209 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
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 """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
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 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
1214
59834
9eabba6ded09 Merged revisions 77120,77151,77155,77209,77229,77256,77317,77331,77333,77359-77360,77382,77561,77570 via svnmerge from
Georg Brandl <georg@python.org>
parents: 58075
diff changeset
1215 where "command" is a string that can be passed to subprocess.Popen()
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
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 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
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
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
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 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
1222 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
1223 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
1224
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
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 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
1227 """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
1228 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
1229 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
1230 """
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.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
1232 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
1233 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
1234 self.file = None
58075
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1235 self.process = subprocess.Popen(self.command,
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1236 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1237 shell=True, close_fds=True)
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1238 self.writefile = self.process.stdin
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1239 self.readfile = self.process.stdout
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
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
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 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
1243 """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
1244 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
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
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 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
1248 """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
1249 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
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 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
1253 """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
1254 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
1255 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
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 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
1259 """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
1260 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
1261 self.writefile.close()
58075
747b01a05300 Merged revisions 77222 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57924
diff changeset
1262 self.process.wait()
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
1263
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
1264
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
1265
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1266 class _Authenticator:
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 """Private class to provide en/decoding
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1269 for base64-based authentication conversation.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1270 """
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1271
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1272 def __init__(self, mechinst):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1273 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
1274
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1275 def process(self, data):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1276 ret = self.mech(self.decode(data))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1277 if ret is None:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1278 return '*' # Abort conversation
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1279 return self.encode(ret)
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1280
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1281 def encode(self, inp):
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 # Invoke binascii.b2a_base64 iteratively with
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1284 # short even length buffers, strip the trailing
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1285 # line feed from the result and append. "Even"
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1286 # means a number that factors to both 6 and 8,
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1287 # 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
1288 # there's no partial 6-bit output.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1289 #
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1290 oup = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1291 while inp:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1292 if len(inp) > 48:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1293 t = inp[:48]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1294 inp = inp[48:]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1295 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1296 t = inp
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1297 inp = ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1298 e = binascii.b2a_base64(t)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1299 if e:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1300 oup = oup + e[:-1]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1301 return oup
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1302
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1303 def decode(self, inp):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1304 if not inp:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1305 return ''
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1306 return binascii.a2b_base64(inp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1307
8520
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1308
b94015c0c837 Piers' latest version -- authentication added by Donn Cave.
Guido van Rossum <guido@python.org>
parents: 8458
diff changeset
1309
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1310 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
1311 '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
1312
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1313 def Internaldate2tuple(resp):
67693
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1314 """Parse an IMAP4 INTERNALDATE string.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315
67693
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1316 Return corresponding local time. The return value is a
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1317 time.struct_time instance or None if the string has wrong format.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1318 """
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1319
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1320 mo = InternalDate.match(resp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1321 if not mo:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1322 return None
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1323
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1324 mon = Mon2num[mo.group('mon')]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1325 zonen = mo.group('zonen')
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326
16732
8f034bcee856 Fix previous checkin, hopelessly broken as it was; reported by Detlef Lannert.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16728
diff changeset
1327 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
1328 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
1329 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
1330 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
1331 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
1332 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
1333 zonem = int(mo.group('zonem'))
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 # INTERNALDATE timezone must be subtracted to get UT
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 zone = (zoneh*60 + zonem)*60
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1338 if zonen == '-':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1339 zone = -zone
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1341 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
1342
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1343 utc = time.mktime(tt)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1344
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1345 # Following is necessary because the time module has no 'mkgmtime'.
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1346 # '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
1347
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1348 lt = time.localtime(utc)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1349 if time.daylight and lt[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1350 zone = zone + time.altzone
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1351 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1352 zone = zone + time.timezone
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 return time.localtime(utc - zone)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1355
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1356
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1357
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358 def Int2AP(num):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1359
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1360 """Convert integer to A-P string representation."""
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1361
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1362 val = ''; AP = 'ABCDEFGHIJKLMNOP'
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1363 num = int(abs(num))
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1364 while num:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1365 num, mod = divmod(num, 16)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1366 val = AP[mod] + val
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1367 return val
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1368
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1369
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 def ParseFlags(resp):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1373 """Convert IMAP4 flags response to python tuple."""
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1375 mo = Flags.match(resp)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1376 if not mo:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1377 return ()
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1379 return tuple(mo.group('flags').split())
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 def Time2Internaldate(date_time):
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383
67693
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1384 """Convert date_time to IMAP4 INTERNALDATE representation.
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1385
67693
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1386 Return string in form: '"DD-Mmm-YYYY HH:MM:SS +HHMM"'. The
68588
cd8d3c2d3bce #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68256
diff changeset
1387 date_time argument can be a number (int or float) representing
67693
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1388 seconds since epoch (as returned by time.time()), a 9-tuple
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1389 representing local time (as returned by time.localtime()), or a
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1390 double-quoted string. In the last case, it is assumed to already
b880c8227c02 Merged revisions 88114 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 66136
diff changeset
1391 be in the correct format.
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1392 """
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393
21649
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1394 if isinstance(date_time, (int, float)):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1395 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
1396 elif isinstance(date_time, (tuple, time.struct_time)):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1397 tt = date_time
23878
4f6d31dacd5e Add IMAP4 QUOTA extension methods
Piers Lauder <piers@cs.su.oz.au>
parents: 23694
diff changeset
1398 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
1399 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
1400 else:
195917b7a602 Time2Internaldate(): Call isinstance() once for each of the type tests
Fred Drake <fdrake@acm.org>
parents: 21646
diff changeset
1401 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
1402
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1403 dt = time.strftime("%d-%b-%Y %H:%M:%S", tt)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1404 if dt[0] == '0':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1405 dt = ' ' + dt[1:]
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1406 if time.daylight and tt[-1]:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1407 zone = -time.altzone
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1408 else:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1409 zone = -time.timezone
33597
355b15e4a4da Use floor division operator.
Raymond Hettinger <python@rcn.com>
parents: 33077
diff changeset
1410 return '"' + dt + " %+03d%02d" % divmod(zone//60, 60) + '"'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1411
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1413
11562
c71155ce1215 V 2.16 from Piers:
Guido van Rossum <guido@python.org>
parents: 9426
diff changeset
1414 if __name__ == '__main__':
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1415
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
1416 # 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
1417 # 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
1418 # 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
1419
19227
84b60213159b Remove redundant 'import sys' (PyChecker).
Guido van Rossum <guido@python.org>
parents: 19003
diff changeset
1420 import getopt, getpass
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 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
1423 optlist, args = getopt.getopt(sys.argv[1:], 'd:s:')
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1424 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
1425 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
1426
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
1427 stream_command = None
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1428 for opt,val in optlist:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1429 if opt == '-d':
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1430 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
1431 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
1432 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
1433 if not args: args = (stream_command,)
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1434
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1435 if not args: args = ('',)
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1436
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1437 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
1438
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1439 USER = getpass.getuser()
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
1440 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
1441
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
1442 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
1443 test_seq1 = (
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1444 ('login', (USER, PASSWD)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1445 ('create', ('/tmp/xxx 1',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1446 ('rename', ('/tmp/xxx 1', '/tmp/yyy')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1447 ('CREATE', ('/tmp/yyz 2',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1448 ('append', ('/tmp/yyz 2', None, None, test_mesg)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1449 ('list', ('/tmp', 'yy*')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1450 ('select', ('/tmp/yyz 2',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1451 ('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
1452 ('fetch', ('1', '(FLAGS INTERNALDATE RFC822)')),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1453 ('store', ('1', 'FLAGS', '(\Deleted)')),
18765
cbd22c9027b2 apply patch item #416253
Piers Lauder <piers@cs.su.oz.au>
parents: 18764
diff changeset
1454 ('namespace', ()),
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1455 ('expunge', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1456 ('recent', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1457 ('close', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1458 )
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1459
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1460 test_seq2 = (
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1461 ('select', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1462 ('response',('UIDVALIDITY',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1463 ('uid', ('SEARCH', 'ALL')),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1464 ('response', ('EXISTS',)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1465 ('append', (None, None, None, test_mesg)),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1466 ('recent', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1467 ('logout', ()),
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1468 )
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1469
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1470 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
1471 M._mesg('%s %s' % (cmd, args))
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 27228
diff changeset
1472 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
1473 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
1474 if typ == 'NO': raise dat[0]
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1475 return dat
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 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
1478 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
1479 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
1480 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
1481 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
1482 if M.state == 'AUTH':
26387
fcf9734e1021 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 26336
diff changeset
1483 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
1484 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
1485 M._mesg('CAPABILITIES = %r' % (M.capabilities,))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1486
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1487 for cmd,args in test_seq1:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1488 run(cmd, args)
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1490 for ml in run('list', ('/tmp/', 'yy%')):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1491 mo = re.match(r'.*"([^"]+)"$', ml)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1492 if mo: path = mo.group(1)
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1493 else: path = ml.split()[-1]
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1494 run('delete', (path,))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1495
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1496 for cmd,args in test_seq2:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1497 dat = run(cmd, args)
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 (cmd,args) != ('uid', ('SEARCH', 'ALL')):
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1500 continue
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1501
16484
bf97818dd9e1 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16194
diff changeset
1502 uid = dat[-1].split()
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1503 if not uid: continue
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1504 run('uid', ('FETCH', '%s' % uid[-1],
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1505 '(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1506
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1507 print '\nAll tests OK.'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1509 except:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1510 print '\nTests failed.'
7918
5fab59eb4fa5 Piers Lauder's IMAP module.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1511
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1512 if not Debug:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1513 print '''
12073
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1514 If you would like to see debugging output,
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1515 try: %s -d5
e4943ebb5f7d Piers Lauder:
Guido van Rossum <guido@python.org>
parents: 11874
diff changeset
1516 ''' % sys.argv[0]
7990
de10566dec5c New version doesn't require REV1 capability.
Guido van Rossum <guido@python.org>
parents: 7924
diff changeset
1517
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 12751
diff changeset
1518 raise