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

📄 smtp.cc

📁 客户端可以发送邮件到指定的信箱 服务器端可以接受邮件
💻 CC
字号:
/*	Name 		:	smtp**	File		:	smtp.h**	Author		:	DELFOUR Kevin - DUTEIL Julien**	Description	:	Librairie contenant toute les fonctions necessaires**					pour l'utilisation du protocole SMTP******	Version		:	3.0.2**	Note		:	**	Mail		:	delfour.kevin@free.fr**	Copyright	:	2007@DEKKA Studio*/#include <sys/socket.h>#include <sys/types.h>#include "sock.h"#include "sockdist.h"#include <cstring>#include <string>#include <iostream>#include <fstream>#include <signal.h>#include "inout.h"#include "lib.h"#include "b64.h"#include "pop.h"#include "quotedprintable.h"using namespace std;int descBrCliSmtp;//Connection au serveur SMTPint CONNECTSmtp (char* serveur){	bool debug = false;	Sock brCli(SOCK_STREAM);	int descBrCliSmtp;	if (brCli.good()) descBrCliSmtp = brCli.getsDesc();//on recupere le descripteur	else {		PRINTERROR ("Impossible de creer la BR du client SMTP");		exit(0);	}	PRINT("Connection au serveur SMTP en cours...");	SockDist brSmtp(serveur,short(25));  //designe le serveur smtp	struct sockaddr_in * adrBrSmtp=brSmtp.getAdrDist();	int lgAdrBrSmtp=sizeof(struct sockaddr_in);	int conn=connect(descBrCliSmtp, (struct sockaddr *)adrBrSmtp, lgAdrBrSmtp); //connection au serveur smtp 	if (conn <0){		PRINTERROR("Impossible de se connecter au serveur SMTP");		close (descBrCliSmtp);		exit (0);		}	PRINT("Connection au serveur SMTP : OK");	char buffer[1024];	int lgBuffer=sizeof(buffer);	//Validation du serveur	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);		//On dit bonjour	strcpy(buffer,"HELO CLIENT\n");	if(debug) PRINTS(buffer);	WRITE(descBrCliSmtp, buffer, strlen(buffer));	//Il nous dit bonjour	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);	return descBrCliSmtp; }//Retourne le nom du fichier qu'on regardechar* get_Name (char* buffer){//Permet de recuperer le nom du fichier	char* res;	char* restmp;	if (strstr(buffer,"/")!=0){		strcat(buffer,"\0");		res = search_STR(buffer,"/","\0");		strcat(res,"\0");		while(strstr(res,"/")!=0){			restmp = search_STR (res,"/","\0");			res = restmp;			strcat(res,"\0");		}		PRINTD("Res",res);		return res;	}	else{		strcat(buffer,"\0");		return buffer;	}}//Retourne le type de piece jointechar* get_Content_type (char* name){	if (strstr(name,"png")!=0) 		return "image/png";	else if (strstr(name,"gif")!=0) 	return "image/png";	else if (strstr(name,"jpg")!=0) 	return "image/png";	else if (strstr(name,"jpeg")!=0)	return "image/png";	else if (strstr(name,"bmp")!=0)	return "image/png";	else if (strstr(name,"zip")!=0) 	return "application/x-gzip";	else if (strstr(name,"tar")!=0) 	return "application/x-gzip";	else if (strstr(name,"bz")!=0) 	return "application/x-gzip";	else if (strstr(name,"tgz")!=0) 	return "application/x-gzip";	else if (strstr(name,"rar")!=0) 	return "application/x-gzip";	else if (strstr(name,"txt")!=0) 	return "application/text";	else if (strstr(name,"doc")!=0) 	return "application/text";	else return "application/other";}//Boundary persochar* make_Bound(){	return "-dekkastudiooidutsakkeddekkastudiooidutsakkeddekkastudiooidutsakkeddekkastudiooidutsakked";}//Ecris le corps du mailint make_Mail(){	string texte;	int exit = 0;	bool mime = false;	char res[4];	char tmp[256];	char file[256];	char bufferm[256];	char bufferpj[256];	char bufferpjs[256];	char buffermsg[256];	char Message[4096];	char reader[4096];	//initialisation des variables	char* bound = make_Bound();	sprintf(bufferm,"temp/mail.smtp");	sprintf(bufferpj,"temp/file.smtp");	sprintf(buffermsg,"temp/mess.smtp");		//on prend le message	ofstream ofm(buffermsg);	PRINT("Corps du message : /n 2x(CTRL+D) to finish...");	SCANF (Message);	ofm<<"\r\n\r\n";	ofm<<Message;	ofm<<"\r\n";	//on demande si des fichiers doivent etre attaches au mail	while (exit!=-1){		if (exit==0){			PRINT("Voulez vous joindre un fichier a votre mail? Yes/No");			SCAN(res);			if ((strstr(res,"y")!=0)||(strstr(res,"Y")!=0)) {				//si oui alors on recupere le fichier				PRINT("Ou se trouve le fichier que vous voulez attacher?");				SCAN(file);				ifstream ifs;				ifs.open(file);				if (!ifs.is_open())				{					//cas ou le fichier n'existe  pas					PRINTD("Error Fichier inexistant",bufferm);					PRINT("Veuillez resaisir le chemin...");				}				else {					ifs.close();					mime=true;										//s'il existe alors on l'encode dans le fichier file.smtp					PRINTSTATEMENT("Encodage de la piece jointe en cours");					FILE *bufferI;					FILE *bufferO;					bufferI = fopen(file, "rw" );					bufferO = fopen(bufferpj, "wb" );					encode(bufferI,bufferO,72);					PRINTSTATEMENT("Encodage terminer");					fclose(bufferI);					fclose(bufferO);					//on copie le contenu du fichier encoder dans le message					//d'abord l'entete de la piece jointe					sprintf(tmp,"\n\r--%s\n",make_Bound());					ofm<<tmp;					sprintf(tmp,"Content-Type: %s; name=\"%s\"\n",get_Content_type(get_Name(file)),get_Name(file));					ofm<<tmp;					sprintf(tmp,"Content-Transfer-Encoding: base64\n");					ofm<<tmp;					sprintf(tmp,"Content-Disposition: attachment; filename=\"%s\"\r\n\r\n",get_Name(file));					ofm<<tmp;					//ensuite le contenu du fichier crypter					ifstream ifp;					ifp.open(bufferpj);					if (!ifp.is_open())					{						printf("Error Fichier inexistant %s\n",bufferm);						PRINT("Veuillez resaisir le chemin...");					}					else {						while(ifp.good()){							ifp.getline(reader,4096,'\n');							ofm<<reader;						}					}					ifp.close();				}				}			//cas ou l'on repond autre chose que Yes ou yes			else exit=-1;		}	}	ofm.close();	//on a fini de copier les trois quart du message	//manque plus que l'entete du mail a adapter	sprintf(bufferm,"temp/mail.smtp");	ofstream ofs(bufferm);	if (mime == true){		//si le mail contient un fichier attacher alors on colle cette entete		//entete du message avec mime		ofs<<"MIME-Version: 1.0\n";		sprintf(tmp,"Content-Type: multipart/mixed; boundary=\"%s\"",bound);		ofs<<tmp;		ofs<<"\r\n";		ofs<<"This message is in MIME format.";		ofs<<"\r\n";		sprintf(tmp,"--%s\n",bound);		ofs<<tmp;		ofs<<"Content-Type: text/plain\n";	}	//et pour finir le reste du message et les pieces jointes	ifstream ifs;	ifs.open(buffermsg);	if (!ifs.is_open())	{		printf("Error Fichier inexistant ici %s\n",bufferpjs);	}	else { 		ofs<<"Content-Transfer-Encoding: quoted-printable\n";	}	while(ifs.good()){		ifs.getline(reader,4096,'\n');		strcat(reader,"\r\n");		texte = reader;		enc_quotedP(texte);		ofs<<reader;	}	ifs.close();	//fin du message	if (mime==true) {		sprintf(tmp,"\n\r--%s\n\r",bound);		ofs<<tmp;	}		char commande[256];	//On efface les fichiers devenus inutiles	sprintf(commande,"rm %s %s",bufferpj,buffermsg);	system(commande);	//Le mail est pret... et contenu dans le fichier temp/mail.smtp	return 0;}//Envoie le mailint SENDING(int descBrCliSmtp, char* mailFrom, char* rcptTo, char* subject, bool debug){	char buffer[4096];	int lgBuffer=sizeof(buffer);	//On envoie "MAIL FROM:<...>"	strcpy(buffer,"MAIL FROM: <");	strcat(buffer,mailFrom);	strcat(buffer,">\n");	if(debug) PRINTS(buffer);	WRITE(descBrCliSmtp, buffer, strlen(buffer));	//Il valide par OK	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);	//On envoie de qui "RCPT TO:<...>"	strcpy(buffer,"RCPT TO: <");	strcat(buffer,rcptTo);	strcat(buffer,">\n");	if(debug) PRINTS(buffer);	WRITE(descBrCliSmtp, buffer, strlen(buffer));	//Toujours OK?	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);	//On prepare le serveur a recevoir le coprs du texte	strcpy(buffer,"DATA\n");	if(debug) PRINTS(buffer);	WRITE(descBrCliSmtp, buffer, strlen(buffer));	//Il se prepare	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);	//On envoie le sujet	strcpy(buffer,"Subject: ");	strcat(buffer,subject);	strcat(buffer,"\n\0");	WRITE(descBrCliSmtp, buffer, strlen(buffer));	if(debug) PRINTS(buffer);	//On prepare le message a envoyer dans un fichier a part	make_Mail();	//On envoie la sauce, tout le corps du texte evce les pieces jointes	ifstream ifstr;	ifstr.open("temp/mail.smtp");	if (!ifstr.is_open())	{		printf("Error Fichier inexistant  : temp/mail.smtp");		return 1;	}	else { 		while(ifstr.good()){			ifstr.getline(buffer,4096,'\n');			strcat(buffer,"\n");			WRITE(descBrCliSmtp, buffer, strlen(buffer));			if(debug) PRINTD("Send",buffer);		}	}	ifstr.close();	if(debug) PRINTR("Fichier fermer !");	//Envoie de la fin du fichier	WRITE(descBrCliSmtp,"\r\n.\r\n",5);	//La reception est OK?	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);		//On quit	strcpy(buffer,"quit\n");	if(debug) PRINTS(buffer);	WRITE(descBrCliSmtp, buffer, strlen(buffer));	//reception du type "221 bye"	RECV(descBrCliSmtp, buffer, lgBuffer);	if(debug) PRINTR(buffer);		//Le message est parti	PRINT("Envoie du message -> OK");	close (descBrCliSmtp);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -