begin process at 2013 06 20 04:30:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > CLIENT MAIL (POP3 ET SMTP)

CLIENT MAIL (POP3 ET SMTP)


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Application Niveau :Débutant Date de création :10/05/2004 Vu / téléchargé :12 903 / 1 147

Auteur : SamuelBruno

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

 Description

Cliquez pour voir la capture en taille normale
Ceci est un petit client pour gérer les mail qui se connecte à un serveur pop3 pour la réception et à un serveur SMTP pour l'envoi (j'ai pris la source du SMTP su cppFrance à : http://www.cppfrance.com/code.aspx?ID=9863)

pou r le faire marcher il suffit de compiler les deux programmes avec la librairie wsock32.lib d'ajouter au settings du projet et de mettre les .exe résultants dans le même dossier.

Source

  • /*
  • Fichier : Application.cpp
  • Source : http: www.cppfrance.com/code.aspx?ID=9863
  • date dernière modification : 26 avril 2004
  • Réaliser dans lecadre d'un cours de correction de programme
  • */
  • #include <winsock.h>
  • #include <string.h>
  • #include "modificationFichier.h"
  • #include <iostream>
  • #include <iomanip>
  • #include <cstdlib>
  • #include <cstring>
  • #include <fstream>
  • #include <shellapi.h>
  • #include "POP.h"
  • int main()
  • {
  • POP appPOP;
  • bool continuer;//pour arreter le programme
  • bool mauvaiseReponse;//pour verifier la reponse entree
  • int choix;//pour le choix de l'option dans le menu principal
  • int nbMessage=0;//pour le nombre de message consulter
  • continuer = true;
  • while(continuer)//tant que l'utilisateur ne quitte pas
  • {
  • mauvaiseReponse = true;
  • while(mauvaiseReponse)//tant que la reponse n'est pas valide (de 0 à 4)
  • {//menu principal
  • cout<<" GESTION DE COURRIELS"<<endl;
  • cout<<" Systeme de gestion de courriels (v.?)"<<endl;
  • cout<<" ------------------------------------------"<<endl;
  • cout<<" |1.Envoyer des courriels |"<<endl;
  • cout<<" |2.Recevoir des courriels |"<<endl;
  • cout<<" |0.Quitter le programme |"<<endl;
  • cout<<" ------------------------------------------"<<endl<<"Reponse :";
  • cin>>choix;//lecture du chois de l'option du menu principal
  • while(cin.get()!='\n');
  • cout<<endl;
  • if(choix != 0 && choix != 1 && choix != 2 && choix)
  • {//validation de la reponse
  • cout<<"Mauvaise entree, veuillez repondre par 1,2 ou 0."<<endl<<endl;
  • }
  • else
  • mauvaiseReponse = false;//bonne reponse donc passe au switch
  • }
  • switch(choix)//switch vers les fonctions du main
  • {
  • case 1:
  • {
  • ShellExecute(NULL, NULL, "rick.exe" , NULL, NULL, SW_SHOWNORMAL);
  • break;
  • }
  • case 2 :
  • {
  • appPOP.ouvrirPOP();
  • break;
  • }
  • case 0 :
  • {
  • continuer = false;
  • break;
  • }
  • }
  • }
  • return 0;
  • }
  • /*
  • nom du fichier : pop.h
  • fait par :Samuel Tremblay
  • date :15 déc. 2003
  • but: Application de Gestion de courriel
  • cadre : Cours Structure de donnees
  • */
  • /*Exemple de message qu'envoie le serveur
  • Received: (from sys113@localhost)
  • by sinf-unix.qc.ca (8.9.1b+Sun/8.9.1) id LAA07771
  • for sys113; Fri, 19 Dec 2003 11:30:04 -0500 (EST)
  • Date: Fri, 19 Dec 2003 11:30:04 -0500 (EST)
  • From: sys113
  • Message-Id: <200312191630.LAA07771@sinf-unix.qc.ca>
  • Content-Type: text
  • X-UIDL: C_T!!?,<!!^;W"!~9f"!
  • Status: RO
  • c po ma faute je lai manger
  • .
  • */
  • #ifndef POP_H
  • #define POP_H
  • #include <iostream>
  • #include <iomanip>
  • #include "Message.h"
  • #include "clientPop.h"
  • class POP
  • {
  • public:
  • aplication();
  • ouvrirPOP();
  • private :
  • };
  • POP::aplication()
  • {
  • }
  • int POP::ouvrirPOP()
  • {
  • ClientPop unClientPop;
  • bool continuer;//pour arreter le programme
  • bool mauvaiseReponse;//pour verifier la reponse entree
  • int choix;//pour le choix de l'option dans le menu principal
  • int nbMessage=0;//pour le nombre de message consulter
  • continuer = true;
  • while(continuer)//tant que l'utilisateur ne quitte pas
  • {
  • mauvaiseReponse = true;
  • while(mauvaiseReponse)//tant que la reponse n'est pas valide (de 0 à 4)
  • {//menu principal
  • cout<<endl<<endl<<" RECEPTION DE COURRIEL"<<endl;
  • cout<<" ------------------------------------------"<<endl;
  • cout<<" |1.Connection au serveur(authentification) |"<<endl;
  • cout<<" |2.Lister et lire les messages disponibles |"<<endl;
  • cout<<" |3.Supprimer un message |"<<endl;
  • cout<<" |4.Annuler la (les) suppressions |"<<endl;
  • cout<<" |0.Deconnexion et retour au menu principal |"<<endl;
  • cout<<" ------------------------------------------"<<endl<<"Reponse :";
  • cin>>choix;//lecture du chois de l'option du menu principal
  • while(cin.get()!='\n');
  • cout<<endl;
  • if(choix != 0 && choix != 1 && choix != 2 && choix != 3 && choix != 4 && choix != 5)
  • {//validation de la reponse
  • cout<<"Mauvaise entree, veuillez repondre par 1,2,3,4,5 ou 0."<<endl<<endl;
  • }
  • else
  • mauvaiseReponse = false;//bonne reponse donc passe au switch
  • }
  • switch(choix)//switch vers les fonctions du main
  • {
  • case 1:
  • {
  • char user[30];//pour lire le username
  • char pass[30];//pour saisir le password
  • char tampon[30];//pour faire les concaténations commandes/saisie
  • if(unClientPop.connection())//si le serveur est accessible
  • {//lecture et envoie du username
  • cout<<"Entrez votre nom d'utilisateur :"<<endl;
  • cin.get(tampon,30);
  • while(cin.get()!='\n');
  • strcpy(user,"user ");
  • strcat(user, tampon);//concaténation commande/saisie
  • unClientPop.dialogueEnvoie(user);//envoie de la commande
  • unClientPop.dialogueReponse();//ecoute de la réponse du serveur
  • //lecture et envoie du password
  • cout<<"Entrez votre mot de passe :"<<endl;
  • cin.get(tampon,30);
  • while(cin.get()!='\n');
  • strcpy(pass,"pass ");
  • strcat(pass, tampon);//concaténation commande/saisie
  • unClientPop.dialogueEnvoie(pass);//envoie de la commande
  • unClientPop.dialogueReponse();//ecoute de la réponse du serveur
  • }
  • else
  • {//si le serveur n'est pas accessible
  • cout<<"Connection au serveur impossible";
  • }
  • break;
  • }
  • case 2:
  • {
  • char lire[30];//pour la commande
  • char tampon[30];//pour la concaténation
  • cout<<"Quel message désirez-vous lire? :"<<endl;
  • unClientPop.dialogueEnvoie("list");//envoie de la commande "list"
  • unClientPop.dialogueReponse();//premiere écoute pour le +OK
  • cout<<unClientPop.dialogueReponse();//deuxième écoute pour la liste des messages
  • cout<<"# Message : ";
  • cin.get(tampon,30);//saisie du # à lire
  • while(cin.get()!='\n');
  • strcpy(lire,"retr ");
  • strcat(lire, tampon);//concaténation commande/saisie
  • unClientPop.dialogueEnvoie(lire);//envoie la commande qui retourne un message
  • unClientPop.dialogueReponse();//ecoute pour le +OK
  • Message unMessage(unClientPop.dialogueReponse());//ecoute pour le message et création d'un message avec la réponse
  • cout<<unMessage;//affiche le message demandé
  • nbMessage++;
  • break;
  • }
  • case 3:
  • {
  • char supprime[30];//pour la saisi du # à supprimer
  • char tampon[30];
  • cout<<"Quel message désirez-vous supprimer? :"<<endl;
  • unClientPop.dialogueEnvoie("list");//liste des message
  • unClientPop.dialogueReponse();
  • cout<<unClientPop.dialogueReponse();//affiche la liste
  • cout<<"# Message : ";
  • cin.get(tampon,30);//saisi du # à supprimer
  • while(cin.get()!='\n');
  • strcpy(supprime,"dele ");
  • strcat(supprime, tampon);//concaténation commande/saisie
  • unClientPop.dialogueEnvoie(supprime);//envoie de la commande
  • cout<<unClientPop.dialogueReponse();//confirmation du serveur
  • break;
  • }
  • case 4:
  • {
  • unClientPop.dialogueEnvoie("Rset");//envoie la commande "rset" qui annule toute les suppression faite durant cette session de transaction
  • cout<<unClientPop.dialogueReponse();//confirmation du serveur
  • break;
  • }
  • case 0:
  • {//Fin
  • unClientPop.fermeConnection();
  • continuer = false;
  • break;
  • }
  • }
  • }
  • return 0;
  • }
  • #endif
  • /*
  • nom du fichier : clientPop.h
  • fait par :Samuel Tremblay
  • date :15 déc. 2003
  • but: Application de Gestion de courriel
  • cadre : Cours Environnement Réseau
  • */
  • #ifndef CLIENTPOP_H
  • #define CLIENTPOP_H
  • //#include <stdio>
  • //#include <stdlib>
  • #include <iostream>
  • #include <winsock.h>
  • using namespace std;
  • #define MAX 1024//constante pour le nombre de charactère maximum du buffer
  • #define bzero(ptr,n) memset(ptr,0,n)
  • class ClientPop
  • {
  • public:
  • ClientPop();
  • bool connection();
  • void dialogueEnvoie(char *);
  • char * dialogueReponse();
  • void fermeConnection();
  • private :
  • char buffer[MAX];
  • int erreur;
  • int lg;
  • SOCKET sock;
  • SOCKADDR_IN sin;
  • };
  • ClientPop::ClientPop()
  • {//constructeur
  • WSADATA WSAData;
  • WSAStartup(MAKEWORD(2,0),&WSAData);
  • sin.sin_addr.s_addr = inet_addr("205.237.86.17");//ajuste l'adresse du serveur
  • sock = socket(AF_INET,SOCK_STREAM,0);//cration du socket
  • //pour vérifier la création du socket
  • if(sock==INVALID_SOCKET) {
  • perror("erreur de creation de la socket");
  • exit(-1);
  • }
  • sin.sin_family = AF_INET;
  • sin.sin_port = htons(110);//ajuste le port (110 = pop3)
  • }
  • //Bloc de connection
  • bool ClientPop::connection()
  • {
  • erreur = connect(sock,(SOCKADDR *)&sin,sizeof(sin));//connection au serveur 205.237.86.17 sur le port 110
  • bzero(buffer,sizeof(buffer));//initialisation du "buffer"(chaîne de caractères)
  • lg = recv(sock,buffer,MAX,0);//reponse du serveur suite à la connection
  • buffer[lg] = '\n';
  • cout << buffer << endl;//affichage de la reponse
  • //vérifie la connection
  • if(erreur==INVALID_SOCKET)
  • {
  • perror("erreur de connexion");
  • exit(-1);
  • return false;
  • }
  • else
  • return true;
  • }
  • void ClientPop::dialogueEnvoie(char * uneCommande)
  • {//méthode qui envoie une commande en paramètre au serveur
  • strcpy(buffer,uneCommande);//copie de la commande dans le buffer
  • strcat(buffer,"\n");//ajout d'un suat de ligne qui indique clairement la fin de la commande
  • send(sock,buffer,strlen(buffer),0);//envoie de la commande
  • }
  • char * ClientPop::dialogueReponse()
  • {//ecoute la reponse du serveur
  • lg=recv(sock,buffer,MAX,0);//recoit la reponse et la met dans buffer
  • buffer[lg]='\0';
  • return buffer;
  • }
  • void ClientPop::fermeConnection()
  • {
  • closesocket(sock);//ferme le socket
  • WSACleanup();
  • }
  • #endif
  • /*
  • nom du fichier : message.h
  • fait par :Samuel Tremblay
  • date :28 nov. 2003
  • but: Instancie des objets de type Ville
  • cadre : Cours Structure de donnees
  • */
  • #include <iostream>
  • #include <string>
  • #ifndef MESSAGE_H
  • #define MESSAGE_H
  • class Message
  • {
  • public:
  • friend ostream &operator << (ostream &sortie, const Message &unMessage)
  • {//surcharge de l'opérateur << pour l'affichage d'un Message
  • sortie<<"\nDate : "<<unMessage.date<<endl<<"De : "<<unMessage.from<<endl<<"Contenu : \n"<<unMessage.message<<"\nMontant à facturer pour ce message : "<<(unMessage.nbChar*0.01)<<"$"<<endl;
  • return sortie;
  • }
  • Message();
  • Message(char *);
  • void setDate(char *);
  • void setFrom(char *);
  • void setMessage(char *);
  • void setIdUnique(char *,char*);
  • char * getDate();
  • char * getFrom();
  • char * getMessage();
  • int getNbChar();
  • retirerFrom(char *);
  • retirerDate(char *);
  • retirerMessage(char *);
  • bool operator<(const Message &) const;
  • bool operator>(const Message &) const;
  • bool operator==(const Message &) const;
  • void operator=( Message &);
  • private :
  • int nbChar;
  • char from[30];
  • char date[30];
  • char idUnique[50];
  • char message[1024];
  • };
  • Message::Message()
  • {
  • }
  • Message::Message(char * unMessage)
  • {//constructeur
  • retirerDate(unMessage);//retire la date de l'en-tête
  • retirerFrom(unMessage);//retire l'origine de l'en-tête
  • retirerMessage(unMessage);//retire le Message (jusqu'au premier '.') de l'en-tête
  • setIdUnique(date,from);//forme l'IdUnique du message avec la date et l'origine
  • nbChar = strlen(message);//longueur du message sans l'en-tête
  • }
  • //accesseurs
  • void Message::setDate(char * laDate)
  • {
  • strcpy(date,laDate);
  • }
  • char * Message::getDate()
  • {
  • return date;
  • }
  • void Message::setFrom(char * leFrom)
  • {
  • strcpy(from,leFrom);
  • }
  • char * Message::getFrom()
  • {
  • return from;
  • }
  • void Message::setMessage(char * unMessage)
  • {
  • strcpy(message,unMessage);
  • }
  • char * Message::getMessage()
  • {
  • return message;
  • }
  • void Message::setIdUnique(char * laDate,char* leFrom)
  • {
  • strcpy(idUnique, laDate);
  • strcat(idUnique, leFrom);
  • }
  • int Message::getNbChar()
  • {
  • return nbChar;
  • }
  • Message::retirerFrom(char *reponse)
  • {//retire l'origine de l'en-tête
  • char toto[1024],leFrom[1024],leNom[30];
  • int k,i;
  • sscanf(reponse,"%s",toto);
  • do//compare chaque mot du message à "From:"
  • {
  • k=0;
  • i=strlen(toto)+1;
  • while(reponse[k]=reponse[k+++i]);
  • sscanf(reponse,"%s",toto);
  • }while(strcmp(toto,"From:"));
  • sscanf(reponse,"%s %s",toto,leNom);//retire le nom
  • sprintf(leFrom,"%s",leNom);
  • setFrom(leFrom);//ajuste l'origine du message
  • }
  • Message::retirerDate(char * reponse)
  • {//retire la date de l'en-tête
  • char toto[1024],laDate[1024],JourC[20],Jour[20],Mois[20],Annee[20],Heure[20];
  • int k,i;
  • sscanf(reponse,"%s",toto);
  • do//compare chaque mot à "Date:"
  • {
  • k=0;
  • i=strlen(toto)+1;
  • while(reponse[k]=reponse[k+++i]);
  • sscanf(reponse,"%s",toto);
  • }while(strcmp(toto,"Date:"));
  • sscanf(reponse,"%s %s %s %s %s %s",toto,JourC,Jour,Mois,Annee,Heure);//retire la date
  • //série de if/else pour mettre le numero du mois à la place des trois première lettres
  • if(strcmp(Mois,"Jan")==0)
  • strcpy(Mois,"01");
  • else
  • if(strcmp(Mois,"Feb")==0)
  • strcpy(Mois,"02");
  • else
  • if(strcmp(Mois,"Mar")==0)
  • strcpy(Mois,"03");
  • else
  • if(strcmp(Mois,"Apr")==0)
  • strcpy(Mois,"04");
  • else
  • if(strcmp(Mois,"May")==0)
  • strcpy(Mois,"05");
  • else
  • if(strcmp(Mois,"Jun")==0)
  • strcpy(Mois,"06");
  • else
  • if(strcmp(Mois,"Jul")==0)
  • strcpy(Mois,"07");
  • else
  • if(strcmp(Mois,"Aug")==0)
  • strcpy(Mois,"08");
  • else
  • if(strcmp(Mois,"Sep")==0)
  • strcpy(Mois,"09");
  • else
  • if(strcmp(Mois,"Oct")==0)
  • strcpy(Mois,"10");
  • else
  • if(strcmp(Mois,"Nov")==0)
  • strcpy(Mois,"11");
  • else
  • if(strcmp(Mois,"Dec")==0)
  • strcpy(Mois,"12");
  • sprintf(laDate,"%s %s %s %s",Annee,Mois,Jour,Heure);//retire la date
  • setDate(laDate);
  • }
  • Message::retirerMessage(char * reponse)
  • {//retire le message du mail
  • char toto[1024],leMessage[1024],tampon[30],limite[30];
  • int k,i;
  • strcpy(leMessage,"");
  • strcpy(limite,"RO");//dernier mot de l'en-tête avant le corps du message
  • sscanf(reponse,"%s",toto);
  • do
  • {
  • do//compare chaque mot à la limite
  • {
  • k=0;
  • i=strlen(toto)+1;
  • while(reponse[k]=reponse[k+++i]);
  • sscanf(reponse,"%s",toto);
  • }while(strcmp(toto,limite));
  • sscanf(reponse,"%s%s",toto,limite);//retire le mot suivant la limite
  • sprintf(tampon,"%s",limite);
  • strcpy(limite,tampon);//change la limite pour le mot qui vient d'être lu
  • strcat(leMessage,tampon);//ajoute le nouveau mot au corps du message retirer
  • strcat(leMessage," ");//fait un espace entre les mots retirer
  • }while(strcmp(tampon,"."));// le "." est l'indicateur de fin de message
  • setMessage(leMessage);//ajuste le corps du message
  • }
  • bool Message::operator<(const Message &unMessage) const
  • {//surcharge de l'operateur < pour comparer les IdUniques de deux messages
  • return idUnique<unMessage.idUnique;
  • }
  • bool Message::operator>(const Message &unMessage) const
  • {//surcharge de l'operateur > pour comparer les IdUniques de deux messages
  • return idUnique>unMessage.idUnique;
  • }
  • bool Message::operator==(const Message &unMessage) const
  • {//surcharge de l'operateur == pour comparer les IdUniques de deux messages
  • return idUnique==unMessage.idUnique;
  • }
  • void Message::operator=(Message &unMessage)
  • {//surcharge de l'operateur = pour ajuster l'IdUnique d'un message
  • strcpy(idUnique , unMessage.idUnique);
  • }
  • #endif
  • /****************************************************************
  • * Nom du programme : modificationFichier *
  • * Nom du fichier: modificationFichier.h *
  • * Fait par: Bruno Michel *
  • * Date: 10 decembre 2003 *
  • * But: faire une classe pour modifier un ficher *
  • *****************************************************************/
  • #ifndef MODIFICATIONFICHIER_H
  • #define MODIFICATIONFICHIER_H
  • #include <iostream>
  • #include <iomanip>
  • #include <cstdlib>
  • #include <cstring>
  • #include <fstream>
  • using namespace std;
  • class ModificationFichier
  • {
  • public:
  • ModificationFichier(); // Constructeur.
  • ~ModificationFichier(); // Destructeur.
  • int D_Lire(int); //méthode pour lire le fichier
  • void D_Ecrire(int, int); //méthode pour ecrire le fichier
  • void D_Init(); //méthode pour initialiser le fichier
  • private:
  • fstream fichier;
  • struct typeEnregistrement
  • {
  • int numero;
  • };
  • };
  • #endif;
  • //initialer fig 11. ecrire fig.12
  • ModificationFichier::ModificationFichier() // Constructeur.
  • {
  • }
  • ModificationFichier::~ModificationFichier() // Destructeur.
  • {
  • }
  • int ModificationFichier::D_Lire(int num)//méthode pour lire le fichier
  • {
  • ifstream fichier("leFichier.dat");
  • typeEnregistrement enrg;
  • if(!fichier){
  • cerr<<"Echec - Le fichier n'est pas disponible"<<endl;
  • exit(1);
  • }
  • fichier.seekg(( num-1) * sizeof(typeEnregistrement), ios::beg ) ;
  • fichier.read((char *)&enrg,sizeof(typeEnregistrement)); //lecture
  • fichier.close();
  • cout<<num<<enrg.numero;
  • return enrg.numero;
  • }
  • //méthode pour ecrire sur le fichier
  • void ModificationFichier::D_Ecrire(int num, int leNumeroAEcrire)
  • {
  • fstream fichier("leFichier.dat", ios::in|ios::out|ios::binary);
  • typeEnregistrement enrg;
  • enrg.numero = leNumeroAEcrire;
  • fichier.seekp( (num-1) * sizeof(typeEnregistrement), ios::beg ) ;
  • fichier.write((char *)&enrg, sizeof(typeEnregistrement)); //ecriture
  • fichier.close();
  • }
  • //méthode pour initialiser le fichier
  • void ModificationFichier::D_Init()
  • {
  • fstream fichier("leFichier.dat", ios::in|ios::out|ios::binary);
  • typeEnregistrement enrg;
  • enrg.numero = 0;
  • for ( int i = 0; i < 100; i++ )
  • { //ecriture ou initialisation
  • fichier.write((char *)&enrg, sizeof(typeEnregistrement));
  • }
  • fichier.close();
  • }
