begin process at 2012 02 05 04:45:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > ENVOI MAILS AVEC PROTOCOLE SMTP

ENVOI MAILS AVEC PROTOCOLE SMTP


 Information sur la source

Note :
8,2 / 10 - par 5 personnes
8,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :mails, sender, envoi, smtp, message Niveau :Débutant Date de création :10/01/2006 Date de mise à jour :11/02/2006 14:41:32 Vu / téléchargé :10 115 / 886

Auteur : KissyFroth

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Ce code permet d'envoyer des mails en utilisant des serveurs smtp. C'est assez classique mais j'ai essayé de rajouter des options qui n'apparaissaient pas dans d'autres sources du meme genre. J'ai fait cette source car, apres avoir essayé de nombreuses sources similaires, aucune ne marchait chez moi sauf une qui n'avait pas d'interface (et dont je me suis d'ailleurs largement "inspiré" ainsi que queleques autres sources traitant du meme sujet ; chacun se reconnaitra :) )
J'ai rajouté dernièrement la possibilité d'envoyer des fichiers joints.

De plus, si vous pouviez me dire commnet il faudrait rectifier la source pour pouvoir envoyer des mails à partir d'un PC qui est connecté à internet via un réseau local...(ca ne marche pas actuellement)

N'hésitez pas à me laisser des commentaires (ca marche, ca marche pas , c nul ....) toutes les remarques sont constructives et sont donc les bienvenues.

Source

  • //////////////////////////////////////////////////////////////////
  • // MailSender by KissyFroth //
  • //////////////////////////////////////////////////////////////////
  • // Ce programme permet d'envoyer des messages via des serveurs smtp
  • // ATTENTION IMPORTANT : NE PAS OUBLIER D'INCLURE ws2_32.lib
  • // DANS PROJECT->SETTINGS->LINK->Objects/Library Modules
  • ///////////////////////////////////////////
  • // Serveurs SMTP //
  • ///////////////////////////////////////////
  • // smtp.laposte.net //
  • // smtp.ifrance.com //
  • // smtp.mail.yahoo.fr //
  • // * smtp.neuf.fr //
  • // * smtp.cegetel.net //
  • // mail.club-internet.fr //
  • // smtp.wanadoo.fr //
  • // //
  • ///////////////////////////////////////////
  • //Les serveurs marqués de * sont testés et approuvés
  • /////////////////////////////////////////////////////////////////////////
  • // Librairies à inclure
  • /////////////////////////////////////////////////////////////////////////
  • #include <windows.h>
  • #include <commctrl.h>
  • #include "stdafx.h"
  • #include "resource.h"
  • #include <time.h> //Librairie pour la gestion du tps
  • #include <winsock2.h>
  • #include <Ws2tcpip.h>
  • #include <string.h>
  • #include <iostream>
  • ////////////////////////////////////////////////////
  • //Déclaration de variables globales
  • ////////////////////////////////////////////////////
  • bool infini=false,hour_t=false,pseudo_b=false,html=false,err=false,fdest=false,hour_f=false,fj=false;
  • int infini1=0;
  • char *provisoire; //Variable la plus importante du programme (sert à TOUT)
  • bool variables = false;
  • //Provisoires
  • char * mail_sender ;
  • char * mail_destinataire;
  • char * pseudo;
  • char * sujet_mail;
  • char * texte_mail;
  • char * type;
  • char * server;
  • char * mail_fdestinataire;
  • char * date;
  • char * fichier;
  • char * fichier_encode;
  • //Envoyées
  • char body [5000000];
  • char mail_dest[200];
  • char mail_send[200];
  • //Divers
  • int heure_e,minute_e; //Heure d'envoi
  • int nbr_mails;
  • int etat=0; //Etat du programme (en attente,envoi programmé,en cours d'envoi,etc...)
  • HWND h; //Identifiant fenetre principale
  • time_t temps_act;
  • WSADATA wsaData;
  • //Variables nécéssaires à l'envoi du message
  • SOCKET to_server_socket=0;
  • int port=25;
  • //Constantes
  • #define BYTES_PER_LINE_BASE64 57
  • #define FILLCHAR_B64 '='
  • /////////////////////////////////////////////////////////////////////////
  • //Declaration de Fonctions
  • /////////////////////////////////////////////////////////////////////////
  • bool Mef(HWND hdlg); //Vrai si tous les champs sont remplis correctement (Mise en Forme)
  • bool HourOK(int h,int m); //Vrai si l'heure d'envoi est atteinte
  • int Envoi(); //Realise l'envoi d'un message
  • int GetHour(); //Recupere l'heure actuelle
  • int GetMinutes(); //Devine
  • void SetDate();
  • void info(char *text);
  • int nbr(char *text,int n); //Transforme les n premiers caracteres d'une chaine en un entier
  • void bcopy( void *source, void *destination, int size );
  • void bzero( void *destination, int size ) ;
  • bool Process( char *buffer );
  • int Puissance (int a,int b);
  • void SetDest();
  • void SetSender();
  • bool SetBody();
  • void Concat(char * main,char * second,int init);
  • void Delete();
  • void CloseSocket(SOCKET s);
  • void base64_encoding(FILE *infile, FILE *outfile);//Encodage du fichier joint
  • char *seek_name(char chaine[150]); //Recuperer le nom du fichier
  • char *verif_extens(char chaine[150]); //Verifie l'extension et retourne le type de fichier
  • //Callback de la fenetre
  • BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam);
  • /////////////////////////////////////////////////////
  • //Entrée du programme
  • /////////////////////////////////////////////////////
  • int WINAPI WinMain(HINSTANCE hinst, HINSTANCE a, PSTR b, int v)
  • {
  • if( int err = WSAStartup( 0x0202, &wsaData ) )
  • {
  • MessageBox (NULL, TEXT ("dll winsock 2 non trouvée"), NULL, NULL);
  • return 0;
  • }
  • DialogBoxParam(hinst, (LPCTSTR)PAGE, 0, AppDlgProc, 0);
  • WSACleanup();
  • return 0;
  • }
  • //Callback de la fenetre
  • BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
  • {
  • int wmId, wmEvent;
  • switch(mssg) {
  • case WM_INITDIALOG:
  • h=hdlg;
  • SetTimer(hdlg,NULL,1000,NULL);
  • SetDlgItemText(hdlg,SENDER,"anonyme@boitemail.fr");
  • SetDlgItemText(hdlg,DEST,"destinataire@boitemail.fr");
  • SetDlgItemText(hdlg,SERVER,"smtp.cegetel.net");
  • SetDlgItemInt(hdlg,NB,1,TRUE);
  • return 0;
  • case WM_COMMAND:
  • wmId = LOWORD(wParam);
  • wmEvent = HIWORD(wParam);
  • if((LOWORD(wParam)==QUITTER)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • EndDialog(hdlg, 0);
  • return 0;
  • }
  • else if ((LOWORD(wParam)==ANNULER)&&(HIWORD(wParam)==BN_CLICKED) && etat!=0)
  • {
  • etat = 0;
  • Delete();
  • info("Envoi Annulé");
  • infini1=0;
  • }
  • else if ((LOWORD(wParam)==EFFACER)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • SetDlgItemText(hdlg,SUJET,"");
  • SetDlgItemText(hdlg,MESSAGE,"");
  • }
  • else if ((LOWORD(wParam)==ENVOYER)&&(HIWORD(wParam)==BN_CLICKED) && (etat==0))
  • {
  • if ((!hour_t) && Mef(hdlg))
  • {
  • if (!infini) etat = 1;
  • else etat=3;
  • }
  • if ((hour_t) && Mef(hdlg)) etat=2;
  • }
  • else if ((LOWORD(wParam)==INFINI)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • infini= !infini;
  • if (infini) EnableWindow(GetDlgItem(hdlg,NB),FALSE);
  • else EnableWindow(GetDlgItem(hdlg,NB),TRUE);
  • }
  • else if ((LOWORD(wParam)==HOUR)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • hour_t= !hour_t;
  • if (hour_t)
  • {
  • EnableWindow(GetDlgItem(hdlg,HT),TRUE);
  • EnableWindow(GetDlgItem(hdlg,MT),TRUE);
  • }
  • else
  • {
  • EnableWindow(GetDlgItem(hdlg,HT),FALSE);
  • EnableWindow(GetDlgItem(hdlg,MT),FALSE);
  • }
  • }
  • else if ((LOWORD(wParam)==FJOO) && (HIWORD(wParam)==BN_CLICKED))
  • {
  • fj= !fj;
  • if (fj)
  • {
  • EnableWindow(GetDlgItem(hdlg,FJ),TRUE);
  • }
  • else
  • {
  • EnableWindow(GetDlgItem(hdlg,FJ),FALSE);
  • }
  • }
  • else if ((LOWORD(wParam)==PSEUDO1)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • pseudo_b = !pseudo_b;
  • if (pseudo_b) EnableWindow(GetDlgItem(hdlg,PSEUDO),TRUE);
  • else EnableWindow(GetDlgItem(hdlg,PSEUDO),FALSE);
  • }
  • else if ((LOWORD(wParam)==HTML)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • html = !html;
  • }
  • else if ((LOWORD(wParam)==DESTF1)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • fdest= !fdest;
  • if (fdest) EnableWindow(GetDlgItem(hdlg,DESTF),TRUE);
  • else EnableWindow(GetDlgItem(hdlg,DESTF),FALSE);
  • }
  • else if ((LOWORD(wParam)==HOURF)&&(HIWORD(wParam)==BN_CLICKED))
  • {
  • hour_f= !hour_f;
  • if (hour_f)
  • {
  • EnableWindow(GetDlgItem(hdlg,HF),TRUE);
  • }
  • else
  • {
  • EnableWindow(GetDlgItem(hdlg,HF),FALSE);
  • }
  • }
  • return 0;
  • case WM_TIMER:
  • if (etat != 0) EnableWindow(GetDlgItem(h,ENVOYER),FALSE);
  • else EnableWindow(GetDlgItem(h,ENVOYER),TRUE);
  • if (etat == 1)
  • {
  • if (nbr_mails>0)
  • {
  • etat=4;
  • if (Envoi()==1) info("Message envoyé avec succès") ;
  • else info("L'envoi du message a échoué");
  • nbr_mails--;
  • etat=1;
  • }
  • else
  • {
  • etat=0;
  • Delete();
  • }
  • }
  • if (etat == 2)
  • {
  • if (infini1 == 0 && infini )
  • {
  • provisoire = new char [200];
  • Concat(provisoire,"Envois mis en attente (infini)",1);
  • info(provisoire);
  • infini1=1;
  • delete provisoire;
  • }
  • if (infini1 == 0 && !infini )
  • {
  • char * temp1;
  • temp1= new char [10];
  • provisoire = new char [200];
  • Concat(provisoire,"Envois mis en attente ",1);
  • Concat(provisoire,itoa(nbr_mails,temp1,10),0);
  • info(provisoire);
  • infini1=2;
  • delete temp1;delete provisoire;
  • }
  • if (HourOK(heure_e,minute_e))
  • {
  • if (infini1 == 1){
  • infini1=0;
  • etat = 3;
  • }
  • else
  • {
  • infini1=0;
  • etat=1;
  • }
  • }
  • }
  • if (etat == 3)
  • {
  • etat=4;
  • if (Envoi()==1) info("Message envoyé avec succès") ;
  • else info("L'envoi du message a échoué");
  • etat=3;
  • }
  • return 0;
  • case WM_CLOSE:
  • EndDialog(hdlg, 0);
  • return 0;
  • }
  • return 0;
  • }
  • /////////////////////////////////////////
  • // Implémentation des Fonctions
  • /////////////////////////////////////////
  • //Fonction qui détermine si l'heure d'envoi est atteinte
  • bool HourOK(int h,int m){
  • // Déterminer le temps actuel en secondes
  • int heures = GetHour();
  • int minutes = GetMinutes();
  • return ((h==heures) && (m==minutes));
  • }
  • //Fonction GetHour (recupere l'heure actuelle)
  • int GetHour(){
  • char result[3];
  • time(&temps_act);
  • char * date = ctime(&temps_act);
  • result[0]=date[11];
  • result[1]=date[12];
  • result[2]='\0';
  • return nbr(result,2);
  • }
  • //Fonction GetMinutes
  • int GetMinutes(){
  • char result[3];
  • time(&temps_act);
  • char * date = ctime(&temps_act);
  • result[0]=date[14];
  • result[1]=date[15];
  • result[2]='\0';
  • return nbr(result,2);
  • }
  • //Transformation des n premiers caracteres d'une chaine en un nombre
  • int nbr(char * text,int n){
  • int a=strlen(text),b=0,c=0,d=0;
  • if (a>n) a=n;
  • else n=a; //les 2 valeurs doivent avoir la valeur min pour la suite
  • char chiffres[11] = "0123456789";
  • while(a>0)
  • {
  • for(int i=0;i<10;i++) {
  • if ((text[n-a])==(chiffres[i])) {
  • c=i;
  • break;
  • }
  • }
  • c*=Puissance(10,(a-1));
  • d+=c;
  • c=0;
  • a--;
  • }
  • return d;
  • }
  • //Fonction Puissance (retourne a^b)
  • int Puissance (int a,int b)
  • {
  • if (b==0) return 1;
  • while (b>1){
  • a*=a;
  • b--;
  • }
  • return a;
  • }
  • //Fonction bcopy
  • 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];
  • }
  • //Fonction bzero
  • void bzero( void * destination, int size )
  • {
  • char * dst = ( char * ) destination;
  • for( int i=0; i<size; i++ )
  • dst[i] = 0x00;
  • }
  • void info(char * text)
  • {
  • SetDlgItemText(h,INFO,text);
  • }
  • /////////////////////////////////////////////////////////////////////////
  • //Fonction d'envoi du message
  • /////////////////////////////////////////////////////////////////////////
  • int Envoi(){
  • int not = 0;
  • unsigned long ioctl_blocking = 1;
  • struct sockaddr_in serverSockAddr; // addresse de la socket
  • struct hostent * serverHostEnt; // description du host serveur
  • long hostAddr; // addr du serveur
  • bzero( &serverSockAddr, sizeof( serverSockAddr ) ); // initialise a zero serverSockAddr
  • // converti l'adresse ip 9.100.1.1 en entier long
  • hostAddr = inet_addr( server ); //SERVER
  • if( ( long ) hostAddr != ( long ) -1 )
  • bcopy( &hostAddr, &serverSockAddr.sin_addr, sizeof( hostAddr ) );
  • else // si on a donne un nom
  • {
  • serverHostEnt = gethostbyname( server ); //SERVER
  • if ( serverHostEnt == NULL )
  • {
  • MessageBox (NULL, TEXT ("Erreur dans la résolution de l'host du \n server SMTP. Vérifiez le nom du server."),
  • NULL, NULL);
  • return 0;
  • }
  • bcopy( serverHostEnt->h_addr, &serverSockAddr.sin_addr, serverHostEnt->h_length );
  • }
  • serverSockAddr.sin_port = htons( port ); // host to network port
  • serverSockAddr.sin_family = AF_INET; // AF_*** : INET=internet
  • // creation de la socket
  • to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
  • if ( to_server_socket < 0)
  • {
  • MessageBox (NULL, TEXT ("Erreur dans la création de la socket.Vérifiez votre connection internet."),
  • NULL, NULL);
  • return 0;
  • }
  • setsockopt(to_server_socket, SOL_SOCKET, SO_DONTLINGER, (char *) &not, sizeof(not));
  • // requete de connexion
  • if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr,
  • sizeof( serverSockAddr ) ) < 0 )
  • {
  • MessageBox (NULL, TEXT ("Erreur dans la connection de la socket."),
  • NULL, NULL);
  • return 0;
  • }
  • ioctlsocket ( to_server_socket, FIONBIO, &ioctl_blocking );
  • char buf[ 1024 ];
  • buf[0] = 0x00;
  • while( !buf[0] )
  • int yeah = recv( to_server_socket, buf, 1024, 0 );
  • if (!Process( "EHLO Lalala\r\n"))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • if (!Process( mail_send ))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • if (!Process( mail_dest ))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • if (!Process( "DATA\r\n" ))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • if (!Process( body ))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • if (!Process( "QUIT\r\n" ))
  • {
  • CloseSocket(to_server_socket);
  • return 0;
  • }
  • /* fermeture de la connection */
  • CloseSocket(to_server_socket);
  • return 1;
  • }
  • //Fonction Process (un jour vous me remercierez pour mes commentaires si utiles)
  • bool Process( char * buffer )
  • {
  • char buf[ 1024 ];
  • buf[0] = 0x00;
  • int size = strlen( buffer );
  • int retVal = send( to_server_socket, buffer, size, 0 );
  • while( !buf[0] )
  • int yeah = recv( to_server_socket, buf, 1024, 0 );
  • int a=nbr(buf,3);
  • if (a!=250 && a!=354 && a!=221) {
  • return false;
  • }
  • return true;
  • //char temp[50];
  • //itoa(nbr(buf,3),temp,10);
  • //info(temp);
  • }
  • ///////////////////////////////////////////////////////
  • //Fonction de mise en forme du message
  • ///////////////////////////////////////////////////////
  • bool Mef(HWND hdlg){
  • err=false;
  • variables = true;
  • //Adresse mail imaginaire de l'envoyeur
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,SENDER,provisoire,198);
  • mail_sender = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • {
  • Concat(mail_sender,provisoire,1);
  • //Ne jamais mettre un char * en premier param d'une fonction strcpy
  • }
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse mail imaginaire"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Adresse mail du destinataire
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,DEST,provisoire,200);
  • mail_destinataire = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • Concat(mail_destinataire,provisoire,1);
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse du destinataire"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Adresse mail du faux destinataire
  • if (fdest)
  • {
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,DESTF,provisoire,200);
  • mail_fdestinataire = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • Concat(mail_fdestinataire,provisoire,1);
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse du destinataire"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • }
  • else mail_fdestinataire = new char [2];
  • //Pseudo
  • if (pseudo_b)
  • {
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,PSEUDO,provisoire,200);
  • pseudo = new char [strlen(provisoire)+2];
  • Concat(pseudo,provisoire,1);
  • delete provisoire;
  • }
  • else pseudo = new char [2];
  • //Serveur
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,SERVER,provisoire,200);
  • server = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • {
  • Concat(server,provisoire,1);
  • }
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le serveur smtp"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Sujet
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,SUJET,provisoire,200);
  • sujet_mail = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • Concat(sujet_mail,provisoire,1);
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le sujet"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Corps du message
  • provisoire = new char [1000];
  • GetDlgItemText(hdlg,MESSAGE,provisoire,1000);
  • texte_mail = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • Concat(texte_mail,provisoire,1);
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le corps du message"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Fichier joint
  • if (fj)
  • {
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,FJ,provisoire,200);
  • fichier = new char [strlen(provisoire)+2];
  • if(strlen(provisoire)>0)
  • Concat(fichier,provisoire,1);
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le fichier joint"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • }
  • else fichier = new char [2];
  • //Nombre de messages
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,NB,provisoire,200);
  • if(strlen(provisoire)>0)
  • nbr_mails=(atoi(provisoire)); //int
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le nombre de messages"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • if (hour_t)
  • {
  • //Heures reelles
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,HT,provisoire,200);
  • if(strlen(provisoire)>0)
  • {
  • heure_e=atoi(provisoire); //int
  • if (heure_e > 23)
  • {
  • MessageBox (NULL, TEXT ("Erreur : Les heures ne sont pas valides"),
  • NULL, NULL);
  • err=true;
  • }
  • }
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'heure reelle"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • //Minutes reelles
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,MT,provisoire,200);
  • if(strlen(provisoire)>0)
  • {
  • minute_e=atoi(provisoire); //int
  • if (minute_e > 59)
  • {
  • MessageBox (NULL, TEXT ("Erreur : Les minutes ne sont pas valides"),
  • NULL, NULL);
  • err=true;
  • }
  • }
  • else
  • {
  • err=true;
  • MessageBox (NULL, TEXT ("Erreur : Vous devez remplir les minutes reelle"),
  • NULL, NULL);
  • }
  • delete provisoire;
  • }
  • //Fausse Heure et Format Date
  • if (hour_f)
  • {
  • provisoire = new char [200];
  • GetDlgItemText(hdlg,HF,provisoire,200);
  • date = new char [strlen(provisoire)+2];
  • Concat(date,provisoire,1);
  • delete provisoire;
  • }
  • else
  • {
  • date = new char [33];
  • time(&temps_act);
  • char * date1 = ctime(&temps_act);
  • //Au niveau de l'esthetique de prog,c'est horrible mais j'ai la flemme...
  • //Cette partie sert à enlever le "CET" que l'on voit dans la date
  • //(ca peut etre utile : si vous voulez absolument le rajouter servez vous
  • //de l'option "fausse date")
  • date[0]=date1[0];date[1]=date1[1];date[2]=date1[2];date[3]=','; date[4]=date1[3];
  • date[5]=date1[8];date[6]=date1[9];date[7]=date1[3];date[8]=date1[4];date[9]=date1[5];
  • date[10]=date1[6];date[11]=date1[3];date[12]=date1[20];date[13]=date1[21];
  • date[14]=date1[22];date[15]=date1[23];date[16]=date1[3];date[17]=date1[11];
  • date[18]=date1[12];date[19]=date1[13];date[20]=date1[14];date[21]=date1[15];
  • date[22]=date1[16];date[23]=date1[17];date[24]=date1[18];date[25]=date1[3];
  • date[26]='+';date[27]='0';date[28]='1';date[29]='0';date[30]='0';date[30]='0';
  • date[31]='\0';
  • //Fri, 06 Jan 2006 16:46:38 +0100 //Heure Mail
  • //0123456789012345678901234567890
  • //Sun Jan 08 16:29:39 2006 //Heure PC
  • }
  • SetDest();
  • SetSender();
  • if (!SetBody())
  • {
  • err=true;
  • }
  • if (err)
  • {
  • info("Envoi échoué");
  • Delete();
  • }
  • return !err;
  • }
  • //Fonction GetDest
  • void SetDest()
  • {
  • Concat(mail_dest,"RCPT To: <",1);
  • Concat(mail_dest,mail_destinataire,0);
  • Concat(mail_dest,">\r\n",0);
  • }
  • void SetSender()
  • {
  • Concat(mail_send,"MAIL From: <",1);
  • Concat(mail_send,mail_sender,0);
  • Concat(mail_send,">\r\n",0);
  • }
  • bool SetBody()
  • {
  • Concat(body,"From: ",1);
  • if (pseudo_b)Concat(body,pseudo,0);
  • Concat(body,"<",0);
  • Concat(body,mail_sender,0);
  • Concat(body,">",0);
  • Concat(body,"\r\nSubject: ",0);
  • Concat(body,sujet_mail,0);
  • Concat(body,"\r\nTo: ",0);
  • if (fdest) Concat(body,mail_fdestinataire,0);
  • else Concat(body,mail_destinataire,0);
  • Concat(body,"\r\nDate: ",0);
  • Concat(body,date,0);
  • char *Type;
  • if (html)
  • {
  • //Concat(body,"\r\n",0);
  • //Concat(body,"Content-Type: text/html; charset=iso-8859-1\n",0);
  • Type = "html";
  • }
  • else Type = "plain";
  • // if(fj)
  • // {
  • Concat(body,"\r\nMIME-Version: 1.0",0);
  • Concat(body,"\r\nContent-Type: multipart/mixed;",0);
  • Concat(body," boundary=\"Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\"\r\n\r\n",0);
  • Concat(body,"--Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\r\n",0);
  • Concat(body,"Content-Type: text/",0);
  • Concat(body,Type,0);
  • Concat(body,"; charset=iso-8859-1",0);
  • // }
  • //*/
  • Concat(body,"\r\n\r\n",0);
  • Concat(body,texte_mail,0);
  • if (fj)
  • {
  • Concat(body,"\r\n",0);
  • Concat(body,"--Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\r\n",0);
  • Concat(body,"Content-Type: ",0);
  • Concat(body,verif_extens(fichier),0);
  • Concat(body,";",0);
  • Concat(body," name=\"",0);
  • Concat(body,seek_name(fichier),0);
  • Concat(body,"\"\r\n",0);
  • Concat(body,"Content-Transfer-Encoding: base64\r\n",0);
  • Concat(body,"Content-Disposition: attachment;",0);
  • Concat(body," filename=\"",0);
  • Concat(body,seek_name(fichier),0);
  • Concat(body,"\"\r\n\r\n",0);
  • FILE *infile=fopen(fichier,"rb");
  • if(!infile) return false;
  • FILE *outfile=fopen("$$$$$$$$.$$$","w");
  • if(infile)
  • {
  • base64_encoding(infile, outfile);
  • fclose(infile);
  • fclose(outfile);
  • infile=fopen("$$$$$$$$.$$$","r");
  • char *buf_lecture=new char[1024+1];
  • while(!feof(infile))
  • {
  • fread(buf_lecture,1024,1,infile);
  • Concat(body,buf_lecture,0);
  • }
  • fclose(infile);
  • delete buf_lecture;
  • remove("$$$$$$$$.$$$");
  • }
  • }//IF (fj)
  • Concat(body,"\r\n.\r\n",0);
  • //*/
  • return true;
  • }
  • //Fonction Concat
  • void Concat(char * main,char * second,int init){
  • if (init==0)
  • {
  • main+=strlen(main);
  • strcpy(main,second);
  • }
  • else strcpy(main,second);
  • }
  • void Delete()
  • {
  • if (variables)
  • {
  • delete mail_sender;
  • delete mail_destinataire;
  • delete mail_fdestinataire;
  • delete pseudo;
  • delete sujet_mail;
  • delete texte_mail;
  • delete type;
  • delete server;
  • delete date;
  • delete fichier;
  • }
  • variables = false;
  • }
  • //Fermeture d'une socket
  • void CloseSocket(SOCKET s)
  • {
  • shutdown(s,2);
  • closesocket( s );
  • }
  • //Fonction d'encodage d'un fichier en base 64
  • void base64_encoding(FILE *infile, FILE *outfile)
  • {
  • u_long lines_per_part=10;
  • char B64_code[64];
  • //init base64 encoding:
  • int i;
  • for(i=0;i<26;i++) B64_code[i]=(i+'A');
  • for(i=26;i<52;i++) B64_code[i]=(i+'G');
  • for(i=52;i<62;i++) B64_code[i]=(i-4);
  • B64_code[62]='+';
  • B64_code[63]='/';
  • size_t read_chars=32718;
  • char in_line[32718];
  • size_t bytes_read=0;
  • int lines_per_round;
  • char *source=in_line;
  • char out_line[45900];
  • char *dest=&out_line[0];
  • int count, rounds;
  • lines_per_round=read_chars/BYTES_PER_LINE_BASE64;
  • rounds=BYTES_PER_LINE_BASE64/3;
  • while(!feof(infile) && lines_per_round>0)
  • {
  • if(lines_per_round>lines_per_part)
  • { read_chars=lines_per_part*BYTES_PER_LINE_BASE64;
  • lines_per_part=lines_per_round; }
  • bytes_read=fread(in_line,1,read_chars,infile);
  • source=&in_line[0];
  • i=bytes_read/BYTES_PER_LINE_BASE64;
  • bytes_read-=i*BYTES_PER_LINE_BASE64;
  • while(i-->0)
  • {
  • count=rounds;
  • while(count-->0)
  • {
  • *dest++=B64_code[(*source & 252)>>2];
  • *dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
  • *dest++=B64_code[((*(source+1) & 15)<<2) | ((*(source+2) & 192)>>6)];
  • *dest++=B64_code[*(source+2) & 63];
  • source+=3;
  • }
  • }
  • fwrite(&out_line[0],dest - &out_line[0],1,outfile);
  • dest=&out_line[0];
  • lines_per_part=lines_per_round;
  • }
  • if(bytes_read>0)
  • {
  • while(bytes_read>=3)
  • {
  • *dest++=B64_code[(*source & 252)>>2];
  • *dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
  • *dest++=B64_code[((*(source+1) & 15)<<2) | ((*(source+2) & 192)>>6)];
  • *dest++=B64_code[*(source+2) & 63];
  • source+=3;bytes_read-=3;
  • }
  • if(bytes_read==2)
  • {
  • *dest++=B64_code[(*source & 252)>>2];
  • *dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
  • *dest++=B64_code[(*(source+1) & 15)<<2];
  • *dest++=FILLCHAR_B64;
  • }
  • if(bytes_read==1)
  • {
  • *dest++=B64_code[(*source & 252)>>2];
  • *dest++=B64_code[(*source & 3)<<4];
  • *dest++=FILLCHAR_B64;
  • *dest++=FILLCHAR_B64;
  • }
  • }
  • if(dest!=&out_line[0])
  • fwrite(&out_line[0],dest - &out_line[0],1,outfile);
  • }
  • //Fonction pour récupérer le nom du fichier
  • char *seek_name(char chaine[150])
  • {
  • int len=strlen(chaine), debut=1;
  • for(int a=len;a>=1;a--)
  • if( (debut==1) && (chaine[a]=='\\') )
  • debut=a+1;
  • char *nom_fichier=new char[len-debut+3];
  • for(int z=debut,b=0;z<=len;z++, b++)
  • nom_fichier[b]=chaine[z];
  • return nom_fichier;
  • }
  • //Fonction qui examine l'extension et qui retourne le type de fichier en conséquence
  • char *verif_extens(char chaine[150])
  • {
  • int len=strlen(chaine);
  • char *type_fichier;
  • for(int a=len;a>=0;a--)
  • {
  • if(chaine[a]=='.')
  • {
  • if( (chaine[a+1]=='e') && (chaine[a+2]=='x') && (chaine[a+3]=='e') )
  • { //application exe :
  • type_fichier="application/octet-stream";
  • return type_fichier; }
  • if( (chaine[a+1]=='g') && (chaine[a+2]=='i') && (chaine[a+3]=='f') )
  • { //image gif :
  • type_fichier="image/gif";
  • return type_fichier; }
  • if( (chaine[a+1]=='j') && (chaine[a+2]=='p') && (chaine[a+3]=='g') )
  • { //image jpeg :
  • type_fichier="image/jpeg";
  • return type_fichier; }
  • if( (chaine[a+1]=='m') && (chaine[a+2]=='p') && (chaine[a+3]=='g') )
  • { //vidéo mpeg :
  • type_fichier="video/mpeg";
  • return type_fichier; }
  • if( (chaine[a+1]=='p') && (chaine[a+2]=='c') && (chaine[a+3]=='m') )
  • { //son pcm :
  • type_fichier="audio/basic";
  • return type_fichier; }
  • if( (chaine[a+1]=='b') && (chaine[a+2]=='m') && (chaine[a+3]=='p') )
  • { //son pcm :
  • type_fichier="image/bmp";
  • return type_fichier; }
  • if( (chaine[a+1]=='t') && (chaine[a+2]=='x') && (chaine[a+3]=='t') )
  • { //son pcm :
  • type_fichier="texte/txt";
  • return type_fichier; }
  • }
  • }
  • return "type_inconnu";
  • }
