f9d216e372905c997144d51df198511fd53c440e
bn8 Initial commit

bn8 authored 11 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 11 years ago

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

bn8 authored 11 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 9 years ago

33) import re
34) 
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

Benjamin Renard authored 11 years ago

102) 
Benjamin Renard Add display IMAP quota feature

Benjamin Renard authored 9 years ago

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

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

Benjamin Renard authored 11 years ago

116) 
bn8 Initial commit

bn8 authored 11 years ago

117) (options, args) = parser.parse_args()
118) 
119) if options.verbose:
120) 	loglevel=logging.DEBUG
121) else:
122) 	loglevel=logging.INFO
123) 
124) logging.basicConfig(level=loglevel,format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
125) 
126) if not options.user or not options.password:
127) 	logging.fatal('You must provide the user login and password')
128) 	sys.exit(1)
129) 
130) if options.port is None:
131) 	if options.ssl:
132) 		options.port=993
133) 	else:
134) 		options.port=143
135) 
136) if options.ssl:
137) 	logging.debug('Establish SSL connexion to server')
138) 	try:
139) 		server = imaplib.IMAP4_SSL(options.host,options.port)
140) 		logging.debug('Connected')
141) 	except Exception, e:
142) 		logging.critical("IMAP connection error : %s" % e)
143) 		sys.exit(2)
144) else:
145) 	logging.debug("Establish connexion to server")
146) 	try:
147) 		server = imaplib.IMAP4(options.host,options.port)
148) 		logging.debug('Connected')
149) 	except Exception, e:
150) 		logging.critical("IMAP connection error : %s" % e)
151) 		sys.exit(2)
152) 
153) if options.user:
154) 	try:
155) 		if options.md5:
156) 			logging.debug('Login into server as %s (with CRAM-MD5 password)' % options.user)
157) 			server.login_cram_md5(options.user,options.password)
158) 		else:
159) 			logging.debug('Login into server as %s' % options.user)
160) 			server.login(options.user,options.password)
161) 		logging.debug('Logged')
162) 	except Exception as e:
163) 		logging.critical("IMAP Auth error : %s" % e)
164) 		sys.exit(3)
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

Benjamin Renard authored 11 years ago

190) 
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

192) 	if options.list:
193) 		logging.info('List mailbox')
194) 		(status,l) = server.list()
195) 		for d in l:
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

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

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

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