📄 pop.cc
字号:
/* Name : pop** File : pop.cc** Author : DELFOUR Kevin - DUTEIL Julien** Description : Librairie contenant toute les fonctions necessaires** pour l'utilisation du protocole POP****** Version : 3.0.1** Note : ** Mail : delfour.kevin@free.fr** Copyright : 2007@DEKKA Studio*/#include <stdio.h>#include <string>#include <sys/socket.h>#include <sys/types.h>#include "sock.h"#include "sockdist.h"#include <cstring>#include <iostream>#include <fstream>#include "inout.h"#include "lib.h"#include "pop.h"#include "mail.h"#include "b64.h"#include "quotedprintable.h"using namespace std;//Variables locale int descBrCliPop; int packet_size = 512; mail listemail[256];//Retourne l'objet mail du tableau de mailmail get_mail ( int numero) {return listemail[numero];}//Permet la connection au serveur POPint CONNECT(char* serveur, char* user, char* pass, bool debug){ char buffer[256]; int descBR; //Etape 1 - On ouvre une BR int lgBuffer = sizeof(buffer); Sock brCli(SOCK_STREAM); if (brCli.good()) descBR=brCli.getsDesc(); else { PRINTERROR("Erreur a l'ouverture de la socket"); close (descBrCliPop); return -1; } SockDist brPop(serveur,short(110)); //designe le serveur pop struct sockaddr_in * adrBrPop=brPop.getAdrDist(); int lgAdrBrPop=sizeof(struct sockaddr_in); //Etape 2 - On demande la connection au serveur connect(descBR, (struct sockaddr *)adrBrPop, lgAdrBrPop); //connection au serveur pop //Validation de la connection RECV(descBR, buffer, lgBuffer); if(debug) PRINTR(buffer); //2.1 On envoie le login strcpy(buffer,"USER "); strcat(buffer,user); strcat(buffer,"\r\n"); WRITE(descBR, buffer, strlen(buffer)); if (debug) PRINTS(buffer); //Validation du login RECV(descBR, buffer, lgBuffer); if (debug) PRINTR(buffer); //2.1 On envoie le pwd strcpy(buffer,"PASS "); strcat(buffer,pass); strcat(buffer,"\r\n"); WRITE(descBR, buffer, strlen(buffer)); if(debug) PRINTS(buffer); //Validation du pwd RECV(descBR, buffer, lgBuffer); if(debug) PRINTR(buffer); //L'utilisateur existe t-il? char test[4]; strncpy(test,buffer,4); if(strcmp("-ERR",test)!=0) { //Cas ou la connexion est accepter PRINTSTATEMENT("Connection accepte..."); return (short)descBR; } //Sinon ERR return -1;}//Permet la deconnection au serveur POPint DISCONNECT (int descBr,bool debug){ char buffer[256]; int lgBuffer = sizeof(buffer); //Etape 1 - On nettoie les repertoires PRINT("Nettoyage du repertoire temp/"); system("rm temp/*"); PRINT("Nettoyage du repertoire buffer/"); system("rm buffer/*"); PRINT("Nettoyage du repertoire maildir/"); system("rm maildir/*"); //Etape 2 - On dit au revoir au serveur WRITE(descBr,"QUIT\n",5); RECV(descBr, buffer, lgBuffer); if(debug) PRINTR(buffer); return 0;}//Retourne le nombre de messageint NBMESSAGE (int descBr ,bool debug){ char buffer[256]; char temp[4]; int lgBuffer=sizeof(buffer); int nbms; strcpy(buffer,"STAT\r\n"); //Demande au serveur pop le nb de message WRITE(descBr, buffer, strlen(buffer)); if(debug) PRINTS(buffer); //Reception du type "+OK 45 541" RECV(descBr, buffer, lgBuffer); if(debug) PRINTR(buffer); //Calcul du nb de message strncpy(temp,buffer+4,2); temp[2]='\0'; nbms = atoi(temp); return nbms;}//Permet de sauvegarder le mail entierint SAVEMSG(int descBr,int message, char* fichier, bool debug){ char temp[4]; char buffer[256]; sprintf( temp,"%d",message); //on demande l'envoie du message strcpy(buffer,"RETR "); strcat(buffer,temp); strcat(buffer,"\n\r"); WRITE(descBr, buffer, strlen(buffer)); if(debug) PRINTS(buffer); ofstream ofs2(fichier); //reception du message et sauvegarde bool t=true; while(t){ sprintf(buffer," "); RECV(descBr,buffer,sizeof(buffer)); ofs2<<buffer; if(NULL != strstr(buffer,"\r\n.\r\n")) t=false; } ofs2.close(); return 1;}//Permet de sauvegarder l'entete du mailint SAVETOP(int descBr,int message, char* fichier, bool debug){ char temp[4]; char buffer[256]; sprintf( temp,"%d",message); //on demande l'envoie du message strcpy(buffer,"TOP "); strcat(buffer,temp); strcat(buffer," 0\n\r"); WRITE(descBr, buffer, strlen(buffer)); if(debug) PRINTS(buffer); ofstream ofs2(fichier); //reception du message et sauvegarde bool t=true; while(t){ sprintf(buffer," "); RECV(descBr,buffer,sizeof(buffer)); ofs2<<buffer; if(NULL != strstr(buffer,"\r\n.\r\n")) t=false; } ofs2.close(); return 1;}//Cherche une sous chaine borne par start et end et la renvoiechar* search_STR(char* buffer, char* start, char* end){ char* str1; char* str2; char* strbuff; if(strstr(buffer,start)!=NULL){ str1 = strstr(buffer,start); strcpy(str1, strstr(buffer,start)+strlen(start)); str2 = strstr(str1,end); strbuff = new char[strlen(str1) - strlen(str2)]; strncpy(strbuff, str1,(strlen(str1) - strlen(str2))); return strbuff; } else return NULL;}//Cherche toutes les informations sur les fichiers mails telechargesmail search_INFO (int numero, bool debug){ mail m; int ligne =0; char debugme[256]; bool boundfind = false; bool content_type_find = false; char buffer[4096]; char bufferdir[50]; sprintf(bufferdir,"buffer/mail%i.mail",numero); m.set_Fichier(numero); m.Content_type="NULL"; if (debug ) printf("File %i\n",m.Fichier); ifstream ifs; //On ouvre le fichier telecharge dans le repertoire buffer ifs.open(bufferdir); if (!ifs.is_open()) { printf("%s Error Fichier inexistant \n",bufferdir); return m; } //S'il existe alors on cherche différentes informations while(ifs.good()){ ligne++; ifs.getline(buffer,4096,'\n'); //Rechercher du type du corps du texte if ((strstr(buffer,"Content-type:")!=0)&&(content_type_find == false)) { m.set_Content_type(search_STR(buffer,"Content-type: ",";")); if (debug) { sprintf(debugme," %i %s",ligne,m.Content_type); PRINTD("SEARCH_INFO",debugme); } content_type_find = true; } if ((strstr(buffer,"Content-Type:")!=0)&&(content_type_find == false)) { m.set_Content_type(search_STR(buffer,"Content-Type: ",";")); if (debug) { sprintf(debugme," %i %s",ligne,m.Content_type); PRINTD("SEARCH_INFO",debugme); } content_type_find = true; } //Recherche de l'identifiant du message if ((strstr(buffer,"Message")!=0)){ m.set_Message_Id(search_STR(buffer,"<",">")); if (debug) { sprintf(debugme," %i %s",ligne,m.Message_Id); PRINTD("SEARCH_INFO",debugme); } } //Recherche du sujet du message if ((strstr(buffer,"Subject:")!=0)) { m.set_Subject(search_STR(buffer,"","\r")); if (debug) { sprintf(debugme," %i %s",ligne,m.Subject); PRINTD("SEARCH_INFO",debugme); } } //Recherche de la provenance du message if (strstr(buffer,"From")!=0){ m.set_From(search_STR(buffer,"","\r")); if (debug) { sprintf(debugme," %i %s",ligne,m.From); PRINTD("SEARCH_INFO",debugme); } } //Recherche de la date de reception if (strstr(buffer,"Date")!=0){ m.set_Date(search_STR(buffer,", ","+")); if (debug) { sprintf(debugme," %i %s",ligne,m.Date); PRINTD("SEARCH_INFO",debugme); } } //Recherche du boundary s'il existe dans le cas d'un mail ayant des pieces jointes if (strstr(buffer,"boundary")!=0){ m.set_Boundary(search_STR(buffer,"boundary=\"","\"")); if (debug ) { sprintf(debugme," %i %s",ligne,m.Boundary); PRINTD("SEARCH_INFO",debugme); } boundfind = true; m.Mime = true; m.nbpart ++; } //Recherche des positions des differents zones du mail if ((strstr(buffer,m.Boundary)!=0)&&(boundfind==true)){ m.set_lignebound(ligne); if (debug ){ sprintf(debugme,"Bound at %i %s",ligne,m.Boundary); PRINTD("SEARCH_INFO",debugme); } } } ifs.close(); return m;}//Liste la totalite des mails presents dans le repertoire bufferint LISTMSG (int nb_message,bool debug){ PRINT("KKMAIL V3.0.1"); PRINT("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); PRINT("Liste des messages"); //Permet de lister tout les mails telecharger for (int j=0; j<5; j++) for (int i=1; i<nb_message+1; i++){ //pour chaque mail on cherche les infos listemail[i]=search_INFO(i,debug); } for (int i=1; i<nb_message+1; i++) { //Affichage des infos recoltee printf("N°%i :",i); listemail[i].affiche_info();} PRINT("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); PRINT(" [REFRESH] [READ] [WRITE] [SAVE] [DELETE] [HELP] [QUIT]"); printf(">>> "); return 0;}//Affiche l'aide contextuelint HELP (){ PRINT("KKMAIL HELP"); PRINT("-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); PRINT("KKMAIL - kkmail 3.0 (2007 Jan 16)"); PRINT("utiliser:"); PRINT("\t\tREFRESH ou refresh\t Mettre a jour la liste des mails de la BAL"); PRINT("\t\tREAD ou read [numero]\t Lire le mail N°'numero'"); PRINT("\t\tWRITE ou write\t\t Ecrire un mail"); PRINT("\t\tSAVE ou save [numero]\t Sauvegarder le mail N°'numero'"); PRINT("\t\tDELETE ou delete [numero] Effacer le mail N°'numero'"); PRINT("\t\tHELP ou help\t\t Afficher l'aide"); PRINT("\t\tQUIT ou quit\t\t Terminer Kkmail"); return 0;}//Retourne le nombre de ligne de l'entete du mailint NbLine_Top (mail m, bool debug){ //permet de compter le nombre de ligne de l'entete int ligne = 0; char buffer[4096]; char bufferdir[50]; sprintf(bufferdir,"buffer/mail%i.top",m.Fichier); //On ouvre le fichier ifstream ifs; ifs.open(bufferdir); if (!ifs.is_open()) { printf("%s Error Fichier inexistant \n",bufferdir); return -1; } while(ifs.good()){ //on parcours le fichier en comptant le nombre de ligne ligne++; ifs.getline(buffer,256,'\n'); //Si le mail contient STATUS : RO forte chance que ce soit la fin du mail if ((strstr(buffer,"Status: RO")!=0)&&(!m.Mime)) return ligne + 1; } return ligne + 2 ;}//Teste le nombre de boundary different dans le mailint BoundPart (mail m, bool debug){ return m.nbpart;}//Pour les mails sans boundary type=txt ou htmlint Text (mail m, char* type,char* directory, bool debug){ bool QUOTED = false; //Cas ou l'on doit decoder le texte string texte; char buffer[256]; char bufferdir[50]; char buffertop[256]; char bufferbody[256]; int ligne,finentete; ligne = 0; finentete = NbLine_Top(m,debug); //Chemins des fichiers sprintf(bufferdir,"buffer/mail%i.mail",m.Fichier); sprintf(buffertop,"%s/email%i.top",directory,m.Fichier); sprintf(bufferbody,"%s/email%i.%s",directory,m.Fichier,type); ofstream ofst(buffertop); //Pour sauvegarder l'entete ofstream ofsb(bufferbody); //Pour sauvegarder le data //On ouvre le fichier ifstream ifs; ifs.open(bufferdir); if (!ifs.is_open()) { //Si erreur on arrete la printf("%s Error Fichier inexistant \n",bufferdir); return -1; } while(ifs.good()){ //On lit le fichier ligne++; ifs.getline(buffer,256,'\n'); if (strstr(buffer,"quoted-printable")!=0) QUOTED = true; //Si QUOTED alors on decode le texte if (ligne<finentete) ofst<<buffer; //Sauvegarde de l'entete if (strcmp(buffer,"\r\n\r\n")==0) finentete = ligne; //Sauvegarde du DATA if ((ligne>finentete)&&(QUOTED)) {//Decodage actif texte = buffer; dec_quotedP(texte); ofsb<< texte; } else if ((ligne>finentete)&&(!QUOTED)) ofsb<<buffer; //Decodage non actif } ofst.close(); ofsb.close(); ifs.close(); return 0;}//Pour les Emails ne contenant qu'un seul Boundary et deux contenusint Multipart_Alternative_simple (mail m,char* directory,bool debug){ bool QUOTED = false; string texte; char* type; int typech; char res[4]; char buffer[256]; char bufferdir[50]; char buffertop[256]; char bufferbody[256]; int ligne,finentete,debutcorps,fincorps; ligne = 0; //On demande quel type de contenu veut voir l'utilisateur PRINT("Deux formats pour l'affichage sont disponibles HTML / TEXT, quel est votre choix ?"); SCAN(res); //Si c'est le format HTML //On va dans la partie du mail contenant du HTML if ((strstr(res,"h")!=NULL)||(strstr(res,"H")!=NULL)){ finentete = m.lignebound[1]; debutcorps = m.lignebound[2]+3; fincorps = m.lignebound[3]; type = "html"; typech = 1; } else { //Sinon on va dans la partie du mail contenant du texte finentete = m.lignebound[1]; debutcorps = m.lignebound[1]+3; fincorps = m.lignebound[2]; type = "txt"; typech = 2; } //Chemins des fichiers sprintf(bufferdir,"buffer/mail%i.mail",m.Fichier); sprintf(buffertop,"%s/email%i.top",directory,m.Fichier); sprintf(bufferbody,"%s/email%i.%s",directory,m.Fichier,type); ofstream ofst(buffertop); ofstream ofsb(bufferbody); ifstream ifs; ifs.open(bufferdir); if (!ifs.is_open()) { //Cas ou le fichier n'existe pas printf("%s Error Fichier inexistant \n",bufferdir); return -1; } while(ifs.good()){ //Sinon on lit le fichier ligne++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -