⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pop.cc

📁 客户端可以发送邮件到指定的信箱 服务器端可以接受邮件
💻 CC
📖 第 1 页 / 共 2 页
字号:
/*	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 + -