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