Code python notification de mail

Résolu
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 Ambassadeur - 27 mars 2024 à 18:52
-

Bonjour,

J'ai voulu tester un code python pour être averti de l'arrivée d'un mail dans ma messagerie SFR. Je ne sais s'il est correct :

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


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


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


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()


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)


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

Je l'exécute ainsi dans la console pycharm :

python ./notification.py

A voir également:

11 réponses

Je ne sais pas pour ton environnement, je n'utilise pas le même, juste le python de base. Pour le répertoire en trop c'est peut être qu'il faut le retirer des variables d'environnement, la variable PATH de Windows

Voilà un exemple de code simple IMAP

import imaplib

# Configuration
server = "outlook.office365.com"
user = "xxxx@outlook.fr"
password = "yyyy"

# Connexion au serveur
try:
    mail = imaplib.IMAP4_SSL(server)
    mail.login(user, password)
    mail.select("Inbox")
except:
    print('Anomalie de connexion',server)
else:
  (retcode, messages) = mail.search(None, '(UNSEEN)')
  if retcode == 'OK':
    nonlus = len(messages[0].split())
  else:
    nonlus = "?"

  (retcode, messages) = mail.search(None, '(SEEN)')
  if retcode == 'OK':
    lus = len(messages[0].split())
  else:
    lus = "?"

  print(user, "messages (non lus/lus) :",nonlus,"/",lus)

J'avais essayé le code POP il fonctionnait pour free, laposte, et certains comptes microsoft mais pas tous, et pas pour Gmail. Le code en IMAP fonctionne sur free, laposte, tous les comptes microsoft. Mais pas pour les comptes Gmail qui nécessitent une authentification particulière avec une ouverture de session.


1
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 1 255
21 avril 2024 à 21:05

Merci, je le testerai et je te redis. 

0

Bonjour,

Ce programme, légèrement remis en forme, et passage instruction print en python 3 fonctionne, en donnant un compte mail free et son mot de passe. Pour sfr il te faut en plus changer le pop.free.fr peut être, mais pas sur, par pop.sfr.fr

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


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


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

    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()

    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)


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


0

tes indentations ne sont toujours pas bonnes, utilise

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


class CompteEmail:
    """
    je représente un compte mail, 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

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

            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()

            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)


if __name__ == "__main__":
    compte = CompteEmail()
    compte.set('pop.sfr.fr', '@club-internet.fr', '')
    notif = Notification()
    notif.set(compte)
    notif.commence()


le code fonctionne, réponse 6001 emails

je supprime ton lien vers le fichier déposé puisque tu donnes compte et mot de passe :-/


0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 1 255
30 mars 2024 à 19:06

Ok, merci bien jee pee, mon compte et mdp c'était pour que tu vois bien mes erreurs. Je te fais confiance !

Corrigé les indentations, cela fonctionne :)

J'ai du mal avec elles, ces blocs de code, faut souvent décaler et je n'ai pas le sens de savoir quand le faire ! C'est tout un monde à apprendre la programmation, déjà à partir d'une idée, il faut savoir comment débuter le code, avec def ou if ou autre. Je n'ai que les bases, mes notes papiers, après les cours de l'école française. Il faut faire plein d'excercices pour capter le sens de tout cela.

ps : je pense qu'avec des adresses outlook et yahoo ce serait différent, car ce n'est pas un protocole pop ?

1

Si on n'est pas déjà un programmeur expérimenté, pour se lancer dans un nouveau langage, il ne faut pas bruler les étapes. Il faut attaquer par une formation, et suivre toutes les étapes qu'elle propose, pas juste picorer ce qui semble intéressant, on rate des bases indispensables. Comme là dans Python le formalisme des lignes source. C'est une notion pas habituelle, dans d'autres langages on va faire de la mise en forme pour rendre le source plus lisible, mais l'interpréteur ou le compilateur du langage s'en moque, pas Python.

Des instructions comme class, def, for, if, while ..., constituent des débuts de blocs de lignes source. Cette ligne d'entête de bloc se termine par :

Les lignes qui suivent constituent le corps du bloc, le corps du bloc est indenté par rapport au titre du bloc, et les lignes du bloc sont alignées. Un bloc peut contenir un autre bloc, le second sera donc indenté par rapport au bloc père.

La plupart des messageries ont un service pop : https://www.commentcamarche.net/applis-sites/mail/981-pop-imap-smtp-adresses-serveurs-mail/ Mais certaines demandent un paramétrage particulier, comme un port ou une connexion SSL, options qui ne sont peut être pas présentes soit dans ton source, soit dans la bibliothèque utilisée.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

SI tu regardes l'article sur les serveurs POP des différents fournisseurs de mails, on voit qu'Outlook est en SSL. Pour un serveur POP en SSL, la bibliothèque Python utilisée comporte une classe différente : https://docs.python.org/3/library/poplib.html

Il faut alors changer le source, et remplacer

        connexion = poplib.POP3(self.compte.serveur)

par

        connexion = poplib.POP3_SSL(self.compte.serveur)

0

Et comment veux tu que l'on fasse sans le code source correspondant ? Sauf si comme la première fois tu as une erreur d'indentation.


0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 Ambassadeur 1 255
22 avril 2024 à 17:41

Re jee pee,

Ton code fonctionne parfaitement, un grand merci !

Tu l'as crée toi même? Ou tu t'es inspiré d'un modèle !

Pour la variable d'environnement, python version 312 qui à été désinstallée, s'il reste des fichiers dans le répertoire, il faut les supprimer, c'est ça que tu veux me dire ?


0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 Ambassadeur 1 255
24 avril 2024 à 12:36

Bonjour,

Voici un code pour notification de mail sur messagerie yahoo :

Erreur d'indentification, est-il correct ce code ?

import imaplib
box = imaplib.IMAP4_SSL('imap.mail.yahoo.com', 993)
box.login("xxxx","xxxx")

# Connexion au serveur
try:
    mail = imaplib.IMAP4_SSL(server)
    mail.login(user, password)
    mail.select("Inbox")
except:
    print('Anomalie de connexion',server)
else:
  (retcode, messages) = mail.search(None, '(UNSEEN)')
  if retcode == 'OK':
     nonlus = len(messages[0].split())
  else:
    nonlus = "?"

   (retcode, messages) = mail.search(None, '(SEEN)')
     if retcode == 'OK':
        lus = len(messages[0].split())
   else:
     lus = "?"

   print(user, "messages (non lus/lus) :", nonlus, "/", lus)
input()








    





0

Il faut que tu travailles en essayant de comprendre ce que fait le code. Tu recherches des bouts de codes que tu mixes entre eux, sans logique. Là si la connexion lignes 2 et 3 fonctionnaient, tu aurais tout de même une erreur en ligne 7 avec une variable non définie.

Pour tester la connexion, il suffit de

import imaplib
box = imaplib.IMAP4_SSL('imap.mail.yahoo.com', 993)
box.login("xxxx","xxxx")
input()

Ce qui est insatisfaisant puisque si cela fonctionne, le programme ne le dit pas ;-)

Je n'ai pas de compte yahoo. Mais il est probable que comme les comptes gmail, la procédure de connexion soit particulière. En consultant :

je pense que le mot de passe à donner n'est pas le mot de passe du compte mail mais un "mot de passe d'application" qu'il faudrait générer depuis son compte yahoo.


0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 1 255
24 avril 2024 à 18:48

Merci des conseils. J'ai repris le meme code que pour outlook, modifié le serveur, identifiant et mdp de l'application, ça fonctionne !

0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 Ambassadeur 1 255
25 avril 2024 à 12:34

J'ai essayé de faire le code de yahoo mail à partir de l'IDLE de python :

J'ai l'erreur "unexpected indentation", que pense tu de mon identation !

import imaplib

# Configuration
server = "mail.yahoo.com"
user = "xxx"
password = "xxx "

# Connexion au serveur
try:
    mail = imaplib.IMAP4_SSL(server)
    mail.login(user, password)
    mail.select("Inbox")
except:
    print('Anomalie de connexion',server)
else:
   (retcode, messages) = mail.search(None, '(UNSEEN)')
   if retcode == 'OK':
      nonlus = len(messages[0].split())
   else:
     nonlus = "?"

   (retcode, messages) = mail.search(None, '(SEEN)')
     if retcode == 'OK':
        lus = len(messages[0].split())
   else:
     lus = "?"

   print(user, "messages (non lus/lus) :", nonlus, "/", lus)
input()








    




Le souci serait ligne "if retcode" en ligne 17.


0
quentin2121 Messages postés 9081 Date d'inscription lundi 24 mai 2010 Statut Membre Dernière intervention 11 septembre 2025 Ambassadeur 1 255
25 avril 2024 à 13:35

Ok merci. Je trouve perso que le code répond plus vite à l'exécution sur pycharm que par IDLE. Mais c'est plus clair dans l'éditeur, pour taper le code.


0