/*
Fichier : Application.cpp
Source : http: www.cppfrance.com/code.aspx?ID=9863
date dernière modification : 26 avril 2004
Réaliser dans lecadre d'un cours de correction de programme
*/

#include <winsock.h>
#include <string.h>
#include "modificationFichier.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <shellapi.h>
#include "POP.h"

int main()
{
		POP appPOP;

		bool continuer;//pour arreter le programme
		bool mauvaiseReponse;//pour verifier la reponse entree
		int choix;//pour le choix de l'option dans le menu principal
		int nbMessage=0;//pour le nombre de message consulter

		continuer = true;
		while(continuer)//tant que l'utilisateur ne quitte pas
		{
			mauvaiseReponse = true;
			while(mauvaiseReponse)//tant que la reponse n'est pas valide (de 0 à 4)
			{//menu principal
				cout<<"                               GESTION DE COURRIELS"<<endl;
				cout<<"                      Systeme de gestion de courriels (v.?)"<<endl;
				cout<<"                     ------------------------------------------"<<endl;
				cout<<"                    |1.Envoyer des courriels                   |"<<endl;
				cout<<"                    |2.Recevoir des courriels                  |"<<endl;
				cout<<"                    |0.Quitter le programme                    |"<<endl;
				cout<<"                     ------------------------------------------"<<endl<<"Reponse :";

				cin>>choix;//lecture du chois de l'option du menu principal
				while(cin.get()!='\n');
				cout<<endl;

				if(choix != 0 && choix != 1 && choix != 2 && choix)
				{//validation de la reponse
					cout<<"Mauvaise entree, veuillez repondre par 1,2 ou 0."<<endl<<endl;
				}
				else
					mauvaiseReponse = false;//bonne reponse donc passe au switch
			}

			switch(choix)//switch vers les fonctions du main
			{
				case 1:
				{
					ShellExecute(NULL, NULL, "rick.exe" , NULL, NULL, SW_SHOWNORMAL);
					break;	
				}

				case 2 :
				{
					appPOP.ouvrirPOP();
					break;
				}

				case 0 :
				{
					continuer = false;
					break;
				}

			}
		}
	return 0;
}

/*
nom du fichier : pop.h
fait par :Samuel Tremblay
date :15 déc. 2003
but: Application de Gestion de courriel
cadre : Cours Structure de donnees
*/

/*Exemple de message qu'envoie le serveur

Received: (from sys113@localhost)
        by sinf-unix.qc.ca (8.9.1b+Sun/8.9.1) id LAA07771
        for sys113; Fri, 19 Dec 2003 11:30:04 -0500 (EST)
Date: Fri, 19 Dec 2003 11:30:04 -0500 (EST)
From: sys113
Message-Id: <200312191630.LAA07771@sinf-unix.qc.ca>
Content-Type: text
X-UIDL: C_T!!?,<!!^;W"!~9f"!
Status: RO

c po ma faute je lai manger


.

*/


#ifndef POP_H
#define POP_H

#include <iostream>
#include <iomanip>
#include "Message.h"
#include "clientPop.h"

class POP
{

	public:
		aplication();
		ouvrirPOP();
	private :
};
	POP::aplication()
	{
		
	}

	int POP::ouvrirPOP()
	{
		ClientPop unClientPop;

		bool continuer;//pour arreter le programme
		bool mauvaiseReponse;//pour verifier la reponse entree
		int choix;//pour le choix de l'option dans le menu principal
		int nbMessage=0;//pour le nombre de message consulter

		continuer = true;
		while(continuer)//tant que l'utilisateur ne quitte pas
		{
			mauvaiseReponse = true;
			while(mauvaiseReponse)//tant que la reponse n'est pas valide (de 0 à 4)
			{//menu principal
				cout<<endl<<endl<<"                               RECEPTION DE COURRIEL"<<endl;
				cout<<"                     ------------------------------------------"<<endl;
				cout<<"                    |1.Connection au serveur(authentification) |"<<endl;
				cout<<"                    |2.Lister et lire les messages disponibles |"<<endl;
				cout<<"                    |3.Supprimer un message                    |"<<endl;
				cout<<"                    |4.Annuler la (les) suppressions           |"<<endl;
				cout<<"                    |0.Deconnexion et retour au menu principal |"<<endl;
				cout<<"                     ------------------------------------------"<<endl<<"Reponse :";

				cin>>choix;//lecture du chois de l'option du menu principal
				while(cin.get()!='\n');
				cout<<endl;

				if(choix != 0 && choix != 1 && choix != 2 && choix != 3 && choix != 4 && choix != 5)
				{//validation de la reponse
					cout<<"Mauvaise entree, veuillez repondre par 1,2,3,4,5 ou 0."<<endl<<endl;
				}
				else
					mauvaiseReponse = false;//bonne reponse donc passe au switch

			}

			switch(choix)//switch vers les fonctions du main
			{
				case 1:
				{
					char user[30];//pour lire le username
					char pass[30];//pour saisir le password
					char tampon[30];//pour faire les concaténations commandes/saisie

					if(unClientPop.connection())//si le serveur est accessible
					{//lecture et envoie du username
						cout<<"Entrez votre nom d'utilisateur :"<<endl;
						cin.get(tampon,30);
						while(cin.get()!='\n');
						strcpy(user,"user ");
						strcat(user, tampon);//concaténation commande/saisie
						
						unClientPop.dialogueEnvoie(user);//envoie de la commande
						unClientPop.dialogueReponse();//ecoute de la réponse du serveur

						//lecture et envoie du password
						cout<<"Entrez votre mot de passe :"<<endl;
						cin.get(tampon,30);
						while(cin.get()!='\n');
						strcpy(pass,"pass ");
						strcat(pass, tampon);//concaténation commande/saisie
						
						unClientPop.dialogueEnvoie(pass);//envoie de la commande
						unClientPop.dialogueReponse();//ecoute de la réponse du serveur
					}
					else
					{//si le serveur n'est pas accessible
						cout<<"Connection au serveur impossible";
					}

					break;	
				}
				case 2:
				{
					char lire[30];//pour la commande
					char tampon[30];//pour la concaténation
					

					cout<<"Quel message désirez-vous lire? :"<<endl;
					unClientPop.dialogueEnvoie("list");//envoie de la commande "list"
					unClientPop.dialogueReponse();//premiere écoute pour le +OK
					cout<<unClientPop.dialogueReponse();//deuxième écoute pour la liste des messages
					cout<<"# Message : ";
					cin.get(tampon,30);//saisie du # à lire
					while(cin.get()!='\n');
					strcpy(lire,"retr ");
					strcat(lire, tampon);//concaténation commande/saisie
					
					unClientPop.dialogueEnvoie(lire);//envoie la commande qui retourne un message
					unClientPop.dialogueReponse();//ecoute pour le +OK
					Message unMessage(unClientPop.dialogueReponse());//ecoute pour le message et création d'un message avec la réponse
					cout<<unMessage;//affiche le message demandé
					nbMessage++;
					break;
				}
				case 3:
				{
					char supprime[30];//pour la saisi du # à supprimer
					char tampon[30];

					cout<<"Quel message désirez-vous supprimer? :"<<endl;
					unClientPop.dialogueEnvoie("list");//liste des message
					unClientPop.dialogueReponse();
					cout<<unClientPop.dialogueReponse();//affiche la liste
					cout<<"# Message : ";
					cin.get(tampon,30);//saisi du # à supprimer
					while(cin.get()!='\n');
					strcpy(supprime,"dele ");
					strcat(supprime, tampon);//concaténation commande/saisie

					unClientPop.dialogueEnvoie(supprime);//envoie de la commande
					cout<<unClientPop.dialogueReponse();//confirmation du serveur
				
					break;	
				}
				case 4:
				{
					unClientPop.dialogueEnvoie("Rset");//envoie la commande "rset" qui annule toute les suppression faite durant cette session de transaction
					cout<<unClientPop.dialogueReponse();//confirmation du serveur
					break;	
				}


				case 0:
				{//Fin  
					unClientPop.fermeConnection();
					continuer = false;
					break;	
				}
			}
		}
		return 0;
	}

