📄 smtp.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 + -