Piers Lauder:
This patch fixes the "search" command in imaplib. The problem was that a search can take multiple arguments, but as defined, would only accept one. I have also made changes to the test code at the end to be less verbose by default, but to accept a verbosity argument.
This commit is contained in:
parent
84306246f1
commit
66d4513975
|
@ -15,7 +15,7 @@ Public functions: Internaldate2tuple
|
||||||
#
|
#
|
||||||
# Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998.
|
# Authentication code contributed by Donn Cave <donn@u.washington.edu> June 1998.
|
||||||
|
|
||||||
__version__ = "2.33"
|
__version__ = "2.36"
|
||||||
|
|
||||||
import binascii, re, socket, string, time, random, sys
|
import binascii, re, socket, string, time, random, sys
|
||||||
|
|
||||||
|
@ -446,17 +446,17 @@ class IMAP4:
|
||||||
return self._simple_command('RENAME', oldmailbox, newmailbox)
|
return self._simple_command('RENAME', oldmailbox, newmailbox)
|
||||||
|
|
||||||
|
|
||||||
def search(self, charset, criteria):
|
def search(self, charset, *criteria):
|
||||||
"""Search mailbox for matching messages.
|
"""Search mailbox for matching messages.
|
||||||
|
|
||||||
(typ, [data]) = <instance>.search(charset, criteria)
|
(typ, [data]) = <instance>.search(charset, criterium, ...)
|
||||||
|
|
||||||
'data' is space separated list of matching message numbers.
|
'data' is space separated list of matching message numbers.
|
||||||
"""
|
"""
|
||||||
name = 'SEARCH'
|
name = 'SEARCH'
|
||||||
if charset:
|
if charset:
|
||||||
charset = 'CHARSET ' + charset
|
charset = 'CHARSET ' + charset
|
||||||
typ, dat = self._simple_command(name, charset, criteria)
|
typ, dat = apply(self._simple_command, (name, charset) + criteria)
|
||||||
return self._untagged_response(typ, dat, name)
|
return self._untagged_response(typ, dat, name)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1022,10 +1022,20 @@ if __debug__:
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
import getpass, sys
|
import getopt, getpass, sys
|
||||||
|
|
||||||
host = ''
|
try:
|
||||||
if sys.argv[1:]: host = sys.argv[1]
|
optlist, args = getopt.getopt(sys.argv[1:], 'd:')
|
||||||
|
except getopt.error, val:
|
||||||
|
pass
|
||||||
|
|
||||||
|
for opt,val in optlist:
|
||||||
|
if opt == '-d':
|
||||||
|
Debug = int(val)
|
||||||
|
|
||||||
|
if not args: args = ('',)
|
||||||
|
|
||||||
|
host = args[0]
|
||||||
|
|
||||||
USER = getpass.getuser()
|
USER = getpass.getuser()
|
||||||
PASSWD = getpass.getpass("IMAP password for %s on %s" % (USER, host or "localhost"))
|
PASSWD = getpass.getpass("IMAP password for %s on %s" % (USER, host or "localhost"))
|
||||||
|
@ -1039,7 +1049,7 @@ if __name__ == '__main__':
|
||||||
('append', ('/tmp/yyz 2', None, None, test_mesg)),
|
('append', ('/tmp/yyz 2', None, None, test_mesg)),
|
||||||
('list', ('/tmp', 'yy*')),
|
('list', ('/tmp', 'yy*')),
|
||||||
('select', ('/tmp/yyz 2',)),
|
('select', ('/tmp/yyz 2',)),
|
||||||
('search', (None, '(TO zork)')),
|
('search', (None, 'SUBJECT', 'test')),
|
||||||
('partial', ('1', 'RFC822', 1, 1024)),
|
('partial', ('1', 'RFC822', 1, 1024)),
|
||||||
('store', ('1', 'FLAGS', '(\Deleted)')),
|
('store', ('1', 'FLAGS', '(\Deleted)')),
|
||||||
('expunge', ()),
|
('expunge', ()),
|
||||||
|
@ -1063,26 +1073,39 @@ if __name__ == '__main__':
|
||||||
_mesg('%s => %s %s' % (cmd, typ, dat))
|
_mesg('%s => %s %s' % (cmd, typ, dat))
|
||||||
return dat
|
return dat
|
||||||
|
|
||||||
Debug = 5
|
try:
|
||||||
M = IMAP4(host)
|
M = IMAP4(host)
|
||||||
_mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
|
_mesg('PROTOCOL_VERSION = %s' % M.PROTOCOL_VERSION)
|
||||||
|
|
||||||
for cmd,args in test_seq1:
|
for cmd,args in test_seq1:
|
||||||
run(cmd, args)
|
run(cmd, args)
|
||||||
|
|
||||||
for ml in run('list', ('/tmp/', 'yy%')):
|
for ml in run('list', ('/tmp/', 'yy%')):
|
||||||
mo = re.match(r'.*"([^"]+)"$', ml)
|
mo = re.match(r'.*"([^"]+)"$', ml)
|
||||||
if mo: path = mo.group(1)
|
if mo: path = mo.group(1)
|
||||||
else: path = string.split(ml)[-1]
|
else: path = string.split(ml)[-1]
|
||||||
run('delete', (path,))
|
run('delete', (path,))
|
||||||
|
|
||||||
for cmd,args in test_seq2:
|
for cmd,args in test_seq2:
|
||||||
dat = run(cmd, args)
|
dat = run(cmd, args)
|
||||||
|
|
||||||
if (cmd,args) != ('uid', ('SEARCH', 'ALL')):
|
if (cmd,args) != ('uid', ('SEARCH', 'ALL')):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
uid = string.split(dat[-1])
|
uid = string.split(dat[-1])
|
||||||
if not uid: continue
|
if not uid: continue
|
||||||
run('uid', ('FETCH', '%s' % uid[-1],
|
run('uid', ('FETCH', '%s' % uid[-1],
|
||||||
'(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
|
'(FLAGS INTERNALDATE RFC822.SIZE RFC822.HEADER RFC822.TEXT)'))
|
||||||
|
|
||||||
|
print '\nAll tests OK.'
|
||||||
|
|
||||||
|
except:
|
||||||
|
print '\nTests failed.'
|
||||||
|
|
||||||
|
if not Debug:
|
||||||
|
print '''
|
||||||
|
If you would like to see debugging output,
|
||||||
|
try: %s -d5
|
||||||
|
''' % sys.argv[0]
|
||||||
|
|
||||||
|
raise
|
||||||
|
|
Loading…
Reference in New Issue