//////////////////////////////////////////////////////////////////
//                  MailSender by KissyFroth                    //
//////////////////////////////////////////////////////////////////			


// Ce programme permet d'envoyer des messages via des serveurs smtp

// ATTENTION IMPORTANT : NE PAS OUBLIER D'INCLURE ws2_32.lib 
// DANS  PROJECT->SETTINGS->LINK->Objects/Library Modules





///////////////////////////////////////////
//           Serveurs SMTP               //
///////////////////////////////////////////
//        smtp.laposte.net               //
//        smtp.ifrance.com               //
//        smtp.mail.yahoo.fr             //
//      * smtp.neuf.fr                   //
//      * smtp.cegetel.net               //
//        mail.club-internet.fr          //
//        smtp.wanadoo.fr                //
//                                       //
///////////////////////////////////////////

//Les serveurs marqués de * sont testés et approuvés



/////////////////////////////////////////////////////////////////////////
// Librairies à inclure
/////////////////////////////////////////////////////////////////////////

#include <windows.h>

#include <commctrl.h>
#include "stdafx.h"
#include "resource.h"

#include <time.h>   //Librairie pour la gestion du tps

#include <winsock2.h>
#include <Ws2tcpip.h>

#include <string.h>
#include <iostream>

////////////////////////////////////////////////////
//Déclaration de variables globales
////////////////////////////////////////////////////

