Un notificateur de mail en python

Vous utilisez certainement un notificateur de mail. Vous savez, ce petit programme (plugin, application, desklet, etc) qui vous prévient en temps réel que vous avez un nouveau courriel. Vous voulez savoir comment cela fonctionne ? Vous avez besoin d’une base pour commencer à écrire le votre ? Alors suivez le guide.

Le programme notification.py

Licence LGPL

Le petit programme (sous licence LGPL) que je vous propose ici va vérifier, à intervalle régulier, si des nouveaux mails sont arrivés sur un de vos comptes. Le programme est à lancer dans un terminal. Il n’y a rien de graphique, juste la base.
Il fonctionne avec des adresses email chez free.fr, et certainement plein d’autres. Il ne fonctionne pas (mais on peut très facilement l’adapter) avec un compte Gmail, par exemple, car celui-ci utilise une connexion SSL, c’est à dire plus sécurisée.
Donc, si vous n’avez pas de compte mail qui va bien, créez le avant de lire la suite…

Les imports

# -*- coding: utf-8 -*-
import poplib
import time

Pour communiquer avec le serveur de mail, nous utiliserons le protocole POP3. C’est la raison pour laquelle nous importons le module poplib. Ce module définit deux classes, poplib.POP3 et poplib.POP3_SSL, dont l’API est identique (elle comporte une quinzaine de méthodes). Lorsque vous aurez compris comment fonctionne la classe poplib.POP3, il vous sera très facile d’adapter ce programme pour vous connecter à Gmail, par exemple.

Nous verrons le pourquoi du module time plus tard.

La classe CompteEmail

class CompteEmail:
    """
    Je représente un compte email, chez un fournisseur.
    """
    def __init__(self):
        self.serveur = ''
        self.identifiant = ''
        self.motDePasse = ''

    def set(self, serveur, identifiant, motDePasse):
        self.serveur = serveur
        self.identifiant = identifiant
        self.motDePasse = motDePasse

Ce n’est pas la partie la plus intéressante du programme ! C’est juste une classe qui représente votre compte mail. Je l’ai simplifiée au maximum dans un souci de clarté et de concision. Elle contient les informations minimales dont nous auront besoin pour nous connecter au serveur de mail.

La classe Notification

class Notification:
    """
    Je notifie, à intervalle régulier, le nombre d'emails d'un
    compte donné.
    """
    def __init__(self):
        self.compte = None
        self.nombreDeMail = 0

    def set(self, compte):
        self.compte = compte

Le membre de classe self.compte contiendra une instance de la classe CompteEmail, définie précédemment. Nous garderons une trace du nombre de messages présents sur le serveur grâce au membre self.nombreDeMail.

    def verifieMail(self):
        """
        Je me connecte par pop3 au compte mail pour connaitre le nombre
        de mails présent sur le serveur. Quand le nombre de mails
        changent, j'écris un message sur le terminal.
        """
        connexion = poplib.POP3(self.compte.serveur)
        connexion.user(self.compte.identifiant)
        connexion.pass_(self.compte.motDePasse)
        numMessages = connexion.stat()[0]

        if numMessages != self.nombreDeMail:
            self.nombreDeMail = numMessages
            if self.nombreDeMail != 0:
                print '%d email(s) en attente.' % (numMessages)
        connexion.quit()

C’est ici que tout se joue !
D’abord, nous établissons une connexion au serveur POP3, simplement en créant une instance de la classe poplib.POP3. Ensuite nous nous identifions sur le serveur, comme le veut le protocole POP3. Cela se fait en utilisant la méthode user() puis la méthode pass_().
Une fois connecté et authentifié, il nous faut récupérer le nombre de message sur notre serveur. Rien de plus facile grâce à la méthode stat(), qui renvoie un tuple (nombre de messages, taille de la boite aux lettres).
Si le nombre de message a changé, il nous faut mettre à jour le membre self.nombreDeMail et décider s’il faut, ou non, prévenir l’utilisateur.
Finalement, nous mettons proprement fin à la connexion avec la méthode quit().

    def commence(self):
        """
        Je demande la vérification du nombre de mail toutes les minutes.
        Comme je suis une boucle infinie, vous devrez tapez Ctrl+C pour
        mettre fin au programme.
        """
        while True:
            self.verifieMail()
            time.sleep(60)

Voici la boucle principale de notre petit programme. Nous vérifions les nouveaux messages puis, nous endormons le programme pendant 60 secondes grâce à la méthode sleep() du module time. Le cycle se répète à l’infini, c’est pourquoi il vous faudra faire un Ctrl+C pour terminer le programme.
Cette méthode est brutale et sa pratique n’est pas à encourager. Malgré cela, elle convient très bien pour ce petit exemple.

Le lancement

if __name__ == "__main__":
    compte = CompteEmail()
    compte.set('pop.free.fr', 'votre.pseudo@free.fr', 'motdepasse')
    notif = Notification()
    notif.set(compte)
    notif.commence()

On crée d’abord un compte puis une instance de la classe Notification. Il ne reste plus qu’à lancer la boucle…
N’oubliez pas de remplacer les informations de serveur, pseudo, et mot de passe, par les votres !

Execution

Lancez un terminal dans le dossier du programme notification.py, puis tapez :

python ./notification.py

Si il y a au moins un message non lu sur votre compte, vous en serez informé immédiatement. Ecrivez vous un mail, puis attendez quelques instants pour voir que la notification fonctionne bien. Quand vous avez terminé de tester, arrêtez le programme avec Ctrl+C.

Conclusion

Python permet de mettre en oeuvre très rapidement le protocole POP3. Dans le programme notification.py, nous n’avons fait que nous tenir au courant du nombre de courriel en attente de lecture, mais sachez que la réception, ou même l’envoi d’un courriel ne demanderait pas beaucoup plus d’effort. Et si vous écriviez votre propre client de messagerie ?

Enfin, quelques points peuvent être facilement améliorés dans le programme notification.py :

  • gestion des exceptions
  • comptes email multiples
  • fichier de configuration, pour les comptes, l’intervalle de vérification, etc
  • mise en oeuvre de SSL, notamment pour les comptes Gmail

Tous cela pourrait faire le sujet de prochains billets…

Références

Le site de python http://python.org/

La documentation du module poplib http://docs.python.org/library/poplib.html

Le protocole de communication POP3 http://tools.ietf.org/html/rfc1725.html

Publicités

, , , , , ,

  1. #1 par Mickael le 07/03/2012 - 12:01

    Il y a t’il du nouveau pour la mise en oeuvre de SSL notamment pour les comptes Gmail?

    Mickael

  2. #2 par Gabkarecmil = on est des developeurs le 17/05/2015 - 19:57

    Pour SSL :
    l.7 : connexion = poplib.POP3_SSL(self.compte.serveur)

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :