a2ccabb9e813069b8776edbf2b98ccee6e1772a1
bn8 Initial commit

bn8 authored 13 years ago

1) #! /usr/bin/env python
2) # -*- coding: utf-8 -*-
3) 
4) # imapt -- Simple command-line tool to test IMAP server
5) # By: Benjamin RENARD <brenard@easter-eggs.com>
6) #
7) # Copyright (C) 2013 Easter-eggs
Benjamin Renard Fixed project URL

Benjamin Renard authored 13 years ago

8) # http://git.zionetrix.net/mailt
bn8 Initial commit

bn8 authored 13 years ago

9) #
10) # This file is part of MailT.
11) #
12) # MailT is free software; you can redistribute it and/or modify
13) # it under the terms of the GNU General Public License as published
14) # by the Free Software Foundation, either version 3 of the License,
15) # or (at your option) any later version.
16) #
17) # MailT is distributed in the hope that it will be useful,
18) # but WITHOUT ANY WARRANTY; without even the implied warranty of
19) # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20) # GNU Affero General Public License for more details.
21) #
22) # You should have received a copy of the GNU General Public License
23) # along with this program.  If not, see <http://www.gnu.org/licenses/>.
24) 
25) from optparse import OptionParser
26) 
27) import os
28) import imaplib
29) 
30) import logging
31) import sys
32) 
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 10 years ago

33) import re
Benjamin Renard Add interactive authenticat...

Benjamin Renard authored 10 years ago

34) import getpass
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 10 years ago

35) 
bn8 Initial commit

bn8 authored 13 years ago

36) parser = OptionParser()
37) 
38) 
39) parser.add_option('-H',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

40) 		  '--host',
41) 		  action="store",
42) 		  type="string",
43) 		  dest="host",
44) 		  help="The IMAP host",
45) 		  default="127.0.0.1")
bn8 Initial commit

bn8 authored 13 years ago

46) 
47) parser.add_option('-p',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

48) 		  '--port',
49) 		  action="store",
50) 		  type="string",
51) 		  dest="port",
52) 		  help="The IMAP port",
53) 		  default=None)
bn8 Initial commit

bn8 authored 13 years ago

54) 
55) parser.add_option('-S',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

56) 		  '--ssl',
57) 		  action="store_true",
58) 		  dest="ssl",
59) 		  help="IMAP Over SSL (IMAPS)",
60) 		  default=False)
bn8 Initial commit

bn8 authored 13 years ago

61) 
62) parser.add_option('-U',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

63) 		  '--user',
64) 		  action="store",
65) 		  type="string",
66) 		  dest="user",
67) 		  help="User login",
68) 		  default=None)
bn8 Initial commit

bn8 authored 13 years ago

69) 
70) parser.add_option('-P',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

71) 		  '--password',
72) 		  action="store",
73) 		  type="string",
74) 		  dest="password",
75) 		  help="User password",
76) 		  default=None)
bn8 Initial commit

bn8 authored 13 years ago

77) 
78) parser.add_option('--md5',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

79) 		  action="store_true",
80) 		  dest="md5",
81) 		  help="Use CRAM-MD5 password for authentication",
82) 		  default=False)
bn8 Initial commit

bn8 authored 13 years ago

83) 
84) parser.add_option('-m',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

85) 		  '--mailbox',
86) 		  action="store",
87) 		  type="string",
88) 		  dest="mailbox",
89) 		  help="The mailbox directory to select",
90) 		  default='INBOX')
bn8 Initial commit

bn8 authored 13 years ago

91) 
92) parser.add_option('-v',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

93) 		  '--verbose',
94) 		  action="store_true",
95) 		  dest="verbose")
bn8 Initial commit

bn8 authored 13 years ago

96) 
Benjamin Renard imapt : add -l/--list param...

Benjamin Renard authored 12 years ago

97) parser.add_option('-l',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

98) 		  '--list',
99) 		  action="store_true",
100) 		  dest="list",
101) 		  help="List mailboxes",
102) 		  default=False)
Benjamin Renard imapt : add -l/--list param...

Benjamin Renard authored 12 years ago

103) 
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 10 years ago

104) parser.add_option('-q',
105) 		  '--quota',
106) 		  action="store_true",
107) 		  dest="quota",
108) 		  help="Display quota informations",
109) 		  default=False)
110) 
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 12 years ago

111) parser.add_option('--expunge',
Benjamin Renard Fix ident

Benjamin Renard authored 10 years ago

112) 		  action="store",
113) 		  type="string",
114) 		  dest="expunge",
115) 		  help="Expunge mailbox specify (ALL to expunge all mailboxes)",
116) 		  default=None)
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 12 years ago

117) 
bn8 Initial commit

bn8 authored 13 years ago

118) (options, args) = parser.parse_args()
119) 
120) if options.verbose:
121) 	loglevel=logging.DEBUG
122) else:
123) 	loglevel=logging.INFO
124) 
125) logging.basicConfig(level=loglevel,format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
126) 
Benjamin Renard Add interactive authenticat...

Benjamin Renard authored 10 years ago

127) if not options.user:
128) 	logging.fatal('You must provide the user login')
bn8 Initial commit

bn8 authored 13 years ago

129) 	sys.exit(1)
130) 
Benjamin Renard Add interactive authenticat...

Benjamin Renard authored 10 years ago

131) if not options.password:
132) 	options.password=getpass.getpass()
133) 
bn8 Initial commit

bn8 authored 13 years ago

134) if options.port is None:
135) 	if options.ssl:
136) 		options.port=993
137) 	else:
138) 		options.port=143
139) 
140) if options.ssl:
141) 	logging.debug('Establish SSL connexion to server')
142) 	try:
143) 		server = imaplib.IMAP4_SSL(options.host,options.port)
144) 		logging.debug('Connected')
145) 	except Exception, e:
146) 		logging.critical("IMAP connection error : %s" % e)
147) 		sys.exit(2)
148) else:
149) 	logging.debug("Establish connexion to server")
150) 	try:
151) 		server = imaplib.IMAP4(options.host,options.port)
152) 		logging.debug('Connected')
153) 	except Exception, e:
154) 		logging.critical("IMAP connection error : %s" % e)
155) 		sys.exit(2)
156) 
157) if options.user:
158) 	try:
159) 		if options.md5:
160) 			logging.debug('Login into server as %s (with CRAM-MD5 password)' % options.user)
161) 			server.login_cram_md5(options.user,options.password)
162) 		else:
163) 			logging.debug('Login into server as %s' % options.user)
164) 			server.login(options.user,options.password)
165) 		logging.debug('Logged')
166) 	except Exception as e:
167) 		logging.critical("IMAP Auth error : %s" % e)
168) 		sys.exit(3)
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 12 years ago

169) 
170) def expunge(server,mailbox):
171) 	logging.info('Expunge %s mailbox' % mailbox)
172) 	try:
173) 		(st,c) = server.select(mailbox)
174) 		if st!='OK':
175) 			logging.error('Error selecting %s mailbox : %s' % (mailbox,st))
176) 			return
177) 		(st,ex) = server.expunge()
178) 		if st=='OK':
179) 			if len(ex)==1 and ex[0] is None:
180) 				logging.info('Mailbox %s expunged, no mail removed' % mailbox)
181) 			else:
182) 				logging.info('Mailbox %s expunged : %s mail(s) removed' % (mailbox,len(ex)))
183) 		else:
184) 			logging.info('Error expunging %s mailbox, return "%s"' % (mailbox,st))
185) 	except Exception as e:
186) 		logging.error('Error expunging %s mailbox : %s' % (mailbox,e))
187) 
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 10 years ago

188) def format_quota(num):
189) 	num=int(num)
190) 	for x in ['KB', 'MB', 'GB', 'TB']:
191) 		if num < 1024.0:
192) 			return "%3.1f %s" % (num, x)
193) 		num /= 1024.0
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 12 years ago

194) 
bn8 Initial commit

bn8 authored 13 years ago

195) try:
Benjamin Renard imapt : add -l/--list param...

Benjamin Renard authored 12 years ago

196) 	if options.list:
197) 		logging.info('List mailbox')
198) 		(status,l) = server.list()
199) 		for d in l:
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 12 years ago

200) 			logging.info('   "%s"' % d.split('"')[3])
201) 	elif options.expunge:
202) 		if options.expunge=='ALL':
203) 			logging.debug("Listing mailboxes")
204) 			(status,l) = server.list()
205) 			for d in l:
206) 				dirname=d.split('"')[3]
207) 				expunge(server,dirname)
208) 		else:
209) 			expunge(server,options.expunge)
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 10 years ago

210) 	elif options.quota:
211) 		logging.debug("Get quota usage")
212) 		ret=server.getquotaroot(options.mailbox)
213) 		logging.debug("IMAP server return : %s" % str(ret))
214) 		# Return example on Dovecot
215) 		# ('OK', [['"INBOX" "User quota"'], ['"User quota" (STORAGE 0 1024)']])
216) 		if isinstance(ret, (list, tuple)):
217) 			for quota in ret[1][1]:
218) 				if quota is None:
219) 					logging.info('No quota defined')
220) 					continue
221) 				parsequota=re.match('^"([^"]*)" \(STORAGE ([0-9]*) ([0-9]*)\)$',quota)
222) 				if parsequota:
223) 					logging.info("Quota %s : %s / %s" % (parsequota.group(1),format_quota(parsequota.group(2)),format_quota(parsequota.group(3))))
224) 				else:
225) 					logging.error("Error parsing quota string from IMAP server : '%s'" % quota)
226) 		else:
227) 			logging.error("Invalid result getting quotas: %s" % ret)
bn8 Initial commit

bn8 authored 13 years ago

228) 	else:
Benjamin Renard imapt : add -l/--list param...

Benjamin Renard authored 12 years ago

229) 		logging.debug("Select mailbox")
230) 		ret = server.select(options.mailbox)
231) 		if len(ret)>0 and ret[0]=='OK':
232) 			logging.info("Mailbox %s content %s message(s)" % (options.mailbox,ret[1][0]))
233) 		else:
234) 			logging.error("Selecting return incorrected : %s" % ret)
235) 		server.close()
bn8 Initial commit

bn8 authored 13 years ago

236) except Exception as e:
Benjamin Renard imapt : fixed typo bug

Benjamin Renard authored 12 years ago

237) 	logging.critical('Error selecting mailbox %s : %s' % (options.mailbox,e))