bool infini=false,hour_t=false,pseudo_b=false,html=false,err=false,fdest=false,hour_f=false,fj=false;


int infini1=0;
char *provisoire;  //Variable la plus importante du programme (sert à TOUT)

bool variables = false;

//Provisoires
char * mail_sender ;
char * mail_destinataire;
char * pseudo;
char * sujet_mail;
char * texte_mail;
char * type;
char * server;
char * mail_fdestinataire;
char * date;
char * fichier;
char * fichier_encode;


//Envoyées
char body [5000000];
char mail_dest[200];
char mail_send[200];

//Divers
int heure_e,minute_e; //Heure d'envoi
int nbr_mails;

int etat=0; //Etat du programme (en attente,envoi programmé,en cours d'envoi,etc...)

HWND h; //Identifiant fenetre principale

time_t temps_act; 
WSADATA wsaData;

//Variables nécéssaires à l'envoi du message


	SOCKET to_server_socket=0;
	int port=25;


//Constantes
#define BYTES_PER_LINE_BASE64   57
#define FILLCHAR_B64 			'='


/////////////////////////////////////////////////////////////////////////
//Declaration de Fonctions
/////////////////////////////////////////////////////////////////////////


bool Mef(HWND hdlg); //Vrai si tous les champs sont remplis correctement (Mise en Forme)

