How do you delete email from a mail server without downloading or reading it all?
Why? Maybe you got a huge load of spam and you need to delete it. Maybe you have your laptop set up to keep a copy of your mail on the server so you can get it on your desktop later ... but after a while you realize it's not worth downloading all that mail again. In my case, I use an ISP that keeps copies of all mail forwarded from one alias to another, so I periodically need to clean out the copies.
There are quite a few reasons you might want to delete mail without reading it ... so I was surprised to find that there didn't seem to be any easy way to do so.
But POP3 is a fairly simple protocol. How hard could it be to write a Python script to do what I needed?
Not hard at all, in fact. The poplib package does most of the work for you, encapsulating both the networking and the POP3 protocol. It even does SSL, so you don't have to send your password in the clear.
Once you've authenticated, you can list() messages, which gives you a status and a list of message numbers and sizes, separated by a space. Just loop through them and delete each one.
Here's a skeleton program to delete messages:
server = "mail.example.com" port = 995 user = "myname" passwd = "seekrit" pop = poplib.POP3_SSL(server, port) pop.user(user) pop.pass_(passwd) poplist = pop.list() if poplist.startswith('+OK') : msglist = poplist for msgspec in msglist : # msgspec is something like "3 3941", # msg number and size in octets msgnum = int(msgspec.split(' ')) print "Deleting msg %d\r" % msgnum, pop.dele(msgnum) else : print "No messages for", user else : print "Couldn't list messages: status", poplist pop.quit()
Of course, you might want to add more error checking, loop through a list of users, etc. Here's the full script: deletemail.
[ 16:41 Aug 25, 2011 More programming | permalink to this entry | comments ]