#endif


/*
nom du fichier : clientPop.h
fait par :Samuel Tremblay
date :15 déc. 2003
but: Application de Gestion de courriel
cadre : Cours Environnement Réseau
*/

#ifndef CLIENTPOP_H
#define CLIENTPOP_H

//#include <stdio>
//#include <stdlib>
#include <iostream>
#include <winsock.h>
using namespace std;
#define MAX 1024//constante pour le nombre de charactère maximum du buffer
#define bzero(ptr,n) memset(ptr,0,n)

class ClientPop	
{
	public:
		ClientPop();
		bool connection();
		void dialogueEnvoie(char *);
		char * dialogueReponse();
		void fermeConnection();

	private :
		char buffer[MAX];
		int erreur;
		int lg;
		SOCKET sock;
		SOCKADDR_IN sin;
};

ClientPop::ClientPop()
{//constructeur
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0),&WSAData);

	sin.sin_addr.s_addr = inet_addr("205.237.86.17");//ajuste l'adresse du serveur
	sock = socket(AF_INET,SOCK_STREAM,0);//cration du socket

	//pour vérifier la création du socket
    if(sock==INVALID_SOCKET)	{
		perror("erreur de creation de la socket");
		exit(-1);
	}

	sin.sin_family      = AF_INET;
	sin.sin_port        = htons(110);//ajuste le port (110 = pop3)
}