bool HourOK(int h,int m);    //Vrai si l'heure d'envoi est atteinte


int Envoi();      //Realise l'envoi d'un message

int GetHour();     //Recupere l'heure actuelle 
int GetMinutes();  //Devine 

void SetDate();

void info(char *text);

int nbr(char *text,int n); //Transforme les n premiers caracteres d'une chaine en un entier

void bcopy( void *source, void *destination, int size );
void bzero( void *destination, int size ) ;

bool Process( char *buffer );
int Puissance (int a,int b);


void SetDest();
void SetSender();
bool SetBody();

void Concat(char * main,char * second,int init);

void Delete();

void CloseSocket(SOCKET s);

void base64_encoding(FILE *infile, FILE *outfile);//Encodage du fichier joint


char *seek_name(char chaine[150]); //Recuperer le nom du fichier
char *verif_extens(char chaine[150]); //Verifie l'extension et retourne le type de fichier

//Callback de la fenetre
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam);




/////////////////////////////////////////////////////
//Entrée du programme
/////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hinst,  HINSTANCE a, PSTR b, int v)
{


	if( int err = WSAStartup( 0x0202, &wsaData ) ) 
	{
		MessageBox (NULL, TEXT ("dll winsock 2 non trouvée"), NULL, NULL);
		return 0;
	}
		
	DialogBoxParam(hinst, (LPCTSTR)PAGE, 0, AppDlgProc, 0); 

	WSACleanup();
  
	return 0;



}


