TP 1 - Pop, Imap, SMTP
TP 1 - Pop, Imap, SMTP
TP 1 - Pop, Imap, SMTP
: Accéder à
une boite mail avec
POP et IMAP
Table des
matières
Introduction 3
II - Client IMAP 7
Important :
Utilisez le code correspondant à votre version python (voir le nom du fichier entre crochets pour déterminer
quel programme vous devez utiliser);
Les code des programmes Python 2 et Python 3 sont téléchargeable depuis le répertoire Google Drive
suivant :
https://drive.google.com/open?id=1TO0TA1HqgrLZ8HYs-ZxqxKOw__m1qZBi
3
Accéder à une boite mail avec POP
Voici une boite mail pour tester des exemples POP et IMAP sur le serveur mail Gmail :
Important: Ne testez pas l'exemple avec votre boite mail avant de terminer les exercices.
POP (Post Office Protocol) est un protocole très simple permetant de connecter à une boite mail et
télécharger les mails situés dedans. Voici les commandes les plus importantes :
1. USER, PASS fonctionnent comme dans FTP pour transmettre le login (boite mail) et mot de
passe :
2. STAT : renvoie le nombre de mails dans la boite et la taille totale occupée par celle-ci ;
3. LIST : renvoie une liste contenant le numéro de chaque mail accompagné avec ça taille ;
4. RETR : récupère le mail désigné par le numéro en paramètre sous format RFC 822 (voir le
cours SMTP).
5. TOP : renvoie les entête du message désigné et les N premières lignes du message ;
6. UIDL : retourne la liste des identificateurs uniques des messages dans la boite ;
7. QUIT : ferme la sessions avec le serveur POP
Exécutez le code client POP écrit en python 2 [TP POP.py] (voir le code python 3 à la fin de l'exercice
si vous utilisez cette version [TP POP 3.py]):
4
Accéder à une boite mail avec POP
Question
Testez les commandes suivantes et faites des captures d’écran des résultats:
5
Accéder à une boite mail avec POP
USER MasterInfo.tlemcen.MAIL@gmail.com
PASS CodingMonk?L7*5
STAT
UIDL
LIST
RETR 3
QUIT
6
Client IMAP
Client IMAP
II
IMAP (Internet Message Access Protocol) a le meme objectif que POP : permettre l'accès aux boites
mails. Mais ce protocole offre, des fonctionnalités plus avancées :
Un changement important par rapport à POP c'est que les commandes sont préfixés par un tag qui
sert à faire correspondre la commande avec la réponse. Par exemple :
7
Client IMAP
Les programmes client suivants assurent la génération des tags automatiquement, donc il suffit de
saisir les commandes seulement. Exécutez le code python 2 [TP IMAP.py] client IMAP suivant (voir le
code python 3 à la fin de l'exercice si vous utilisez cette version [TP IMAP 3.py]):
8
Client IMAP
CAPABILITY
LOGIN MasterInfo.tlemcen.MAIL CodingMonk?L7*5
LIST "" "*"
SELECT INBOX
FETCH 2 FLAGS
FETCH 2 BODY.PEEK[TEXT]
STORE 2 +FLAGS (Answered)
FETCH 2 FLAGS
FETCH 2 BODY.PEEK[HEADER.FIELDS (To From Date Content-Type)]
UID FETCH 4 BODY.PEEK[HEADER.FIELDS (To From Date Content-Type)]
SEARCH SINCE 22-MAR-2018
SEARCH BEFORE 31-DEC-2018
SEARCH FROM ilyas9111@yahoo.fr
SEARCH ALL
UID SEARCH ALL
FETCH 2 FLAGS
CLOSE
9
Client IMAP
10
Envoie mail par SMTP
11
Envoie mail par SMTP
Comme expliqué dans le cours, les commandes SMTP seront échangées avec le serveur pour
transmettre le message. Sauf que ici, le programme utilisateur connecte à ça boite mail (afin de
s'authentifier) avant de transférer le mail au serveur où ça boite mail est localisée. Ci dessous, la
figure explique les commandes les plus importants dans ce processus :
12
Envoie mail par SMTP
Si vous souhaitez transmettre un mail en utilisant votre propre adresse Gmail, activez l'accès à votre
boite par des applications moins sécurisées à partir de ce lien :
https://myaccount.google.com/u/0/lesssecureapps?pli=1&pageId=none
13
Décoder le contenu avec l'encodage 64bits
Décoder le contenu
avec l'encodage 64bits IV
1 # code python 2
2 def Decode64bits(_4Octets_lu):
3 # prendre en parametre 4octets (4 caracteres)
4 global FichierDecode # variable globale
5
6 Sequence_4Octets=_4Octets_lu
7 ValeurBinaire=""
8 # si la sequence de caractere contient "=" alors celle-ci marque la fin du
fichier
9 '''if("=" in Sequence_4Octets):
10 # elimine les caractere "=" a la fin de la sequence
11 Sequence_4Octets=Sequence_4Octets[:Sequence_4Octets.find("="):]'''
12
13 for octet_indx in range(len(Sequence_4Octets)):
14 # convertir le caractere a ca representation 64bits et ensuite vers ca
representation binaire
15 binval=bin(ConvertirCaracter64bits(Sequence_4Octets[octet_indx]))[2::]
16 # complete la representation binaire par des 0s a gauche (pour avoir une
representation 6bits)
17 binval="0"*(6-len(binval))+binval
18 ValeurBinaire+=binval
19
20 for Threebits_char in range(0,len(ValeurBinaire),8):
21 if(Threebits_char+8>len(ValeurBinaire)):
22 break
23 # pour toutes les sequence de 8 bits dans ValeurBinaire
24 # obtenir le caractere 8bits correspandant
25 CaractereASCII8bits=chr( int("0b"+ValeurBinaire[Threebits_char:
Threebits_char+8:],0) )
26
27 # enregistrer le caractere sur fichier
28 FichierDecode.write(CaractereASCII8bits)
29 L=len(ValeurBinaire)
30 # s'il reste des bits supplementaires
31 if(L%8!=0):
32 # si la sequence de bits ne contient pas que des 0
33 if("0"*(L%8)!=ValeurBinaire[L-L%8::]):
34 # complete la representation par des 0 a droit
35 CaractereASCII8bits=chr( int("0b"+ValeurBinaire[L-L%8::]+(8-L%8)*"0",
0) )
36
14
Décoder le contenu avec l'encodage 64bits
15
Décoder le contenu avec l'encodage 64bits
94 Contenu=""
95 Contenu_Restant=""
96 # lire le fichier. Pour chaque morceau de d'octets
97 for Octets in FichierEncode:
98
99 Contenu=Octets
100 Contenu=SupprimerCaracteresSupplementaires(Contenu)
101 Contenu=Contenu_Restant+Contenu
102
103 l=len(Contenu)
104 Contenu_Restant=""
105 # prendre une partie de la chaine de caratere avec une taille multiple de 4
106 # si des caracteres supplementaires restent, on les garde dans le tompon
"Contenu_Restant"
107 if(l%4!=0):
108 Contenu_Restant=Contenu[len(Contenu)-(l%4):len(Contenu):]
109 if(len(Contenu)<4):
110 continue
111 PartieContenu_deTailleMultiple_de_4=l-(l%4)
112 # appliquer le decodage sur chaque morceau de taille 4 caracteres
113 for i in range(0,PartieContenu_deTailleMultiple_de_4,4):
114 Decode64bits(Contenu[i:i+4:])
115 # fermeture du fichier de l'encodage
116 FichierDecode.close()
117
Pour tester ce code sur un contenu encodé par cette méthode, exécutez les étapes suivantes :
16
Décoder le contenu avec l'encodage 64bits
Voici le code python 3 du décodeur 64 bits [ TP Decode64bit py3.py] présenté au début de cet
exercice :
1 # code python 3
17
Décoder le contenu avec l'encodage 64bits
2 def Decode64bits(_4Octets_lu):
3 # prendre en parametre 4octets (4 caracteres)
4 global FichierDecode # variable globale
5
6 Sequence_4Octets=_4Octets_lu
7 ValeurBinaire=""
8 # si la sequence de caractere contient "=" alors celle-ci marque la fin du
fichier
9 if("=" in Sequence_4Octets):
10 # elimine les caractere "=" a la fin de la sequence
11 Sequence_4Octets=Sequence_4Octets[:Sequence_4Octets.find("="):]
12
13 for octet_indx in range(len(Sequence_4Octets)):
14 # convertir le caractere a ca representation 64bits et ensuite vers ca
representation binaire
15 binval=bin(ConvertirCaracter64bits(Sequence_4Octets[octet_indx]))[2::]
16 # complete la representation binaire par des 0s a gauche (pour avoir une
representation 6bits)
17 binval="0"*(6-len(binval))+binval
18 ValeurBinaire+=binval
19
20 for Threebits_char in range(0,len(ValeurBinaire),8):
21 if(Threebits_char+8>len(ValeurBinaire)):
22 break
23 # pour toutes les sequence de 8 bits dans ValeurBinaire
24 # obtenir le caractere 8bits correspandant
25 CaractereASCII8bits=chr( int("0b"+ValeurBinaire[Threebits_char:
Threebits_char+8:],0) )
26 #print (CaractereASCII8bits.encode(),ord(CaractereASCII8bits))
27 # enregistrer le caractere sur fichier
28 FichierDecode.write(bytes([ord(CaractereASCII8bits)]))
29 L=len(ValeurBinaire)
30 # s'il reste des bits supplementaires
31 if(L%8!=0):
32 # si la sequence de bits ne contient pas que des 0
33 if("0"*(L%8)!=ValeurBinaire[L-L%8::]):
34 # complete la representation par des 0 a droit
35 CaractereASCII8bits=chr( int("0b"+ValeurBinaire[L-L%8::]+(8-L%8)*"0",
0) )
36
37 # enregistrer le caractere sur fichier
38 FichierDecode.write(bytes([ord(CaractereASCII8bits)]))
39
40 #fin de la procedure Decode64bits
41
42 # si le caractere n'appartient pas a [A..Z, a..z, 0..9, +, / , =], supprimer le
caratere
43 def SupprimerCaracteresSupplementaires(Contenu):
44 Contenucleaned=""
45 for octet in Contenu :
46 caractere=(chr(octet))
47 if(caractere>='A' and caractere<='Z'):
48 Contenucleaned+=caractere
49 continue
50 if(caractere>='a' and caractere<='z'):
51 Contenucleaned+=caractere
52 continue
53 if(caractere>='0' and caractere<='9' ):
54 Contenucleaned+=caractere
55 continue
18
Décoder le contenu avec l'encodage 64bits
56 if(caractere=="+"):
57 Contenucleaned+=caractere
58 continue
59 if(caractere=="/"):
60 Contenucleaned+=caractere
61 continue
62 if(caractere=="="):
63 Contenucleaned+=caractere
64
65 return Contenucleaned # fin de la procedure
SupprimerCaracteresSupplementaires
66
67 # obtient la representation 64bits du caractere
68 ''' [A .. Z] = [0..25]
69 [a .. z] = [26..51]
70 [0..9]=[52..61]
71 "+" = 61
72 "/" = 62
73 "=" = 0 ( contrairement a A, les "=" sont ajoutes a la fin
74 pour que la taille de la chaine encdee soit un multiple de 4
75 '''
76 def ConvertirCaracter64bits(caractere):
77 if(caractere>='A' and caractere<='Z'):
78 return ord(caractere)-65
79 if(caractere>='a' and caractere<='z'):
80 return ord(caractere)-71
81 if(caractere>='0' and caractere<='9' ):
82 return ord(caractere)+4
83 if(caractere=="+"):
84 return 62
85 if(caractere=="/"):
86 return 63
87 # le dernier cas correspond a "=" (si caractere=="=" return 0)
88 return 0 # fin de la procedure ConvertirCaracter64bits
89
90 # lire le fichier qu'ont souhaite decoder
91 FichierEncode =open("MessageEncoder.txt",'rb')
92 # ouvrir le fichier dans le quel ont souhaite enregistrer le fichier decode
93 FichierDecode=open("MessageDecoder.jpg","wb")
94
95
96 Contenu=""
97 Contenu_Restant=""
98 # lire le fichier. Pour chaque morceau de d'octets
99 for Octets in FichierEncode:
100
101 Contenu=Octets
102 Contenu=SupprimerCaracteresSupplementaires(Contenu)
103 Contenu=Contenu_Restant+Contenu
104 l=len(Contenu)
105 Contenu_Restant=""
106 # prendre une partie de la chaine de caratere avec une taille multiple de 4
107 # si des caracteres supplementaires restent, on les garde dans le tompon
"Contenu_Restant"
108 if(l%4!=0):
109 Contenu_Restant=Contenu[len(Contenu)-(l%4):len(Contenu):]
110 if(len(Contenu)<4):
111 continue
112
19
Décoder le contenu avec l'encodage 64bits
113 PartieContenu_deTailleMultiple_de_4=l-(l%4)
114 # appliquer le decodage sur chaque morceau de taille 4 caracteres
115 for i in range(0,PartieContenu_deTailleMultiple_de_4,4):
116 Decode64bits(Contenu[i:i+4:])
117 # fermeture du fichier de l'encodage
118 FichierDecode.close()
119
20