//Bloc de connection
bool ClientPop::connection()
{
	erreur = connect(sock,(SOCKADDR *)&sin,sizeof(sin));//connection au serveur 205.237.86.17 sur le port 110

	bzero(buffer,sizeof(buffer));//initialisation du "buffer"(chaîne de caractères)
	lg = recv(sock,buffer,MAX,0);//reponse du serveur suite à la connection
	buffer[lg] = '\n';
	cout << buffer << endl;//affichage de la reponse

	//vérifie la connection
	if(erreur==INVALID_SOCKET)
	{
		perror("erreur de connexion");
		exit(-1);
		return false;
	}
	else
		return true;
}

void ClientPop::dialogueEnvoie(char * uneCommande)
{//méthode qui envoie une commande en paramètre au serveur
	strcpy(buffer,uneCommande);//copie de la commande dans le buffer
	strcat(buffer,"\n");//ajout d'un suat de ligne qui indique clairement la fin de la commande
	send(sock,buffer,strlen(buffer),0);//envoie de la commande
}

char * ClientPop::dialogueReponse()
{//ecoute la reponse du serveur
	lg=recv(sock,buffer,MAX,0);//recoit la reponse et la met dans buffer
	buffer[lg]='\0';
	return buffer;
}

void ClientPop::fermeConnection()
{
	closesocket(sock);//ferme le socket
	WSACleanup();
}