//Callback de la fenetre
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{

	

int wmId, wmEvent;


	switch(mssg) {
		
		case WM_INITDIALOG:
		
			h=hdlg;
			SetTimer(hdlg,NULL,1000,NULL);	
	
	SetDlgItemText(hdlg,SENDER,"anonyme@boitemail.fr");
	SetDlgItemText(hdlg,DEST,"destinataire@boitemail.fr");
	SetDlgItemText(hdlg,SERVER,"smtp.cegetel.net");
	SetDlgItemInt(hdlg,NB,1,TRUE);
			return 0;
		

		case WM_COMMAND:
		
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);

		if((LOWORD(wParam)==QUITTER)&&(HIWORD(wParam)==BN_CLICKED))
		{
			EndDialog(hdlg, 0);
			return 0;
		}
		
		else if ((LOWORD(wParam)==ANNULER)&&(HIWORD(wParam)==BN_CLICKED) && etat!=0)
		{
			etat = 0;
			Delete();
			info("Envoi Annulé");
			infini1=0;
		}
		
		else if ((LOWORD(wParam)==EFFACER)&&(HIWORD(wParam)==BN_CLICKED))
		{
			SetDlgItemText(hdlg,SUJET,"");
			SetDlgItemText(hdlg,MESSAGE,"");	
		}
		
		
		else if ((LOWORD(wParam)==ENVOYER)&&(HIWORD(wParam)==BN_CLICKED) && (etat==0))
		{
			
			if ((!hour_t) && Mef(hdlg))
			{
				if (!infini) etat = 1;
				else etat=3;
			}
			if ((hour_t) && Mef(hdlg)) etat=2;

		}
		
		
		else if ((LOWORD(wParam)==INFINI)&&(HIWORD(wParam)==BN_CLICKED))
		{
			infini= !infini;
			if (infini) EnableWindow(GetDlgItem(hdlg,NB),FALSE);
			else  EnableWindow(GetDlgItem(hdlg,NB),TRUE);
		
		}
		
		
		else if ((LOWORD(wParam)==HOUR)&&(HIWORD(wParam)==BN_CLICKED))
		{
			hour_t= !hour_t;
			if (hour_t)
			{
				EnableWindow(GetDlgItem(hdlg,HT),TRUE);
				EnableWindow(GetDlgItem(hdlg,MT),TRUE);
			}
			else  
			{
				EnableWindow(GetDlgItem(hdlg,HT),FALSE);
				EnableWindow(GetDlgItem(hdlg,MT),FALSE);
			}
		}
		
		else if ((LOWORD(wParam)==FJOO) && (HIWORD(wParam)==BN_CLICKED))
		{
			fj= !fj;
			if (fj)
			{
				EnableWindow(GetDlgItem(hdlg,FJ),TRUE);
			}
			else
			{
				EnableWindow(GetDlgItem(hdlg,FJ),FALSE);
			}
		}
		
		else if ((LOWORD(wParam)==PSEUDO1)&&(HIWORD(wParam)==BN_CLICKED))
		
		{
			pseudo_b = !pseudo_b;
			if (pseudo_b) EnableWindow(GetDlgItem(hdlg,PSEUDO),TRUE);
			else  EnableWindow(GetDlgItem(hdlg,PSEUDO),FALSE);
		}
		else if ((LOWORD(wParam)==HTML)&&(HIWORD(wParam)==BN_CLICKED))
		{
			html = !html;
		}
		
		else if ((LOWORD(wParam)==DESTF1)&&(HIWORD(wParam)==BN_CLICKED))
		{
			
			fdest= !fdest;
			if (fdest) EnableWindow(GetDlgItem(hdlg,DESTF),TRUE);
			else  EnableWindow(GetDlgItem(hdlg,DESTF),FALSE);
		
		}
		else if ((LOWORD(wParam)==HOURF)&&(HIWORD(wParam)==BN_CLICKED))
		{
			
			hour_f= !hour_f;
			if (hour_f)
			{ 
				EnableWindow(GetDlgItem(hdlg,HF),TRUE);
			}
			else
			{
				EnableWindow(GetDlgItem(hdlg,HF),FALSE);
			}
		}
		
		return 0;

		case WM_TIMER:

			if (etat != 0) EnableWindow(GetDlgItem(h,ENVOYER),FALSE);	
			else EnableWindow(GetDlgItem(h,ENVOYER),TRUE);

			if (etat == 1)
			{
				if (nbr_mails>0)
				{
					etat=4;
					if (Envoi()==1) info("Message envoyé avec succès") ;
					else info("L'envoi du message a échoué"); 
					nbr_mails--;
					etat=1;
				}
				else
				{
					etat=0;
					Delete();
				}
			}

			if (etat == 2)
			{
				if (infini1 == 0 && infini )
				{ 
					provisoire = new char [200];
					Concat(provisoire,"Envois mis en attente (infini)",1);
					info(provisoire);
					infini1=1;
					delete provisoire;
				}
				if (infini1 == 0 && !infini )
				{ 
					char * temp1;
					temp1= new char [10];
					provisoire = new char [200];
					Concat(provisoire,"Envois mis en attente ",1);
					Concat(provisoire,itoa(nbr_mails,temp1,10),0);
					info(provisoire);
					infini1=2;
					delete temp1;delete provisoire;
				}
				
				if (HourOK(heure_e,minute_e)) 
				{
					if (infini1 == 1){
						infini1=0;
						etat = 3;
					}
					else
					{
						infini1=0;
						etat=1;
					}
				}
			}
			
			if (etat == 3)
			{
				etat=4;
				if (Envoi()==1) info("Message envoyé avec succès") ;
				else info("L'envoi du message a échoué"); 
				etat=3;
			}


		return 0;

		case WM_CLOSE:
			
			EndDialog(hdlg, 0);
		return 0;

	}

  return 0;
}





/////////////////////////////////////////
// Implémentation des Fonctions 
/////////////////////////////////////////



//Fonction qui détermine si l'heure d'envoi est atteinte
	bool HourOK(int h,int m){


	 // Déterminer le temps actuel en secondes 

	int heures = GetHour();
	int minutes = GetMinutes();

		return ((h==heures) && (m==minutes));
		
	}


//Fonction GetHour (recupere l'heure actuelle)
	int GetHour(){
		
		char result[3];
		time(&temps_act);
		char * date = ctime(&temps_act);

		result[0]=date[11];
		result[1]=date[12];
		result[2]='\0';
	
		return nbr(result,2);
	}

//Fonction GetMinutes
	int GetMinutes(){
		
		char result[3];
		time(&temps_act);
		char * date = ctime(&temps_act);
		
		result[0]=date[14];
		result[1]=date[15];
		result[2]='\0';
	
		return nbr(result,2);

	}


//Transformation des n premiers caracteres d'une chaine en un nombre
int nbr(char * text,int n){
		
	int a=strlen(text),b=0,c=0,d=0;
	
	if (a>n) a=n;
	else n=a;     //les 2 valeurs doivent avoir la valeur min pour la suite

	char chiffres[11] = "0123456789";
		
	while(a>0) 
	{
		for(int i=0;i<10;i++) {
			if ((text[n-a])==(chiffres[i])) {
				c=i; 
				break;
			}
		}

		c*=Puissance(10,(a-1));
			
		d+=c;
		c=0;
		a--;
	}
	
	return d;	
}

//Fonction Puissance (retourne a^b)
int Puissance (int a,int b)
{

	if (b==0) return 1;
	while (b>1){
		a*=a;
		b--;
	}
	return a;
}

//Fonction bcopy
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]; 
} 
  

//Fonction bzero 
void bzero( void * destination, int size ) 
{ 
   char * dst = ( char * ) destination; 
  
   for( int i=0; i<size; i++ ) 
      dst[i] = 0x00; 
} 



void info(char * text)
{
	SetDlgItemText(h,INFO,text);
}


/////////////////////////////////////////////////////////////////////////
//Fonction d'envoi du message	
/////////////////////////////////////////////////////////////////////////

int Envoi(){




		int not = 0; 
	    unsigned long ioctl_blocking = 1; 
		
   struct sockaddr_in serverSockAddr; // addresse de la socket 
   struct hostent * serverHostEnt; // description du host serveur 
   long hostAddr; // addr du serveur 
  


   bzero( &serverSockAddr, sizeof( serverSockAddr ) ); // initialise a zero serverSockAddr 
   // converti l'adresse ip 9.100.1.1 en entier long 
   hostAddr = inet_addr( server );   //SERVER
  
   if( ( long ) hostAddr != ( long ) -1 ) 
      bcopy( &hostAddr, &serverSockAddr.sin_addr, sizeof( hostAddr ) ); 
   else // si on a donne un nom 
   { 
      
	   
	 
	  
	   serverHostEnt = gethostbyname( server );  //SERVER
      if ( serverHostEnt == NULL ) 
      { 
         MessageBox (NULL, TEXT ("Erreur dans la résolution de l'host du \n server SMTP. Vérifiez le nom du server."), 
         NULL, NULL);
		 return 0;
	  } 
      bcopy( serverHostEnt->h_addr, &serverSockAddr.sin_addr, serverHostEnt->h_length ); 
   } 

   serverSockAddr.sin_port = htons( port ); // host to network port 
   serverSockAddr.sin_family = AF_INET; // AF_*** : INET=internet 
   // creation de la socket 
  
   to_server_socket = socket( AF_INET, SOCK_STREAM, 0 ); 
   if ( to_server_socket < 0) 
   { 
      MessageBox (NULL, TEXT ("Erreur dans la création de la socket.Vérifiez votre connection internet."), 
            NULL, NULL);
			return 0;
   } 
  
   setsockopt(to_server_socket, SOL_SOCKET, SO_DONTLINGER, (char *) &not, sizeof(not)); 
  
  
   // requete de connexion 
   if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr, 
                                      sizeof( serverSockAddr ) ) < 0 ) 
   { 
      MessageBox (NULL, TEXT ("Erreur dans la connection de la socket."), 
            NULL, NULL);
			return 0;
   } 
  
   ioctlsocket ( to_server_socket, FIONBIO, &ioctl_blocking ); 
  
   char buf[ 1024 ]; 
   buf[0] = 0x00; 
   while( !buf[0] ) 
      int yeah = recv( to_server_socket, buf, 1024, 0 ); 


	if (!Process( "EHLO Lalala\r\n"))  
	{
	   CloseSocket(to_server_socket); 
		return 0;
    }
	if (!Process( mail_send  ))
	{        
		CloseSocket(to_server_socket); 
		return 0;
	}
		
	if (!Process( mail_dest  ))
	{
		CloseSocket(to_server_socket); 
		return 0;
	}
	if (!Process( "DATA\r\n" ))
	{
        CloseSocket(to_server_socket); 
		return 0;
	}
	if (!Process( body       ))
	{
		CloseSocket(to_server_socket);
		return 0;
	}
	if (!Process( "QUIT\r\n" ))
	{
        CloseSocket(to_server_socket);
		return 0;
	}

   /* fermeture de la connection */ 
	CloseSocket(to_server_socket);
   
