Client mail (pop3 et smtp)

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)

pour 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 / Exemple :


/*
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(); }

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.