Automatisation de l'extraction des pièces jointes de votre boîte mail avec python
Imaginez que vous travaillez dans une entreprise de logistique. Chaque jour, vous recevez des factures ainsi que d'autres documents administratifs en pièces jointes par e-mail. Un jour, le patron vous demande d'apporter toutes les factures que vous avez reçu depuis une date d1 à une date d2. Votre premier réflexe est de filtrer vos e-mails reçus et envoyés à ces dates puis de télécharger sur votre ordinateur toutes les pièces jointes. Si vous n'avez reçu qu'une dizaine d'e-mails, vous pouvez le faire à la main. Mais imaginez que vous travaillez dans la firme Maersk où vous recevez et émettez des milliers de factures par mois.
L'article d'aujourd'hui vous permettra, à travers un script écrit en Python, de faire une extraction massive des pièces jointes présentes dans votre boîte e-mail.
Mais monsieur, vous êtes sûr que nous parlons d'automatisation ?
<< La semaine dernière, nous avons installé un logiciel du nom d'anaconda (lien vers l'article), aujourd'hui c'est python :(
<< Mais c'est quoi le délire? sommes-nous dans un cours de biologie animale ou dans un club d'herpétologues ?
OK, merci pour cette remarque; En effet, Anaconda est un environnement de travail complet qui contient jupyter notebook ainsi que d'autres logiciels utilisés pour la science des données. Python est un langage de programmation très populaire utilisé pour développer une variété de programmes informatiques. Dans cette série, nous n'entrerons pas dans certains détails du langage par souci de simplicité. Tout ce que vous avez à faire est d'exécuter le code et de vous assurer qu'il fonctionne.
Cela dit, mettons-nous au travail! Ouvrez anaconda puis jupyter notebook. Une fois ouvert, accédez au dossier 1000 Taches que nous avons crée l'article précédent
- Une fois ce dossier crée, ouvrez le et créez un autre dossier du nom de Tache #1
- A l'intérieur du dossier Tache #1, créez un notebook du nom de Automatiser de l'extraction des pieces jointes
- Une fois que vous avez terminé, suivez les etapes ci-dessous en copiant et collant les lignes de code ci-dessous dans les cellules de jupyter notebook.
Etape 1 : Importer les librairies Python
Copiez et collez ces lignes de code dans la cellule 1 et cliquez sur le button Exécuter/Run à votre gauche dans la barre des menus.
import imaplib
import email
from email.header import decode_header
import webbrowser
import os
Ces lignes de code permettent de dire à Python que nous aurons besoin de ces modules dans notre programme d'automatisation.
Etape 2 : Autoriser le programme à se connecter à votre boîte email
- Cliquez sur le symbole + à votre gauche dans la barre des menus. Ceci permet à chaque fois d'ajouter une cellule supplémentaire au jupyter notebook.
- Copiez et collez les lignes de code ci-dessous dans la cellule 2 et cliquez ensuite sur Exécuter/Run.
detach_dir = '.'
if 'pieces_jointes' not in os.listdir(detach_dir):
os.mkdir('pieces_jointes')
username = input('Entrez votre nom d\'utilisateur:') # outlook, zohomail, gmail,yahoo, etc
password = input('Tapez votre mot de passe:')
- Ces lignes de code permettent premièrement de créer un dossier du nom de pieces_jointes à l'intérieur du dossier Tache #1 au cas où il n'existerait pas.
- Ensuite, les deux dernières lignes sont utilisées pour collecter le nom d'utilisateur ainsi que le mot de passe. Ces données permettront à notre programme de se connecter automatiquement à notre boîte mail.
Une fois ces codes exécutés, vous remarquerez qu'un dossier nommé pieces_jointes vient d'être crée dans le dossier Tache #1.
Sur votre notebook jupyter, vous constaterez que le programme vous demande d'entrer votre nom d'utilisateur puis votre mot de passe. Entrez-les et appuyez sur ENTER à chaque fois.
Etape 3 : Lancer la connexion à l'aide du protocole IMAP
imap = imaplib.IMAP4_SSL("outlook.office365.com", 993)
# authenticate
imap.login(username, password)
Dans cet exemple, nous utiliserons le serveur imap de Microsoft office365. Si vous êtes sur yahoo, gmail ou zoho, vous trouverez ici la liste des serveurs imap en fonction de votre service mail.
- Pour Gmail c'est : imap.gmail.com (Assurez vous que l'option less secure Apps est activé. Sinon Gmail refusera la connexion)
- Office365.com : outlook.office365.com
- Zoho mail : imap.zoho.com
- etc (voir la liste)
Si la connexion réussit, vous recevrez ceci:
Etape 4 : Section d'extraction et nombre d'email à parcourir
status, messages = imap.select("Inbox")
N = 3
messages = int(messages[0])
- La première ligne de code nous permet de sélectionner la section de notre boîte email dont nous souhaiterions que le programme accède. Cela peut être soit Boîte de réception (Inbox), Brouillon (Draft), Spam, Réseaux sociaux (Social) ou Promotions. Dans cet exemple, nous rechercherons les pièces jointes dans la section Boîte de réception (Inbox).
- La ligne 2 est utilisée pour indiquer au programme le nombre d'emails qu'il doit parcourir dans la section Boîte de réception (Inbox). Si vous avez un nombre N d'emails dans votre boîte de réception, le temps d'exécution du programme sera proportionnel à ce nombre. C'est-à-dire, plus il y a d'emails à visiter, plus le programme prendra de temps à s'exécuter. Dans notre cas, N = 3, nous visiterons uniquement les 3 derniers emails reçus pour extraire leurs pièces jointes.
Etape 5 : Exécution finale du programme
Les lignes de code suivantes parcourent simplement nos e-mails pour extraire les pièces jointes. Lors de l'extraction, le programme, selon le type de contenu, affichera le message sur le notebook, extraira les pièces jointes ou affichera l'email dans votre navigateur.
for i in range(messages, messages-N, -1):
res, msg = imap.fetch(str(i), "(RFC822)")
for response in msg:
if isinstance(response, tuple):
msg = email.message_from_bytes(response[1])
subject = decode_header(msg["Subject"])[0][0]
if isinstance(subject, bytes):
subject = subject.decode()
from_ = msg.get("From")
print("Subject:", subject)
print("From:", from_)
if msg.is_multipart():
for part in msg.walk():
content_type = part.get_content_type()
content_disposition = str(part.get("Content-Disposition"))
try:
body = part.get_payload(decode=True).decode()
except:
pass
if content_type == "text/plain" and "attachment" not in content_disposition:
print(body)
elif "attachment" in content_disposition:
filename = part.get_filename()
if filename:
filepath = os.path.join(detach_dir, 'pieces_jointes', filename)
open(filepath, "wb").write(part.get_payload(decode=True))
else:
content_type = msg.get_content_type()
body = msg.get_payload(decode=True).decode()
if content_type == "text/plain":
print(body)
if content_type == "text/html":
if not os.path.isdir(subject):
os.mkdir(subject)
filename = f"{subject[:50]}.html"
filepath = os.path.join(subject, filename)
open(filepath, "w").write(body)
webbrowser.open(filepath)
print("="*100)
imap.close()
imap.logout()
- Après avoir exécuté le programme, si vous ouvrez le dossier pieces_jointes qui se trouve dans Tache #1, vous verrez la liste des pièces jointes.
Si vous avez le même résultat que moi, félicitations! une tâche ingrate de moins sur notre checklist !
La 2ème tâche qui sera automatisée se trouve dans la représentation binaire suivante:
01000001 01101010 01101111 01110101 01110100 01100101 01110010 00100000 01100100 01100101 01110011 00100000 01110111 01100001 01110100 01100101 01110010 01101101 01100001 01110010 01101011 01110011 00100000 01110011 01110101 01110010 00100000 01110000 01101100 01110101 01110011 01101001 01100101 01110101 01110010 01110011 00100000 01101001 01101101 01100001 01100111 01100101 01110011
De quoi s'agit-il ?
→ Entrez vos reponses sur ce lien google form
Pour ceux qui ont la bonne réponse, vous aurez droit à un appel de 30 minutes avec moi. Pour les gagnants de la semaine dernière, contactez-moi sur fanhatcha@projanalytics.com pour réserver une place.
Vous pouvez me poser des questions sur l'automatisation, la science informatique ou tout problème que vous avez rencontré lors de l'exécution du code de cet article.