#endif

/*
nom du fichier : message.h
fait par :Samuel Tremblay
date :28 nov. 2003
but: Instancie des objets de type Ville
cadre : Cours Structure de donnees
*/
#include <iostream>
#include <string>

#ifndef MESSAGE_H
#define MESSAGE_H

class Message
{
	public:
		friend ostream &operator << (ostream &sortie, const Message &unMessage)
		{//surcharge de l'opérateur << pour l'affichage d'un Message
			sortie<<"\nDate : "<<unMessage.date<<endl<<"De : "<<unMessage.from<<endl<<"Contenu : \n"<<unMessage.message<<"\nMontant à facturer pour ce message : "<<(unMessage.nbChar*0.01)<<"$"<<endl;
			return sortie;
		}

		Message();
		Message(char *);

		void setDate(char *);
		void setFrom(char *);
		void setMessage(char *);
		void setIdUnique(char *,char*);

		char * getDate();
		char * getFrom();
		char * getMessage();
		int getNbChar();

		retirerFrom(char *);
		retirerDate(char *);
		retirerMessage(char *);

		bool operator<(const Message &) const;
		bool operator>(const Message &) const;
		bool operator==(const Message &) const;
		void operator=( Message &);



	private :
		int nbChar;
		char from[30];
		char date[30];
		char idUnique[50];
		char message[1024];
};

Message::Message()
{

}

Message::Message(char * unMessage)
{//constructeur
	retirerDate(unMessage);//retire la date de l'en-tête
	retirerFrom(unMessage);//retire l'origine de l'en-tête
	retirerMessage(unMessage);//retire le Message (jusqu'au premier '.') de l'en-tête
	setIdUnique(date,from);//forme l'IdUnique du message avec la date et l'origine
	nbChar = strlen(message);//longueur du message sans l'en-tête
}
//accesseurs
void Message::setDate(char * laDate)
{
	strcpy(date,laDate);
}

char * Message::getDate()
{
	return date;
}

void Message::setFrom(char * leFrom)
{
	strcpy(from,leFrom);
}

char * Message::getFrom()
{
	return from;
}