return 1;

}

//Fonction Process (un jour vous me remercierez pour mes commentaires si utiles)
bool Process( char * buffer )
{


   char buf[ 1024 ];
	buf[0] = 0x00;
   
	int size = strlen( buffer );
   int retVal = send( to_server_socket, buffer, size, 0 );

   while( !buf[0] )
      int yeah = recv( to_server_socket, buf, 1024, 0 ); 
	
    int a=nbr(buf,3);
	
	if (a!=250 && a!=354 && a!=221) {
		return false;
	}
return true;

//char temp[50];
	
//itoa(nbr(buf,3),temp,10);
//info(temp);


}

///////////////////////////////////////////////////////
//Fonction de mise en forme du message
///////////////////////////////////////////////////////

bool Mef(HWND hdlg){


	err=false;

	variables = true;

//Adresse mail imaginaire de l'envoyeur


	provisoire = new char [200];
	GetDlgItemText(hdlg,SENDER,provisoire,198);
	mail_sender = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
	{
	
		Concat(mail_sender,provisoire,1);
	//Ne jamais mettre un char * en premier param d'une fonction strcpy
	}

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse mail imaginaire"), 
    NULL, NULL);
	}		
	delete provisoire;


//Adresse mail du destinataire

	provisoire = new char [200];
	GetDlgItemText(hdlg,DEST,provisoire,200);
	mail_destinataire = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
		Concat(mail_destinataire,provisoire,1);

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse du destinataire"), 
    NULL, NULL);
	}
	delete provisoire;

//Adresse mail du faux destinataire

if (fdest)
{
	
	provisoire = new char [200];
	GetDlgItemText(hdlg,DESTF,provisoire,200);
	mail_fdestinataire = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
		
		Concat(mail_fdestinataire,provisoire,1);

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'adresse du destinataire"), 
    NULL, NULL);
	}
	delete provisoire;
}
else mail_fdestinataire = new char [2];


//Pseudo
if (pseudo_b)
{
	provisoire = new char [200];
	GetDlgItemText(hdlg,PSEUDO,provisoire,200);
	pseudo = new char [strlen(provisoire)+2];
	
	Concat(pseudo,provisoire,1);
	
	delete provisoire;
				
}
else pseudo = new char [2];


//Serveur

	provisoire = new char [200];
	GetDlgItemText(hdlg,SERVER,provisoire,200);
	server = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
	{
		Concat(server,provisoire,1);	
	}
	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le serveur smtp"), 
    NULL, NULL);
	}
	delete provisoire;
	
//Sujet

	provisoire = new char [200];
	GetDlgItemText(hdlg,SUJET,provisoire,200);
	sujet_mail = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
		Concat(sujet_mail,provisoire,1);

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le sujet"), 
    NULL, NULL);
	}
	delete provisoire;

//Corps du message

	provisoire = new char [1000];
	GetDlgItemText(hdlg,MESSAGE,provisoire,1000);
	texte_mail = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
		Concat(texte_mail,provisoire,1);

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le corps du message"), 
    NULL, NULL);
	}
	delete provisoire;
					

//Fichier joint

if (fj)
{
	
	provisoire = new char [200];
	GetDlgItemText(hdlg,FJ,provisoire,200);
	fichier = new char [strlen(provisoire)+2];
	if(strlen(provisoire)>0)
		
		Concat(fichier,provisoire,1);

	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le fichier joint"), 
    NULL, NULL);
	}
	delete provisoire;
}
else fichier = new char [2];
	


//Nombre de messages

	provisoire = new char [200];
	GetDlgItemText(hdlg,NB,provisoire,200);
	if(strlen(provisoire)>0)
		
		nbr_mails=(atoi(provisoire));  //int
	
	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir le nombre de messages"), 
    NULL, NULL);
	}
	delete provisoire;
	
if (hour_t)
{	

//Heures reelles

	provisoire = new char [200];
	GetDlgItemText(hdlg,HT,provisoire,200);
	if(strlen(provisoire)>0)
	{
		
		heure_e=atoi(provisoire); //int
		if (heure_e > 23) 
		{
			MessageBox (NULL, TEXT ("Erreur : Les heures ne sont pas valides"), 
			NULL, NULL);
			err=true;
		}
	}
	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir l'heure reelle"), 
    NULL, NULL);
	}
	delete provisoire;

//Minutes reelles

	provisoire = new char [200];
	GetDlgItemText(hdlg,MT,provisoire,200);
	if(strlen(provisoire)>0)
	{
		
		minute_e=atoi(provisoire); //int
		if (minute_e > 59) 
		{
			MessageBox (NULL, TEXT ("Erreur : Les minutes ne sont pas valides"), 
			NULL, NULL);
			err=true;
		}
	}
	else
	{	
	err=true;
	MessageBox (NULL, TEXT ("Erreur : Vous devez remplir les minutes reelle"), 
    NULL, NULL);
	}
	delete provisoire;	
}	
	
//Fausse Heure et Format Date

if (hour_f)
{
	
	provisoire = new char [200];
	GetDlgItemText(hdlg,HF,provisoire,200);
	date = new char [strlen(provisoire)+2];
	
		Concat(date,provisoire,1);
	
	delete provisoire;
}
else 
{
	date = new char [33];

	time(&temps_act);
	char * date1 = ctime(&temps_act);

//Au niveau de l'esthetique de prog,c'est horrible mais j'ai la flemme...
//Cette partie sert à enlever le "CET" que l'on voit dans la date 
//(ca peut etre utile : si vous voulez absolument le rajouter servez vous 
//de l'option "fausse date")

	date[0]=date1[0];date[1]=date1[1];date[2]=date1[2];date[3]=',';     date[4]=date1[3];
	date[5]=date1[8];date[6]=date1[9];date[7]=date1[3];date[8]=date1[4];date[9]=date1[5];
	date[10]=date1[6];date[11]=date1[3];date[12]=date1[20];date[13]=date1[21];
	date[14]=date1[22];date[15]=date1[23];date[16]=date1[3];date[17]=date1[11];
	date[18]=date1[12];date[19]=date1[13];date[20]=date1[14];date[21]=date1[15];
	date[22]=date1[16];date[23]=date1[17];date[24]=date1[18];date[25]=date1[3];
	date[26]='+';date[27]='0';date[28]='1';date[29]='0';date[30]='0';date[30]='0';
	date[31]='\0';

//Fri, 06 Jan 2006 16:46:38 +0100       //Heure Mail
//0123456789012345678901234567890
//Sun Jan 08 16:29:39 2006              //Heure PC
	

}


	SetDest();
	SetSender();
	if (!SetBody()) 
	{
		err=true;
	}
	
	if (err) 
	{
		info("Envoi échoué");
		Delete();
	}
	
	return !err;

}



//Fonction GetDest
void SetDest()
{	
	Concat(mail_dest,"RCPT To: <",1);
	Concat(mail_dest,mail_destinataire,0);
	Concat(mail_dest,">\r\n",0);
}
	
	
void SetSender()
{
		Concat(mail_send,"MAIL From: <",1);
		Concat(mail_send,mail_sender,0);
		Concat(mail_send,">\r\n",0);
}
	
	
	
