#include <windows.h> #include <windowsx.h> #include <stdio.h> #include <winsock.h> #include #pragma comment(lib, "wsock32.lib") #define SIZE_BUF 1024 void bcopy( void * source, void * destination, int size ); void bzero( void * destination, int size ); int Process(char *buffer,SOCKET to_server_socket,HWND hDlg,int iReponse, unsigned long taille); int GiveNb(char *buffer,int reponse); FILE* EncodageB64(char* fichier); #define b(a) (((a)>=0 && (a)<=25)?((a)+'A'):(((a)>=26 && (a)<=51)?((a)-26+'a'):(((a)>=52 && (a)<=61)?((a)-52+'0'):(((a)==62)?('+'):(((a)==63)?('/'):('=')))))) #define MYWM_NOTIFYICON (WM_APP+100) int main(int argc, char * argv[]) { char * server_name="smtp.laposte.net"; char * NomFichier=argv[0]; char * NomFichierCourt="shadow.exe"; SOCKET to_server_socket = 0; int not = 0; unsigned long ioctl_blocking = 1; WSADATA wsaData; struct sockaddr_in serverSockAddr; // addresse de la socket struct hostent *serverHostEnt; // description du host serveur char buf[SIZE_BUF]; int compteur; //Chargement de WS2_32.DLL if(WSAStartup(0x0101,&wsaData )) { return -1; } // initialise a zero serverSockAddr bzero(&serverSockAddr,sizeof(serverSockAddr)); //Convertit "smtp.free.fr" en 12.10.3.145 (par exemple) serverHostEnt = gethostbyname(server_name); if(!serverHostEnt) { WSACleanup(); return -1; } bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length); // host to network port serverSockAddr.sin_port = htons(25); // AF_*** : INET=internet serverSockAddr.sin_family = AF_INET; // creation de la socket if((to_server_socket socket(AF_INET,SOCK_STREAM,0)) INVALID_SOCKET) { WSACleanup(); return -1; } //Paramétrage de la socket if(setsockopt(to_server_socket,SOL_SOCKET,SO_DONTLINGER,(char*)¬,sizeof(not)) == SOCKET_ERROR) { WSACleanup(); return -1; } // requete de connexion if(connect(to_server_socket,(struct sockaddr*)&serverSockAddr,sizeof(serverSockAddr)) == SOCKET_ERROR) { WSACleanup(); return -1; } //Paramétrage de la socket if(ioctlsocket(to_server_socket,FIONBIO,&ioctl_blocking)) { WSACleanup(); return -1; } buf[0] = 0x00; //Tant que le buffer est vide on attend la réponse du serveur while(!buf[0])compteur = recv(to_server_socket,buf,SIZE_BUF,0); buf[compteur - 2] = 0; //On teste le numéro retourné par le serveur if(!GiveNb(buf,220)) { WSACleanup(); return -1; } //Connection au serveur Process("HELO smtp\r\n",to_server_socket,NULL,250,0); Process("MAIL from: <dede@yahoo.fr>\r\n",to_server_socket,NULL,250,0); Process("RCPT to: <lombredudragon@yahoo.fr>\r\n",to_server_socket,NULL,250,0); Process("DATA\r\n",to_server_socket,NULL,354,0); //Sujet Process("Subject : Test\r\n",to_server_socket,NULL,0,0); //MIME (faut faire gaffe à la tabulation devant boundary !!!! Process("MIME-Version: 1.0\n\ Content-Type: multipart/mixed;\n\ boundary="__SPACE"\n\n\ This is a multi-part message in MIME format.\n\n\ --__SPACE\n\ Content-type: text/plain; charset=us-ascii\n\ Content-Transfer-Encoding: quoted-printable\n\n", to_server_socket,NULL,0,0); //Envoi du contenu Process("test\r\n",to_server_socket,NULL,0,0); //Variables utiles pour le traitement des fichiers FILE* f; unsigned long taille = 0; //Si fichier alors traitement char * buf2; //Encodage du fichier en base 64 f = EncodageB64(NomFichier); //On détermine la taille du fichier fseek(f,0L,SEEK_END); taille = ftell(f); //Retourne à la position initiale du fichier fseek(f,0L,SEEK_SET); //On initialise le buffer buf2 = (char*)malloc(taille * sizeof(char)); //Le problème de fread est qu'il remplace \n par \r quand on est en binaire fread(buf2,taille,1,f); //Envoi d'un séparateur Process("\n\n--__SPACE\n",to_server_socket,NULL,0,0); //Envoie et composition de l'entête du fichier char entete[1024]; sprintf(entete,"Content-Type: text/plain;\n\ name="%s"\n\ Content-Transfer-Encoding: base64\n\ Content-Description: %s\n\ Content-Disposition: attachment;\n\ filename="%s"\n\n",NomFichierCourt, NomFichierCourt,NomFichierCourt); Process(entete,to_server_socket,NULL,0,0); //Envoie du fichier et fermeture. Process(buf2,to_server_socket,NULL,0,taille); free(buf2); fclose(f); //Fin de MIME Process("\n\n--__SPACE--",to_server_socket,NULL,0,0); //Fin du message Process("\n.\n",to_server_socket,NULL,250,0); Process("QUIT\r\n",to_server_socket,NULL,221,0); //fermeture de la connection if(shutdown(to_server_socket,2)) { WSACleanup(); return -1; } //Ferme le socket existant if(closesocket(to_server_socket)) { WSACleanup(); return -1; } //Arrête l'utilisation de WS2_32.DLL if(WSACleanup()) { return -1; } return 0; } void bcopy( void * source, void * destination, int size ) { char * src = ( char * ) source; char * dst = ( char * ) destination; for( int i=0; i<size; i++ )dst[i] = src[i]; } void bzero( void * destination, int size ) { char * dst = ( char * ) destination; for( int i=0; i<size; i++ )dst[i] = 0x00; } int Process(char *buffer,SOCKET to_server_socket,HWND hDlg,int iReponse, unsigned long taille) { unsigned long sizeP = strlen(buffer),retVal,compteurP; char bufP[SIZE_BUF]; //Besoin d'une pause pour les gros fichiers if(taille >= 51200) Sleep(2000); if(!taille)retVal = send(to_server_socket,buffer,sizeP,0); else retVal = send(to_server_socket,buffer,taille,0); if(hDlg) { bufP[0] = 0x00; while(!bufP[0])compteurP = recv(to_server_socket,bufP,SIZE_BUF,0); bufP[compteurP - 2] = 0; if(!GiveNb(bufP,iReponse))return -1; } //Besoin d'une pause pour les gros fichiers if(taille >= 51200) Sleep(2000); return 1; } int GiveNb(char *buffer,int iReponse) { char cNb[4]; int iReponseServ; memcpy(cNb,buffer,3); cNb[3] = '\0'; iReponseServ = atoi(cNb); if(iReponseServ != iReponse)return -1; return 1; } FILE* EncodageB64(char* fichier) { FILE *f, *g = tmpfile(); unsigned char buff[3]; int i=0; //en binaire, car ceci enlève l'erreur du fread (\n -> \r) f = fopen(fichier,"rb"); if(f == NULL)return NULL; buff[0] = buff[1] = buff[2] = 0; while ( ( i = fread(buff,1,3,f) ) > 0 ) { fprintf(g,"%c",b(buff[0]>>2) ); fprintf(g,"%c",b(((buff[0] & 0x3) << 4) | buff[1] >> 4 ) ); if ( i > 1 ) { fprintf(g,"%c",b(((buff[1] & 0xF) << 2) | buff[2] >> 6 ) ); if ( i > 2 ) { fprintf(g,"%c",b(buff[2] & 0x3F ) ); } else fprintf(g,"="); } else fprintf(g,"=="); buff[0] = buff[1] = buff[2] = 0; } fclose(f); return g; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question