void Message::setMessage(char * unMessage)
{
	strcpy(message,unMessage);
}

char * Message::getMessage()
{
	return message;
}

void Message::setIdUnique(char * laDate,char* leFrom)
{
	strcpy(idUnique, laDate);
	strcat(idUnique, leFrom);
}

int Message::getNbChar()
{
	return nbChar;
}


Message::retirerFrom(char *reponse)
{//retire l'origine de l'en-tête
	char toto[1024],leFrom[1024],leNom[30];
	int k,i;
	sscanf(reponse,"%s",toto);
	do//compare chaque mot du message à "From:"
	{
		k=0;
		i=strlen(toto)+1;
		while(reponse[k]=reponse[k+++i]);

		sscanf(reponse,"%s",toto);
	}while(strcmp(toto,"From:"));

	sscanf(reponse,"%s %s",toto,leNom);//retire le nom
	sprintf(leFrom,"%s",leNom);
	setFrom(leFrom);//ajuste l'origine du message
}

Message::retirerDate(char * reponse)
{//retire la date de l'en-tête
	char toto[1024],laDate[1024],JourC[20],Jour[20],Mois[20],Annee[20],Heure[20];
	int k,i;
	sscanf(reponse,"%s",toto);
	do//compare chaque mot à "Date:"
	{
		k=0;
		i=strlen(toto)+1;
		while(reponse[k]=reponse[k+++i]);

		sscanf(reponse,"%s",toto);
	}while(strcmp(toto,"Date:"));

	sscanf(reponse,"%s %s %s %s %s %s",toto,JourC,Jour,Mois,Annee,Heure);//retire la date
	//série de if/else pour mettre le numero du mois à la place des trois première lettres
	if(strcmp(Mois,"Jan")==0)
		strcpy(Mois,"01");
	else
		if(strcmp(Mois,"Feb")==0)
			strcpy(Mois,"02");
		else
			if(strcmp(Mois,"Mar")==0)
				strcpy(Mois,"03");
			else
				if(strcmp(Mois,"Apr")==0)
					strcpy(Mois,"04");
				else
					if(strcmp(Mois,"May")==0)
						strcpy(Mois,"05");
					else
						if(strcmp(Mois,"Jun")==0)
							strcpy(Mois,"06");
						else
							if(strcmp(Mois,"Jul")==0)
								strcpy(Mois,"07");
							else
								if(strcmp(Mois,"Aug")==0)
									strcpy(Mois,"08");
								else
									if(strcmp(Mois,"Sep")==0)
										strcpy(Mois,"09");
									else
										if(strcmp(Mois,"Oct")==0)
											strcpy(Mois,"10");
										else
											if(strcmp(Mois,"Nov")==0)
												strcpy(Mois,"11");
											else
												if(strcmp(Mois,"Dec")==0)
													strcpy(Mois,"12");

	sprintf(laDate,"%s %s %s %s",Annee,Mois,Jour,Heure);//retire la date
	setDate(laDate);
	
}

Message::retirerMessage(char * reponse)
{//retire le message du mail
	char toto[1024],leMessage[1024],tampon[30],limite[30];
	int k,i;
	strcpy(leMessage,"");
	strcpy(limite,"RO");//dernier mot de l'en-tête avant le corps du message
	sscanf(reponse,"%s",toto);
	
	do
	{
		do//compare chaque mot à la limite
		{
			k=0;
			i=strlen(toto)+1;
			while(reponse[k]=reponse[k+++i]);

			sscanf(reponse,"%s",toto);
		}while(strcmp(toto,limite));

		sscanf(reponse,"%s%s",toto,limite);//retire le mot suivant la limite
		sprintf(tampon,"%s",limite);
		strcpy(limite,tampon);//change la limite pour le mot qui vient d'être lu
		strcat(leMessage,tampon);//ajoute le nouveau mot au corps du message retirer
		strcat(leMessage," ");//fait un espace entre les mots retirer
	}while(strcmp(tampon,"."));// le "." est l'indicateur de fin de message
	setMessage(leMessage);//ajuste le corps du message
}

bool Message::operator<(const Message &unMessage) const
{//surcharge de l'operateur < pour comparer les IdUniques de deux messages
	return idUnique<unMessage.idUnique;
}

bool Message::operator>(const Message &unMessage) const
{//surcharge de l'operateur > pour comparer les IdUniques de deux messages
	return idUnique>unMessage.idUnique;
}

bool Message::operator==(const Message &unMessage) const
{//surcharge de l'operateur == pour comparer les IdUniques de deux messages
	return idUnique==unMessage.idUnique;
}

void Message::operator=(Message &unMessage)
{//surcharge de l'operateur = pour ajuster l'IdUnique d'un message
	strcpy(idUnique , unMessage.idUnique);
}

#endif

/****************************************************************
*	Nom du programme :         modificationFichier				*
*   Nom du fichier:			   modificationFichier.h			*
*   Fait par:				   Bruno Michel						*
*   Date:					   10 decembre 2003					*
*   But:			faire une classe pour modifier un ficher	*
*****************************************************************/

#ifndef MODIFICATIONFICHIER_H
#define MODIFICATIONFICHIER_H

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <fstream>

  using namespace std;

class ModificationFichier
{
public:
   ModificationFichier();							// Constructeur.
   ~ModificationFichier();						// Destructeur.
	
	int D_Lire(int);						//méthode pour lire le fichier
	void D_Ecrire(int, int);						//méthode pour ecrire le fichier
	void D_Init();							//méthode pour initialiser le fichier

private:
	fstream fichier;
	struct typeEnregistrement
	{
		int numero;
	};

};

#endif;
//initialer fig 11. ecrire fig.12  
ModificationFichier::ModificationFichier()							// Constructeur.
{

}

ModificationFichier::~ModificationFichier()						// Destructeur.
{

}


int ModificationFichier::D_Lire(int num)//méthode pour lire le fichier
{
	ifstream fichier("leFichier.dat");
	typeEnregistrement enrg;

	if(!fichier){
		cerr<<"Echec - Le fichier n'est pas disponible"<<endl;
		exit(1);
	}
	
	fichier.seekg(( num-1) * sizeof(typeEnregistrement), ios::beg ) ;
	fichier.read((char *)&enrg,sizeof(typeEnregistrement)); //lecture
	
	fichier.close();
	cout<<num<<enrg.numero;
	return enrg.numero;
}

//méthode pour ecrire sur le fichier
void ModificationFichier::D_Ecrire(int num, int leNumeroAEcrire)
{
	fstream fichier("leFichier.dat", ios::in|ios::out|ios::binary);
	typeEnregistrement enrg;
	
	enrg.numero = leNumeroAEcrire;
	fichier.seekp( (num-1) * sizeof(typeEnregistrement), ios::beg ) ;
	fichier.write((char *)&enrg, sizeof(typeEnregistrement)); //ecriture
	
	fichier.close();
}

//méthode pour initialiser le fichier
void ModificationFichier::D_Init()
{
	fstream fichier("leFichier.dat", ios::in|ios::out|ios::binary);

	typeEnregistrement enrg;
	enrg.numero = 0;
	for ( int i = 0; i < 100; i++ )
	{ //ecriture ou initialisation
		fichier.write((char *)&enrg, sizeof(typeEnregistrement));
	}

	fichier.close();
}


 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


 Sources de la même categorie

GESTION DE MEMOIRE AUTOMATIQUE EN C++ par magicsystem
Source avec Zip CHAT EN MODE CONSOLE AVEC API WINDOWS par Pylouq
Source avec une capture TRACE ROUTE AVEC QT par LoVerMaKi
Source avec Zip TABLEAU INTERACTIF ET CONVIVIAL par accessone
Source avec Zip Source avec une capture PROGRAMME DE SAISIE D'UN RUBIK'S CUBE par AffreuxJojp

Commentaires et avis

Commentaire de ramziman le 25/05/2004 16:44:37

Bonjour.Est ce que vous pouvez le changer pour qu'il marche sous linux? si c'est possible. Et merce pour le code d'avance.

Commentaire de negatif le 04/06/2004 15:45:54

Salut,
J'ai testé le prog et pas d'erreur, d'ailleur, si je choisi l'option 2 par exemple, il m'affiche une autre liste de choix. Si je voulais recuperer mes mails, je choisis 1 mais j'ai tjs le message suivat:

erreur de connexion: No error
Press any key to continue

merci de votre aide.
negatif

Commentaire de mickbad le 16/07/2004 13:03:36

Salut,

Je dis que le code est pas mal et permet facilement de comprendre ce qu'il faut faire !

Seulement, j'ai une critique à faire au niveau du codage après un coup d'oeil rapide. Tu ne fais pas assez attention aux problèmes de sécurité du code. Je ne parle pas de la sécurité de connexion (hors propos) mais plutôt des trous que tu laisses.

Je pense bien que ce genre de programme est en démonstration afin de nous montrer ton travail. C'est très bien.

Comme exemple je te citerai ceci :

char user[30];
char pass[30];
char tampon[30];

//lecture et envoie du username
cout<<"Entrez votre nom d'utilisateur :"<<endl;
cin.get(tampon,30);
while(cin.get()!='\n');
strcpy(user,"user ");
strcat(user, tampon);
[...]

1°: user et tampon ont 30 caractères chacun. Tu places 5+1 caractères dans user puis ce que tapes l'utilisateur.
Attention donc si l'utilisateur insère plus de 30 caractères ==> boom, tu écris n'importe où dans la mémoire et ça peut générer des pbms d'execution et pire : ajouter du code pirate pour dérouter ton programme.
2°: plus dans l'utilisation des fonctions : utilise de préférence strncpy plutot que strcpy (et strncat vs strcat). Pourquoi ? pratiquement pour les mêmes raisons que dans le 1° ==> débordement de capacité.

Je suis d'accord que cette remarque semble dérisoire mais j'espère qu'elle te sera utile (aux autres aussi d'ailleurs :)) au cas où tu ignorais ce genre de déroutage ou tout simplement plantage sévère de ton programme.

Pour ce dernier, je me suis une fois retrouver avec un programme qui me faisait un truc ahurissant. Par négligence, j'ai écris des données en dehors d'un tableau et cet endroit contenait l'adresse de retour de la fonction courante. Cette modification a fait que mon return pointait au beau milieu de cette même fonction.
Hasard ? Je ne sais pas mais toujours est-il que j'avais une belle boucle infinie ahurissante :D

M'enfin bon travail et merci ... ça mévite de chercher moi-même comment interroger un serveur POP (instruction serveur :))

Mick

Commentaire de mickbad le 16/07/2004 13:35:59

euh ...

dans cette phrase "Attention donc si l'utilisateur insère plus de 30 caractères ==> boom, tu écris n'importe où dans la mémoire ", je voulais plutot écire "plus de 25 caractères (à un près :)) [...]"

héhé
désolé, j'ai *aussi* oublié que user contenait déjà du monde :)

Mick

Commentaire de NeoUmbrella le 08/12/2004 21:36:46

Dommage qu'il y ait pas l'exe, sinon code intuitif.

Commentaire de Oeil_de_taupe le 15/02/2005 14:55:42


Juste une petite question (sans doute stupide, n'oubliez pas que c'est Oeil de taupe qui pose cette question). Pourquoi as-tu choisi un buffer de 1024 pour récupérer les messages. Es-ce que c'est un choix arbitraire? Parce que j'ai l'impression que quand tu demandes un long message a un serveur POP3 le serveur t'envoie le message en petites parties (je ne comprends pas pourquoi) et ces parties sont toutes assez proche de 1024...

Ouin ouin, j'comprends pas :-(

Commentaire de freoui le 16/03/2011 10:01:06

Bonjour,
je vous remercie pour le code mais si vous pouvez nous expliquer davantage la minière avec la quelle on doit compiler ce projet
Merci

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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 : 2,137 sec (4)

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