ce code permet par voie graphique de se connecter a un serveur POP et de recuperer la liste
des 10 messages les plus volumineux (enfin , juste le sujet , qui vous l a envoyé et la taille),et en cliquant ,on peut avoir un extrait du corps du message.Mais surtout , l interet est de pouvoir effacer les gros messages du serveur pop par voie graphique .
c est fonctionnel mais tres tres loin d etre parfait.
Source / Exemple :
import socket
from poplib import *
import gtk
import gtk.glade
#define constant to represent how many messages will be displayed in listbox
MESSAGE_NB=9
#define constant to define how many lines of mail are displayed when selecting one in list
LINES_NB=50
ui = gtk.glade.XML("pophelper.glade")
#define default connection icone
ui.get_widget("icone").set_from_file("notconnected.png")
#define slots
#connect button clicked:make the connections and get biggest messages
def on_connect(source=None, event=None):
#first make a connection
global conn
global goodlist
#inform user we re trying to connect
ui.get_widget("connectionstate").set_text("connecting to server...please wait")
server= ui.get_widget("server").get_text()
user= ui.get_widget("user").get_text()
password= ui.get_widget("password").get_text()
try:
conn=POP3(server)
except socket.error:
ui.get_widget("connectionstate").set_text("problem with connection")
##return 1
#if we are here ,we can connect
try:
conn.user(user)
conn.pass_(password)
except:
#user/password is incorrect or malformated
conn.quit()
#after connection, get 10 messages with biggest size and construct listmessages treeview
liste=conn.list()[1:2]
tube=["liste des tailles des mails"]
for i in range(len(liste[0])):
tube.append(int(liste[0][i].split()[1]))
#now we have list , we need to get MESSAGE_NB most voluminous
#create the list where well store all that
goodlist=[]
for i in range(MESSAGE_NB):
goodlist.append((maxetindice(tube)[0],maxetindice(tube)[1]))
tube[maxetindice(tube)[0]]=0
##print goodlist
#ui.get_widget("connectionstate").set_text("connected to:"+ui.get_widget("server").get_text())
ui.get_widget("icone").set_from_file("connected.png")
ui.get_widget("totalsize").set_text("espace total occupe:"+str(taille_msg(goodlist))+"ko")
#help function that actually fills the listbox with the messages
construire_arbre()
ui.get_widget("connectionstate").set_text("connected to:"+ui.get_widget("server").get_text())
#delete button cliked:delete selected message
def on_delete_cliked(source=None, event=None):
ui.get_widget("connectionstate").set_text("deleting selected message")
#get selected item from listmessages and erase it
global goodlist
##print goodlist[ui.get_widget("listmessages").get_cursor()[0][0]][0]
conn.dele(goodlist[ui.get_widget("listmessages").get_cursor()[0][0]][0])
#we should also blank the textview,the line in the treeview,and maybe notify the
#the action done on the bottom of the application
#first calculate our goodlist again...
liste=conn.list()[1:2]
tube=["liste des tailles des mails"]
for i in range(len(liste[0])):
tube.append(int(liste[0][i].split()[1]))
#now we have list , we need to get MESSAGE_NB most voluminous
#create the list where well store all that
goodlist=[]
for i in range(MESSAGE_NB):
goodlist.append((maxetindice(tube)[0],maxetindice(tube)[1]))
tube[maxetindice(tube)[0]]=0
##print goodlist
#quickest way to get tree logically filled again
construire_arbre()
#quickest way to blank the textview
buffer=ui.get_widget("messagebody").get_buffer()
buffer.set_text("")
#calculate new total size
ui.get_widget("totalsize").set_text("espace total occupe:"+str(taille_msg(goodlist))+"ko")
#inform that we have deleted
ui.get_widget("connectionstate").set_text("message deleted")
#quit button cliked:stop current connection(if any)
def on_quit(source=None, event=None):
global conn
try:
conn.quit()
except:
ui.get_widget("connectionstate").set_text("conn died before...sorry")
#clear all info about last connection
ui.get_widget("connectionstate").set_text("not connected")
ui.get_widget("server").set_text("")
ui.get_widget("user").set_text("")
ui.get_widget("password").set_text("")
#ui.get_widget("messagesnb").set_text("")
ui.get_widget("icone").set_from_file("notconnected.png")
#call construire_arbre with blank parameter set to 1
construire_arbre(1)
#and clear text area
buffer=ui.get_widget("messagebody").get_buffer()
buffer.set_text("")
#and clear total size label
ui.get_widget("totalsize").set_text("espace total occupe:")
#cursor on given message:print body of selected message in list
def on_listmessages_cursor(source=None, event=None):
#get index in listmessages
res=ui.get_widget("listmessages").get_cursor()
goodnumber=res[0][0]
##print goodnumber
##print goodlist[goodnumber][0]
buffer=ui.get_widget("messagebody").get_buffer()
#first get real place where the text body begins...
nb_firstline=len(conn.top(goodlist[goodnumber][0],1)[1:2][0])-1
if not (conn.top(goodlist[goodnumber][0],1)[1:2][0][nb_firstline].startswith("--") or conn.top(goodlist[goodnumber][0],1)[1:2][0][nb_firstline].startswith("This is")):
mail=conn.top(goodlist[goodnumber][0],LINES_NB)[1:2][0][nb_firstline:]
mytexte=""
for text in mail:
##print text
mytexte +="\n"+text
buffer.set_text(mytexte)
else:
buffer.set_text("mail is mainly an attachment")
#help function that actually fills the listbox with the messages
def construire_arbre(clear=0):
#goodlist contains the message numbers and their size
global goodlist
global treestore
#creater store with one column
treestore = gtk.ListStore(str)
ui.get_widget("listmessages").set_model(treestore)
cell0 = gtk.CellRendererText()
#definition de la colonne 0
Col0 = gtk.TreeViewColumn("From"+" "*15+"Subject"+" "*30+"size ", cell0, text=0)
ui.get_widget("listmessages").append_column(Col0)
if not clear==1: #if clear==1 we wont fill the tree,just use to clear
#get 10 messages from: , subject:
for i in range(len(goodlist)):
#we get the text right....
goodlist[i][0]
rowbrute= conn.top(goodlist[i][0],1)[1:2][0]
fromtxt=""
subject=""
for j in rowbrute:
if j.startswith("From:"):
fromtxt=j[5:]
if j.startswith("Subject:"):
subjecttxt=j[8:]
# Add lines corresponding to messages
row1= ([fromtxt+"\t"+"\t"+subjecttxt+"\t"+str(int(goodlist[i][1]/1000))+"Ko"])
treestore.append(row1)
#help function to get max and index in list message
def maxetindice(list):
liste=list[1:]
max=0
indice=0
for i in range(len(liste)):
if max<liste[i]:
max=liste[i]
indice=i
return indice+1,max
#help function to get total size of display messages
def taille_msg(liste):
taille=0
for i in liste:
taille += i[1]
return taille
#2-without class:how to connect slots to our functions
ui.signal_autoconnect(globals())
#main loop waiting for gui events....
gtk.main()
Conclusion :
ce serait bien sur plus simple a coder (voire plus efficace) en ligne de commandes mais mon interet etait surtout de reutiliser glade,donc glade requis pour faire marcher le tout...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.