PopDel.py   [plain text]


# PopDel.py  Copyright Richard Harris 2002
#
# author: Richard Harris (rover@emptydog.com)
# The author releases this file under the GPL
# license. See COPYING for specifics.
#
# See PopDel.manual for the use of this Python class.
# (this isn't currently available)
#
# created: 01 May 02
#
# change log:
# Joshua Crawford, November 2004:
# 	Out of range error fixed
#	Allow for all caps SUBJECT:
#	Display email address
#	Don't prompt for save if no changes
#	Don't clear the screen until we're displaying a menu
#	Check for invalid choice
#	Check all arguments exist
#	Check for errors in POP
#	Return 1 on errors, 0 otherwise
# Hacked to support message ranges by ESR, January 2003.
#
import os, poplib, string, sys

class PopDel:
	HDR = "\nPopDel - Delete messages from popmail - Ver. 0.1"
	BYE = "\n  PopDel Ver.0.1 by Richard Harris\n" +\
		  "     site - http://emptydog.com\n" +\
		  "     email - rover@emptydog.com\n"
	PROMPT1 = "Choose message number to delete or 'q' to quit: "
	PROMPT2 = "Quit or abort: "
	CHOICES = ["Save changes and quit.",
			   "Abort and make no deletions."]
	
	def __init__(self):
		self.done = 0
		self.dirty = 0
		return

	# get user to choose an element from thing
	def query(self, thing, prompt):
		length = len(thing)
		choice = [length+1]
		for i in range(0, length):
			print '(' + `i +  1` + ') ' + thing[i]
		while filter(lambda x: x > length, choice):
			choice = raw_input(prompt)
			if (choice == 'q'):
				self.done = 1
				choice = [-1]
			else:
				try:
					choice = map(int, string.split(choice, "-"))
				except:
					choice = [length + 1]
				if len(choice) > 1:
					choice = range(choice[0], choice[1]+1)
		return choice

	def run(self):
		#log in
		print self.HDR

		subjects = []

		if (len(sys.argv) < 4):
			print 'Usage: ' + sys.argv[0] + ' pop3.host.name username password'
			return 1

		try:
			M = poplib.POP3(sys.argv[1])
		except:
			print 'Could not reach ' + sys.argv[1]
			return 1
		try:
			M.user(sys.argv[2])
		except:
			print 'Bad username ' + sys.argv[2] + '@' + sys.argv[1]
			M.quit()
			return 1
		try:
			M.pass_(sys.argv[3])
		except:
			print 'Bad password for ' + sys.argv[2] + '@' + sys.argv[1]
			M.quit()
			return 1
#		M.set_debuglevel(1)
		try:
			messages = M.list()
		except:
			print 'Error reading listing for ' + sys.argv[2] + '@' + sys.argv[1]
			M.quit()
			return 1

		list = messages[1]
		if (len(list) == 0):
			M.quit()
			print '\nNo messages for ' + sys.argv[2] + '@' + sys.argv[1]
		else:
			for entry in list:
				tokens = string.split(entry)
				try:
					head = M.top(int(tokens[0]), 32)
				except:
					print 'Error issuing TOP command for ' + sys.argv[2] + '@' + sys.argv[1]
					if self.dirty:
						M.rset()
					M.quit()
					return 1
				for line in head[1]:
					if (string.find(string.upper(line), 'SUBJECT:') == 0):
						subject = string.replace(line, 'Subject:','')
						subject = string.replace(subject, 'SUBJECT:','')
						subject = subject + ' - ' + tokens[1] + ' octets'
						subjects.append(subject)
						break

			while not self.done:
				os.system('clear')
				print self.HDR
				print '\nMessages for ' + sys.argv[2] + '@' + sys.argv[1] + ':'
				msglist = self.query(subjects, self.PROMPT1)
				print "Choice:", msglist
				for msg in msglist:
					if (msg > 0):
						try:
							M.dele(msg)
						except:
							print 'Error deleting message #' + `msg`
							if self.dirty:
								M.rset()
							M.quit()
							return 1
						self.dirty = 1
						subjects[msg-1] = subjects[msg-1] + ' -X-'

			if not self.dirty:
				M.quit()
			else:
				print '\nExit Options:'
				choice = self.query(self.CHOICES, self.PROMPT2)
				print "Choice:", choice
				if (choice == [1]):		# commit changes and quit
					M.quit()
				else:				# reset and quit
					M.rset()
					M.quit()


		print self.BYE
		return


#-----------------main
obj = PopDel()
sys.exit(obj.run())