bool SetBody()
{
	Concat(body,"From: ",1);	
	
	if (pseudo_b)Concat(body,pseudo,0);
	
	Concat(body,"<",0);
	Concat(body,mail_sender,0);
	Concat(body,">",0);

		
	Concat(body,"\r\nSubject: ",0);
	Concat(body,sujet_mail,0);

	Concat(body,"\r\nTo: ",0);

	if (fdest) Concat(body,mail_fdestinataire,0);
	else Concat(body,mail_destinataire,0);
	

	Concat(body,"\r\nDate: ",0);
	Concat(body,date,0);


	char *Type;
	if (html)
	{
		//Concat(body,"\r\n",0);
		//Concat(body,"Content-Type: text/html; charset=iso-8859-1\n",0);
		Type = "html";
	}
	else Type = "plain";

//	if(fj)
//	{
		Concat(body,"\r\nMIME-Version: 1.0",0);
		Concat(body,"\r\nContent-Type: multipart/mixed;",0);
		Concat(body," boundary=\"Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\"\r\n\r\n",0);
	
		Concat(body,"--Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\r\n",0);
		Concat(body,"Content-Type: text/",0);
		Concat(body,Type,0);
		Concat(body,"; charset=iso-8859-1",0);
		
//	}

//*/
	Concat(body,"\r\n\r\n",0);
	Concat(body,texte_mail,0);



	if (fj)
	{

	Concat(body,"\r\n",0);

	Concat(body,"--Boundary_(ID_JK8sfTufWdySQFXNsMQU4Q)\r\n",0);
	Concat(body,"Content-Type: ",0);
	Concat(body,verif_extens(fichier),0);
	Concat(body,";",0);
	Concat(body," name=\"",0);
	Concat(body,seek_name(fichier),0);
	Concat(body,"\"\r\n",0);
	Concat(body,"Content-Transfer-Encoding: base64\r\n",0);
	Concat(body,"Content-Disposition: attachment;",0);
	Concat(body," filename=\"",0);
	Concat(body,seek_name(fichier),0);
	Concat(body,"\"\r\n\r\n",0);


		FILE *infile=fopen(fichier,"rb");
		if(!infile) 	return false;
		
		FILE *outfile=fopen("$$$$$$$$.$$$","w");
			if(infile) 	
			{
				base64_encoding(infile, outfile);
				fclose(infile);
				fclose(outfile);
				infile=fopen("$$$$$$$$.$$$","r");
				char *buf_lecture=new char[1024+1];
				while(!feof(infile))
				{
				fread(buf_lecture,1024,1,infile);
				Concat(body,buf_lecture,0);
				}
				fclose(infile);
				delete buf_lecture;
				remove("$$$$$$$$.$$$");
			}
				
	}//IF (fj) 


	Concat(body,"\r\n.\r\n",0);
//*/

	return true;

}



//Fonction Concat
void Concat(char * main,char * second,int init){

		if (init==0)
		{
			main+=strlen(main);
			strcpy(main,second);
		}
		else strcpy(main,second);
			
}


void Delete()
{
	
	if (variables)
	{

	delete mail_sender;
	delete mail_destinataire;
	delete mail_fdestinataire;
	delete pseudo;
	delete sujet_mail;
	delete texte_mail;
	delete type;
	delete server;
	delete date;
	delete fichier;
	}

	variables = false;
}

//Fermeture d'une socket
void CloseSocket(SOCKET s)
{
	shutdown(s,2); 
	closesocket( s );
}


//Fonction d'encodage d'un fichier en base 64
void base64_encoding(FILE *infile, FILE *outfile)
{
	u_long lines_per_part=10;
	char B64_code[64];

	//init base64 encoding:
	int i;
	for(i=0;i<26;i++) 	B64_code[i]=(i+'A');
	for(i=26;i<52;i++)	B64_code[i]=(i+'G');
	for(i=52;i<62;i++)	B64_code[i]=(i-4);
	B64_code[62]='+';
	B64_code[63]='/';

	size_t read_chars=32718;
	char in_line[32718];
	size_t bytes_read=0;
	int lines_per_round;
	char *source=in_line;
	char out_line[45900];
	char *dest=&out_line[0];
	int count, rounds;

	lines_per_round=read_chars/BYTES_PER_LINE_BASE64;
	rounds=BYTES_PER_LINE_BASE64/3;

	while(!feof(infile) && lines_per_round>0)
	{
		if(lines_per_round>lines_per_part)
		{		  read_chars=lines_per_part*BYTES_PER_LINE_BASE64;
				  lines_per_part=lines_per_round;	}
		bytes_read=fread(in_line,1,read_chars,infile);
		source=&in_line[0];
		i=bytes_read/BYTES_PER_LINE_BASE64;
		bytes_read-=i*BYTES_PER_LINE_BASE64;
		while(i-->0)
		{
			count=rounds;
			while(count-->0)
			{
				*dest++=B64_code[(*source & 252)>>2];
				*dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
				*dest++=B64_code[((*(source+1) & 15)<<2) | ((*(source+2) & 192)>>6)];
				*dest++=B64_code[*(source+2) & 63];
				source+=3;
			}
		}
		fwrite(&out_line[0],dest - &out_line[0],1,outfile);
		dest=&out_line[0];
		lines_per_part=lines_per_round;
	}
	if(bytes_read>0)
	{
		while(bytes_read>=3)
		{
			*dest++=B64_code[(*source & 252)>>2];
			*dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
			*dest++=B64_code[((*(source+1) & 15)<<2) | ((*(source+2) & 192)>>6)];
			*dest++=B64_code[*(source+2) & 63];
			source+=3;bytes_read-=3;
		}
		if(bytes_read==2)
		{
			*dest++=B64_code[(*source & 252)>>2];
			*dest++=B64_code[((*source & 3)<<4) | ((*(source+1) & 240)>>4)];
			*dest++=B64_code[(*(source+1) & 15)<<2];
			*dest++=FILLCHAR_B64;
		}
		if(bytes_read==1)
		{
			*dest++=B64_code[(*source & 252)>>2];
			*dest++=B64_code[(*source & 3)<<4];
			*dest++=FILLCHAR_B64;
			*dest++=FILLCHAR_B64;
		}
	}
	if(dest!=&out_line[0])
		fwrite(&out_line[0],dest - &out_line[0],1,outfile);
}



//Fonction pour récupérer le nom du fichier
char *seek_name(char chaine[150])
{
	int len=strlen(chaine), debut=1;
	for(int a=len;a>=1;a--)
		if( (debut==1) && (chaine[a]=='\\') )
			debut=a+1;
	char *nom_fichier=new char[len-debut+3];
	for(int z=debut,b=0;z<=len;z++, b++)
		nom_fichier[b]=chaine[z];
	return nom_fichier;
}

//Fonction qui examine l'extension et qui retourne le type de fichier en conséquence

char *verif_extens(char chaine[150])
{
	int len=strlen(chaine);
	char *type_fichier;
	
	for(int a=len;a>=0;a--)
	{
		if(chaine[a]=='.')
		{
			if( (chaine[a+1]=='e') && (chaine[a+2]=='x') && (chaine[a+3]=='e') )
			{	//application exe :
				type_fichier="application/octet-stream";
				return type_fichier; }
			if( (chaine[a+1]=='g') && (chaine[a+2]=='i') && (chaine[a+3]=='f') )
			{	//image gif :
				type_fichier="image/gif";
				return type_fichier; }
			if( (chaine[a+1]=='j') && (chaine[a+2]=='p') && (chaine[a+3]=='g') )
			{	//image jpeg :
				type_fichier="image/jpeg";
				return type_fichier; }
			if( (chaine[a+1]=='m') && (chaine[a+2]=='p') && (chaine[a+3]=='g') )
			{	//vidéo mpeg :
				type_fichier="video/mpeg";
				return type_fichier; }
			if( (chaine[a+1]=='p') && (chaine[a+2]=='c') && (chaine[a+3]=='m') )
			{	//son pcm :
				type_fichier="audio/basic";
				return type_fichier; }
			if( (chaine[a+1]=='b') && (chaine[a+2]=='m') && (chaine[a+3]=='p') )
			{	//son pcm :
				type_fichier="image/bmp";
				return type_fichier; }
			if( (chaine[a+1]=='t') && (chaine[a+2]=='x') && (chaine[a+3]=='t') )
			{	//son pcm :
				type_fichier="texte/txt";
				return type_fichier; }

		}

	}
	return "type_inconnu"; 
}



 Conclusion

Bon le fonctionnement est relativement simple : envoyer sert à envoyer le mail : jusque là ...
Annuler sert à déprogrammer un envoi ou à stopper l'envoi infini. Attention : annuler n'annule pas un envoi si il est déjà en cours !!!
Effacer efface sujet et corps du message.

