e5b04b88d454b2280ca3a7b7269696a092dc029b
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) 
33) parser = OptionParser()
34) 
35) 
36) parser.add_option('-H',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

43) 
44) parser.add_option('-p',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

51) 
52) parser.add_option('-S',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

58) 
59) parser.add_option('-U',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

66) 
67) parser.add_option('-P',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

74) 
75) parser.add_option('--md5',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

80) 
81) parser.add_option('-m',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

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

bn8 authored 11 years ago

88) 
89) parser.add_option('-v',
Benjamin Renard Fix ident

Benjamin Renard authored 9 years ago

90) 		  '--verbose',
91) 		  action="store_true",
92) 		  dest="verbose")
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

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

Benjamin Renard authored 11 years ago

100) 
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 11 years ago

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

Benjamin Renard authored 9 years ago

102) 		  action="store",
103) 		  type="string",
104) 		  dest="expunge",
105) 		  help="Expunge mailbox specify (ALL to expunge all mailboxes)",
106) 		  default=None)
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 11 years ago

107) 
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

156) 
157) def expunge(server,mailbox):
158) 	logging.info('Expunge %s mailbox' % mailbox)
159) 	try:
160) 		(st,c) = server.select(mailbox)
161) 		if st!='OK':
162) 			logging.error('Error selecting %s mailbox : %s' % (mailbox,st))
163) 			return
164) 		(st,ex) = server.expunge()
165) 		if st=='OK':
166) 			if len(ex)==1 and ex[0] is None:
167) 				logging.info('Mailbox %s expunged, no mail removed' % mailbox)
168) 			else:
169) 				logging.info('Mailbox %s expunged : %s mail(s) removed' % (mailbox,len(ex)))
170) 		else:
171) 			logging.info('Error expunging %s mailbox, return "%s"' % (mailbox,st))
172) 	except Exception as e:
173) 		logging.error('Error expunging %s mailbox : %s' % (mailbox,e))
174) 
175) 
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

177) 	if options.list:
178) 		logging.info('List mailbox')
179) 		(status,l) = server.list()
180) 		for d in l:
Benjamin Renard imapt : Add --expunge param...

Benjamin Renard authored 11 years ago

181) 			logging.info('   "%s"' % d.split('"')[3])
182) 	elif options.expunge:
183) 		if options.expunge=='ALL':
184) 			logging.debug("Listing mailboxes")
185) 			(status,l) = server.list()
186) 			for d in l:
187) 				dirname=d.split('"')[3]
188) 				expunge(server,dirname)
189) 		else:
190) 			expunge(server,options.expunge)
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

192) 		logging.debug("Select mailbox")
193) 		ret = server.select(options.mailbox)
194) 		if len(ret)>0 and ret[0]=='OK':
195) 			logging.info("Mailbox %s content %s message(s)" % (options.mailbox,ret[1][0]))
196) 		else:
197) 			logging.error("Selecting return incorrected : %s" % ret)
198) 		server.close()
bn8 Initial commit

bn8 authored 11 years ago

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

Benjamin Renard authored 11 years ago

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