Accueil > > > CLIENT MAIL (POP3 ET SMTP)
CLIENT MAIL (POP3 ET SMTP)
Information sur la source
Description
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
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
INTéGRATION YAMMER ET SHAREPOINT ONLINE (OFFICE 365), éTAPE 1 .INTéGRATION YAMMER ET SHAREPOINT ONLINE (OFFICE 365), éTAPE 1 . par Patrick Guimonet
#Yammer Certains s'en sont déjà fait l'écho (ici en allemand par exemple : Yammer Integration in Office 365 Phase 1) ou bien sûr sur le blog SharePoint : Make Yammer your default social network in Office 365 en anglais. Mais c'e...
Cliquez pour lire la suite de l'article par Patrick Guimonet [DYNAMICS CRM] AJOUTER LES DOSSIERS DE CRM AU DOSSIER FAVORIS D'OUTLOOK[DYNAMICS CRM] AJOUTER LES DOSSIERS DE CRM AU DOSSIER FAVORIS D'OUTLOOK par bianca
Objectif
Pour aller plus rapidement dans les menus de Dynamics CRM depuis votre client CRM pour Outlook, vous pouvez utiliser le dossier des Favoris d'Outlook. En effet, par simple glisser/déplacer, vous pouvez déposer un éléme...
Cliquez pour lire la suite de l'article par bianca VISUAL STUDIO 2013VISUAL STUDIO 2013 par Etienne Margraff
Ahh, ENFIN ! c'est officiel, il va y avoir un VS et un TFS 2013. De nouvelles fonctionnalités qui vont à mon sens assoir la maturité de TFS qui est maintenant l'outil incontournable pour tout projet (.NET, mais pas seulement !). Si vous n'avez pas jet...
Cliquez pour lire la suite de l'article par Etienne Margraff CONFIGURER LA COLLATION SQL SERVER POUR SHAREPOINT CONFIGURER LA COLLATION SQL SERVER POUR SHAREPOINT par JeremyJeanson
Note : Je poste cet article à titre de pense-bête. Cela fait des années que je me trimballe avec une capture d'écran, car je ne me rappel jamais comment choisir la collation d'un SQL Server pour SharePoint. Pour SharePoint, il est conseillé de choisir la ...
Cliquez pour lire la suite de l'article par JeremyJeanson ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 1: CRéATION DU PLUGINETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 1: CRéATION DU PLUGIN par Philess
Dans cet article nous allons créer un plugin installable sur le Team Web Access qui s'intègrera dans l'architecture du site et se chargera au moment où on le décidera.
Avant de lire ce billet et si cela n'est pas encore fait j...
Cliquez pour lire la suite de l'article par Philess
Logiciels
Nego Facturation (1.85)NEGO FACTURATION (1.85)Nego Facturation est un logiciel complet qui permet de gérer vos factures et devis très simplemen... Cliquez pour télécharger Nego Facturation Devis-Factures PHMSD (2.2.0.1)DEVIS-FACTURES PHMSD (2.2.0.1)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD WDmemoCode (2.0.0.1)WDMEMOCODE (2.0.0.1)WDmemoCode a été conçu pour aider les développeurs Windev à créer/compléter et conserver une base... Cliquez pour télécharger WDmemoCode ProtoMedic (4.0.0.11)PROTOMEDIC (4.0.0.11)ProtoMedic est un logiciel destiné principalement aux médecins généralistes.
ProtoMedic permet d... Cliquez pour télécharger ProtoMedic MyCurriculum 2011 (7.4.1.12)MYCURRICULUM 2011 (7.4.1.12)Rédigez votre Curriculum Vitae mais également ceux de votre famille ou de vos amis très facilemen... Cliquez pour télécharger MyCurriculum 2011
|