L'option "faux envoyeur" sert à "faire croire" à qqun qu'il a recu le mail par erreur (en fait il ne verra pas son adresse ds "à:" mais l'adresse que vous aurez mis.
L'option heure réelle sert à programmer un envoi ( N'oubliez pas de mettre votre PC à l'heure)
L'option heure fausse est l'heure qui sera affichée dans le mail.(peut etre n'importe quoi par ex "salut" est une "heure" tout à fait acceptable)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 janvier 2006 12:18:48 :
Bon cette fois le ZIP doit apparaitre.
11 janvier 2006 01:22:17 :
Correction d'un bug qui faisait que le programme plantait lorsqu'un envoi plantait. A présent si un envoi plante, le programme le signale et continue comme avant.
04 février 2006 04:13:43 :
Rajout de l'option permettant d'envoyer un fichier joint (un seul pour l'instant)
11 février 2006 14:41:32 :
Modification sans incidence sur le déroulement du programme (personnel)

 Sources du même auteur

Source avec Zip GESTION FICHIERS TXT (INSERTION, CONCATÉNATION, DÉNOMBREMENT...
Source avec Zip OTHELLO AVEC IA

 Sources de la même categorie

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SOCKET CPP par baptchr55

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [WIN32][C][DEV-C++] ANOMAIL ENVOIE SMTP SIMPLE par omnia
Source avec Zip APPLICATION WIN32 SANS FENÊTRE ET AVEC BOUCLE DES MESSAGES par racpp
Source avec Zip Source avec une capture ENVOI/RÉCEPTION DE FICHIERS (CLIENT/SERVEUR) [DEV-C++] par victorcoasne
Source avec Zip Source avec une capture MINI-MAILER V1.4 par Mini92
Source avec Zip Source avec une capture [C] NET DIALOG - ENVOI DE MESSAGES SUR UN RÉSEAU PRIVÉ par julienbj

Commentaires et avis

Commentaire de ketchupy45 le 10/01/2006 11:37:33

Salut Il serait bien que tu mette le zip avec tes fichiers de codes.

Commentaire de KissyFroth le 10/01/2006 12:31:54

Voilà c'est corrigé. J'en profite pour apporter 2 petites précisions : j'ai fait cette source avec VC++ 6 et N'OUBLIEZ PAS D'INCLURE ws2_32.lib  dans PROJECT->SETTINGS->LINK->Objects/Library Modules
sinon la compilation ne marchera pas.

Commentaire de katsankat le 10/01/2006 16:33:22

Le rôle de WSAStartup() est de vérifier la version de la dll, se fait une seule fois au début du programme.
Aussi -toujours spécifique à win32- la fonction WSAcleanup libère la dll: msdn dit qu'on doit l' appeler pour libérer les ressources de l' application. msdn dit aussi qu'on doit appeler wsacleanup autant de fois qu'on a appelé wsastartup, ton bug pourrait venir de là -sans confirmation de ma part.
Tu peux placer les deux dans ton point d'entrée:

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE a, PSTR b, int v)
{
  if( int err = WSAStartup( 0x0202, &wsaData ) ) //et pas 0x0101 puisque ws2_32
  {
   MessageBox (NULL, TEXT ("dll winsock 2 non trouvée"), NULL, NULL);
   return 0;
  }
  DialogBoxParam(hinst, (LPCTSTR)PAGE, 0, AppDlgProc, 0);
  WSACleanup();
  return 0;
}

Commentaire de KissyFroth le 10/01/2006 17:10:02

Tu as certainement raison au niveau de la programmation et j'ai corrigé mon programme
comme tu me le conseillais. (en fait je ne connaissais pas le role de WSAStartup : maintenant
je saurais)
Cependant, comme il fallait s'y attendre le bug ne vient pas de là.
En fait le programme plante quand il se produit une erreur lors de l'envoi. Je soupconne que
ca vient de la fonction "recv" qui plante. J'ai deja essayé d'arreter la boucle d'envoi lorsqu'une
reponse indiquait une erreur mais ca n'a rien fait.Donc l'erreur se produit dans la fonction "Process".
Mais ou ?




Commentaire de KissyFroth le 11/01/2006 01:26:15

Au cas ou vous ne l'auriez pas remarqué voici une petite liste de serveurs smtp
que j'ai rajouté à la fin de mon prog

Les serveurs marqués de * sont testés et approuvés pour mon prog.

///////////////////////////////////////////
// Serveurs SMTP //

//   smtp.laposte.net
//   smtp.ifrance.com
//   smtp.mail.yahoo.fr
// * smtp.neuf.fr
// * smtp.cegetel.net
//   mail.club-internet.fr
//   smtp.wanadoo.fr

  

Commentaire de wxccxw le 08/02/2006 12:44:10

moi j'aprouve SMTP.WANADOO.FR 25

Commentaire de wxccxw le 11/02/2006 12:27:01

PS : Je n'est pas voter :) je met 9/10

Commentaire de ketchupy45 le 20/03/2006 18:34:51

Bonjour, est ce normal que lors de l'envoi de pieces jointes la taille de celle ci apparait a 0 Ko à la réception?
Est ce que l'envoi a plusieurs utilisateurs est géré?

Commentaire de Biroto le 15/04/2006 13:43:30

je n'ai pas eu le courage de lire tout ton code, je viens juste de me réveiller jai la tete ds le cul :p
mais j'ai vu que tu parlais du recv donc je suis allé voir
A mon avis la avec ce que ta mi tu ne sors jamais de la boucle while( !buf[0] )
essayes de remplacer
while( !buf[0] )
      int yeah = recv( to_server_socket, buf, 1024, 0 );

par

while( !buf[0] )
{
      int yeah = recv( to_server_socket, buf, 1024, 0 );
      buf[yeah]=0;
}

salut

Commentaire de Biroto le 15/04/2006 13:46:19

oula dsl comme je disais jai la tete ds le cul lol
jai dit nimporte quoi
mais essayes de mettre
while( !buf[0] )
      int yeah = recv( to_server_socket, buf, 1024, 0 );
buf[yeah]=0
enfin ma remarque nest surement pas tres pertinente vu que j'ai pas lu la suite du code

Commentaire de KissyFroth le 22/04/2006 16:39:15

Bon normalement la plupart des erreurs sont résolues, le programme ne gère pas l'envoi à plusieurs utilisateurs et je n'ai aucune idée du pourquoi, lors de certains envois, la taille des pièces jointes apparait à 0 octets. (mais bon tant que dans le contenu elles sont intactes c'est le principal non ?)

Commentaire de Darksheep le 31/08/2007 20:55:49

Belle source :)
juste un truc  katsankat :
si comme tu dit le role de WSAStartup est de vérifier la version de la dll,(Ce qui est vrai )
et qu'on doit l'appeller une seule fois au début du programme,
Alors appeller autant de fois WSACleanup() ne revient il pas à ne l'appeller qu'une fois à la fin ?
dans ce cas pourquoi spécifier qu'on doit appeller autant de fois WSACleanup que WSAStartup si on ne l'appelle qu'une fois ?C'est bête XD

Commentaire de katsankat le 31/08/2007 23:10:43

Ce n'est pas moi qui le dit mais msdn.

Pas si bête que ça d'ailleurs. Sans équivoque, c'est dit ici:
http://msdn2.microsoft.com/en-us/library/ms742213.aspx

"An application must call the WSACleanup function for every successful time the WSAStartup function is called. This means, for example, that if an application calls WSAStartup three times, it must call WSACleanup three times. The first two calls to WSACleanup do nothing except decrement an internal counter; the final WSACleanup call for the task does all necessary resource deallocation for the task."

Si on suit leur logique, il est possible qu'un prog utilise deux librairies faisant chacune appel aux sockets. Par exemple utilisant une lib pour gérer tout ce qui est UDP et l'autre pour TCP. Selon les brillantes explications de msdn si chaque lib appelle wsastartup elle doit aussi faire cleanup. CQFD. Et si en plus le prog en question fais son wsastartup, ça fait trois.

Relire ce bordel me rappelle à quel point je hais l'implémentation des socket sur win32. Elle est tout sauf conforme à la spécification établie et correctement implémentée sur plus de 20 systèmes d'exploitations sauf windoze.

Commentaire de Darksheep le 02/09/2007 11:37:16

oK je prend note :)
Thx for your answer

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

envoi de message sur differentes interface [ par hobbes ] pouvez vous m indiquer comment je peux envoyer un message avec les interfaces suivantes :UDPTCPSERIECAN smtp ;cdonts et asp =>mails dans badmail? [ par VB ] qui connais un site sur la config smtp de iis car moi j'ai des mails qui sont dans le répetoire badmail quand j'envoi un mail ...???sinon ce serais si Envoi d'un message à un otre Ordi (réseau) [ par cyberlewis ] Salut,Voilà, après avoir (presque) tout essayer avec les Sockets, je cherche de l'aide svp :Mon but est de faire deux logiciels identiques, un sur le Erreur 10004 lors de l'envoi d'un mail par smtp [ par devstudio ] Bonjour, J'ais fait un pogramme de d&#233;tection de mouvements a partir d'une webcam. Lorsqu'un intru est d&#233;tect&#233;, le programme m'envoi un Envoi de mails automatiques [ par KissyFroth ] Voil&#224; mon probleme : lorsque on envoie un mail en utilisant les serveurs SMTP on voit apparaitre "destinataire cach&#233;" &#224; la place du des Envoi de message UDP sans socket ???? [ par thealex321 ] Salut &#224; tous!Bon, ma question est vraiment parce que je ne comprends pas comment on peut envoy&#233; un message sans cr&#233;er un socket pour l' Envoi mail avec pièce jointe avec SMTP [ par franck09 ] Bonjour,Je voudrais savoir comment on attache une pièce jointe lorsque l'on envoie un mail à la main en utilisant le protocole SMTP. Je sais qu'il fau Problème de socket non bloquante [ par Rankin ] Bonjour !Je travaille actuellement sur la réalisation d'un chat très sommaire en C. La solution que j'ai adoptée consiste, côté serveur, à avoir un ta [SMTP] info [ par Nylsax ] Bonjour,Si j'installe  un serveur  smtp sur mon poste, 1. Cela veut-il dire que l'on peut envoyer un mail sans dépendre de son FAI ? 2. Cela veut-il Acces SMTP LocalHost Relai / Redirection [ par scrunchs ] Bonjour, J'utilise une application "A" qui dirige les mails que l'on rédige vers un SMTP unique que je peux choisir au départ. J'utilise une applicat


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,716 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales