Idhttp , idpop3 ,idsmtp en grande partie expliquée

Soyez le premier à donner votre avis sur cette source.

Snippet vu 33 777 fois - Téléchargée 35 fois

Contenu du snippet

Vous pouvez le trouver sur mon site

http://www.remixtech.com
dans la rubrique tutorial

Sinon ci dessous le tutorial

Oups le tutorial à un prob , il remplace les , ' en ?
Pour pas avoir le prob telechargez le ...

Source / Exemple :


IDHTTP , IDSMTP , IDPOP3 Avec Remixg@me

I Introduction 
 
Nous étudierons, les composants IDHTTP , IDPOP3 et IDSMTP qui sont des composants très simple à utiliser,
et très très performant ...
De plus aucun tutorial n'est disponible actuellement sur le net.
C'est pourquoi, voici un tutorial très très théorique, aucun exemple du type cliquez ici ne sera mentionné, nous étudierons les fonctions de bases ...

II Questions

	1. Pourquoi utiliser les composant INDY ?
	2. Ou trouver ces composants ?
	3. Ou trouver des exemples ?
	4. Ou trouver le code source ?
	5. Ou trouver le fichier d'aide ?

	1. Pour développer des applications fiables et puissantes liées au réseau de plus Indy livre son Code Source, il est libre de bugs, et est plus stable ...
	2. Dans Delphi 7 et il me semble Delphi 6, à vérifier ...
	3.http://www.nevrona.com/indy/demodownloads/I9D6_Demos_24Nov02.zip
	4.http://www.nevrona.com/indy/downloads/IndyWin32_9_00_11_Src.zip
	5.http://www.nevrona.com/indy/downloads/Indy-9-0-Help-WinHelp.zip

III Idhttp et Idpop3

	1. IDHTTP
		Idhttp se trouve dans les composants Indy -> Client, c'est un client HTTP, il permet d'établir une connexion avec un serveur (sécurisé ou pas), 
De télécharger des données, c'est un composant idéal si vous voulez créer une application de type Internet http (Web browser, Aspirateur de site Web, MAJ de logiciel, 
Vérification de clé), de plus je crois qu'il est possible d'envoyer des entêtes permettant de transmettre des paramètres de type Input Box (Formulaire) mais je ne connais pas toute les fonctions de ce composant qui est puissant ...

	2. IDPOP3
		IDPOP3 se trouve comme le précédant dans la rubrique Indy-> Client, c'est un client POP3, il à toute les fonctions nécessaires à créer un logiciel surpuissant du type Outlook express, pour vous dire, nous aborderons ici les principes les plus simples, nombre de mails, récupération des entêtes, suppression des messages, récupération des messages entiers ...

	4. IDantifreeze
		Les composants INDY étant des composants bloquant il est conseillé d?utiliser ce composant pour éviter de figer l?application pendant le déroulement de l?application ? Vous le trouverez dans INDY -> divers

 

IV Idhttp

1 Téléchargement simple et bête d?un fichier
2 Explication des fonctions
	Pour se connecter :
	Obtenir la taille d?un fichier :
	Télécharger un fichier ou une partie :
	Authentification basic de type HTACCESS :
4.Conclusion		

	1 Téléchargement simple et bête d?un fichier

Pour télécharger un fichier rapidement sans complication voici un morceau de code ?

 procedure TForm1.Button1Click(Sender: TObject);
var
 F: TFileStream;
begin
 try

{On crée un fichier c:\ fichier.exe}

       F := TFileStream.Create(?c:\fichier.exe?, fmCreate);
    
{On récupère un fichier sur internet et on met tout dans F soit c:\ fichier.exe}

      IdHTTP1.get(?www.domaine.com/fichier.exe?,F);

 Finally
{Enfin on libère F}
   F.Free;
 end;
end;

	2 Explication des fonctions 

Pour se connecter :

idhttp1.Host := '?www.free.fr'; //1
idhttp1.port := 80 ; //2
idhttp1.Connect(-1); //3

1 -> Entrez ici l?hôte 
2 -> Entrez ici le port
3 -> Demandez la connection avec comme argument -1 pour ( pas de timeout ) 
Si vous mettez 100 alors une erreur timeout sera généré après 100 ms d?attente 

Obtenir la taille d?un fichier :

IdHTTP1.Head('/im/mast0.gif'); // 1 
Taille := IdHTTP1.Response.ContentLength; // 2

1 -> Ici on récupère l?en tête du fichier /im/mast0.gif donc http://www.free.fr/im/mast0.gif 
2 -> On extrait la taille du fichier de la réponse de Head et on la place dans la variable taille qui doit être de type INT

Après cette action le client se déconnecte du serveur

Télécharger un fichier ou une partie :

idhttp1.Request.ContentRangeStart := 10; //1
idhttp1.Request.ContentRangeEnd := 100; //2
RecuSTR := idhttp1.Get('/index.html'); //3

1 -> On demande de télécharger à partir de ContentRangeStart , ici on commence par télécharger le 10 ème bit
2 -> On demande de télécharger jusqu? à ContentRangeEnd , ici on télécharge jusqu'à 100
3 -> On va chercher la page http://www.free.fr /index.html et on place ce qui est recu dans la variable STRING RecuSTR

Après cette action le client se déconnecte du serveur

Authentification basic de type HTACCESS :

idhttp1.Request.Username:=?Username?; //1
idhttp1.Request.password:=?Password?; //2
idhttp1.Request.BasicAuthentication:=true; //3

1 -> Ici on place l?username , ATTENTION : ce bout de code doit être placé avant la connection ou la demande de fichier ?
2 -> Ici le password ?
3 -> On indique qu?on veux une authentification Simple avec cette fonction 

	

	4.Conclusion 

		Avec cela vous pouvez faire un client http qui suporte le resuming , l?authentification , et bien d?autre chose , j?espere que ce tutorial comblera un peu le trou noir sur INDY , car y?a vraiment pas grand-chose sur lui ?

V IDPOP3
1 ) Connection à un serveur POP3
2 ) Nombre de mail
3 Récupération des Headers
4 Suppression d?un message
5 Récupérer un message
6 Informations basics d?un message récupéré
7 Plus Dur Récupération du Texte et des fichiers joints ?
	Etudions le TIDText
	Etudions le TIDAttachement
8 Conclusion

		1 ) Connection à un serveur POP3

idpop31.Host := 'VotrePOP'; //1
idpop31.Username := 'VOTREUsername'; //2
idpop31.Password := 'VotrePASS'; //3
idpop31.Connect(-1); //4

1 -> Indiquez ici votre serveur Pop3
2 -> Votre user
3 -> Votre Pass
4-> Demandez la connection avec comme argument -1 pour ( pas de timeout ) 
Si vous mettez 100 alors une erreur timeout sera généré après 100 ms d?attente 

		2 ) Nombre de mail

nbrmail := idpop31.CheckMessages;	

Cette fonction va chercher le nombre de message sur le compte POP3 ou nous nous sommes connectés , la fonction renvoit le nombre de message en Integer ?

		3 Récupération des Headers 

Pour utiliser cette fonction il vous faut placer un IDMessage (Dans Indy Divers )	, ici nous l?appellerons MSG

idpop31.RetrieveHeader(MAIL,Msg); //1 //2 //3

1 -> MAIL -> entier donnant le numéro du mail 
2 -> MSG -> nom de votre Idmessage 
3 -> Dans cette fonction on place les headers de MAIL dans le Idmessage MSG

    SUJET := (Msg.Subject) ; //1 
    SENDER := (Msg.From.Text) ; //2
    DATE := (DateToStr(Msg.Date)) ; //3 
    TAILLE := IntToStr(idPOP31.RetrieveMsgSize(MAIL))); //4 //5
  
1 -> On place le sujet du message dans la variable sujet 
2 -> Pareil mais avec , l?envoyeur du mail 
3 -> Pareil mais avec la date 
4 -> Ici on récupère la taille du mail avec la fonction RetrieveMsgSize
5 -> MAIL -> Numéro e mail en cour en INTEGER

		4 Suppression d?un message 

  idpop31.delete(MAIL); //1

1 -> On utilise la fonction delete pour supprimer MAIL -> Numéro du mail à supprimer

		5 Récupérer un message

idpop31.Retrieve(MAIL, Msg); //1

1 -> le message est récupéré , est stocké dans le IDMessage MSG , il peut contenir , text , images , Fichiers 

		6 Informations basics d?un message récupéré 

   EnvoiePar := Msg.From.Text; //1
   ReceptionDeEmail := Msg.Recipients.EmailAddresses; //2
   CC  := Msg.CCList.EMailAddresses; //3
   Sujet := Msg.Subject; //4
   Date := FormatDateTime('dd mmm yyyy hh:mm:ss', Msg.Date); //5
   Receipt := Msg.ReceiptRecipient.Text; //6
   Organisation := Msg.Organization; //7
   Priority:= IntToStr(Ord(Msg.Priority) + 1); //8

1 -> C?est l?adresse de celui qui a envoyé le mail
2 -> C?est le destinataire
3 -> CC
4 -> Le sujet
5 -> la date remarqué le FORMATDATETIME
6-> Receipt ( je sais pas à quoi ca sert ) 
7 -> Organisation
8 -> C?est la priorité

		7 Plus Dur Récupération du Texte et des fichiers joints ?
J?ai passé un bon bout de temps avant de comprendre le fonctionnement ( 1 tite Heure ) 
Mais maintenant tout va bien j?ai tout compris ?
Et je vais essayer de vous faire part de mes connaissances .

La base TIDAttachement -> veut dire Fichier Joint
La base TIDText -> veut dire Texte Joint 

Etudions le TIDText

               if Msg.MessageParts.Items[PARTIEMESSAGE] is TIdText then //1
                  begin                          Memo1.Lines.AddStrings(TIdText(Msg.MessageParts.Items[PARTIEMESSAGE]).Body); //2
                  end

1 -> Le message est composé de plusieurs parties bien distinctes , PARTIEMESSAGE  est la partie désiré du message .Donc Si PARTIEMESSAGE est un TIDTEXT alors on l?affiche
Voici la fonction qui permet de trouver le nombre de partie
Msg.MessageParts.Count // C?est la fonction pour trouver le nombre de partie
2 -> On place le Body de MSG dans Memo1 à l?aide de cette fonction 

Etudions le TIDAttachement

if (Msg.MessageParts.Items[PARTIEMESSAGE] is TIdAttachment) then //1 
            begin 
               NOM := (TIdAttachment(Msg.MessageParts.Items[PARTIEMESSAGE]).Filename); //2
  CONTENT : = (TIdAttachment(Msg.MessageParts.Items[PARTIEMESSAGE]).ContentType); //3
TIdAttachment(Msg.MessageParts.Items[intIndex]).SaveToFile('c:\Fichiers.txt')  ; //4
            end

1 -> On vérifie si PARTIEMESSAGE est un attachement
2 -> On prend le Nom du fichier est on le transmet à la variable NOM
3 -> On prend le type de fichier Plain/text Jpeg/image enfin c?est trucs la quoi , et on le mais dans CONTENT
4 -> On place le Tidattachment dans un fichier ici c:\fichiers.txt

Ca parait simple mais pour le chercher c?est plus compliqué ?

		8 Conclusion

Vous avez toute les fonctions necessaires pour faire un SUPER client mail ;-) , ici je n?ai pas décrit les messages de sortie , mais si la fonction est executé correctement alors elle à des chances de renvoyer la valeur TRUE , après on attaque le SMTP ?  

VI IDSMTP
	1.Se connecter Mode LOGIN Mode NONE
2.Se connecter
	3.Préparer un MSG
4 Envoyer le mail
5 Conclusion

Dans cette partie nous décrirons le composant IDSMTP , juste en envoyant un message , pour l?utiliser il faut le composant TIDMessage qui sera ici appelé MSG

	1.Se connecter Mode LOGIN Mode NONE

SMTP.AuthenticationType := atNone; //1	
SMTP.AuthenticationType := atLogin; //2

1 -> Sans Authentification 
2 -> Avec Authentification 

	2.Se connecter 

   SMTP.Username := Username;
   SMTP.Password := bentonpasse;
   SMTP.Host := Serveur;
   SMTP.Port :=port;
   SMTP.Connect(-1);//1

1 -> j?ai passé l?explication sur les ports est le login sinon mon cour ferait 20 000 pages ( même pas exagéré ;-) ) 
Donc comme pour les autres le -1 de connect signifie pas de timeout , si celui-ci est réglé à 1000
Alors si le serveur ne répond pas avant 1000 ms le programme génere une erreur attente dépassé ?

	3.Préparer un MSG

with MSG do //1
      begin
         Body.Assign(Memo1.Lines); //2
         From.Text := Tonmail; //3
         Recipients.EMailAddresses := DESTINATAIRE; //4
         Subject := SUJET; //5
         Priority := TIdMessagePriority(2); //6
         CCList.EMailAddresses := CC; //7
         BccList.EMailAddresses := BB; //8 
         Sender.Text := Envoyeur ; //9
         ExtraHeaders.Assign(?Un truc?); //10
End
TIdAttachment.Create(MSG.MessageParts, ?c:\fichier.exe?); //11
         
1 -> On utilise les fonctions suivantes avec MSG
2 -> C?est le texte
3 -> C?est celui qui envoit
4 -> C?est le destinataire
5 -> c?est le sujet
6 -> Priorité 
7 -> CC ???
8 -> BB ??? Je sais qu?il y?a ces deux la dans outlook donc j?ai mis ..
9 -> adresse de celui qui envoie 
10 -> C?est les headers à rajouté , Exemple pour le HTML
11 -> rajouter un fichier dans Tidattachment ici le fichier ?c:\fichier.exe?

	4 Envoyer le mail 
 
          SMTP.Send(Msg);

No Coment  ;-)

	5 Conclusion

Maintenant vous savez envoyer un mail ? 

VII.Evenements 

J?ai mis à part les évenements car il se ressemble beaucoup dans INDY , donc les choses expliquées ci dessous pour IDHTTP sont valables pour IDSMTP et IDPOP3

Les On Work Valable pour tout les composants INDY ;-)

procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;const AWorkCountMax: Integer);
begin
 if AWorkMode = wmRead then //1
 begin
   ProgressBar1.Max := AWorkCountMax ; //2
   ProgressBar1.Position := 0 ; //3
 end;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;const AWorkCount: Integer);
begin
 if AWorkMode = wmRead then
 begin
   ProgressBar1.Position := AWorkCount ; //4 
   Label1.Caption := IntToStr(AWorkCount) + 'Bytes de :' + inttostr(ProgressBar1.Max) ; //5
end;
end;

procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
if AWorkMode = wmRead then
   Label1.Caption := 'Fin?; //6
end;

TForm1.IdHTTP1WorkBegin -> Début de travaille du composant
TForm1.IdHTTP1Work -> Travaille en cour
TForm1.IdHTTP1WorkEnd -> Fin du travail

1 -> Si le mode de aworkmode est lecture alors
2 -> On aligne la progress bar ( le max ) avec le total de boulot ?
3 -> On règle la position de la progress bar à 0
4 -> On aligne la progress bar avec AWORKCOUNT qui nous renvoit le travaille éfféctué
5 -> On présente l?avancement
6 -> On indique la fin du boulot ...

Authentification FAILED ;?) 

procedure TForm1.IdHTTP1Authorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin

showmessage('ERROR Non authentifié');
end;

Il nous renvoie ici si il y?a un problème d?authentification 

Connection et déconnection : 

procedure TForm1.IdHTTP1Connected(Sender: TObject);
begin
//1
end;

procedure TForm1.IdHTTP1Disconnected(Sender: TObject);
begin
end;
//2
end.

Classique ;-) 

1 -> si il y?a connection il nous renvoi ici 
2 -> si il y?a deconnection il nous renvoi ici 

Mon préféré le STATUS 

procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: String);
begin
edit1.text:=astatustext; //1

end;

1 -> on place dans Edit1.text le status ?

VIII Conclusion 

J?espere que ce tutorial vous aura bien servie , moi en tout cas il me servira tout le temps de pense bête , j?espère d?ici un pti bout de temps , pouvoir sortir un tutorial toujours sur INDY , mais cette fois sur FTPClient , FTPServeur , TCP IP Client , TCP IP Serveur , Le multithreading 
Si vous pensez que c?est une bonne idée faîte le moi savoir webmaster@remixtech.com 
Vous pouvez aller faire un tour sur mon site pour l?instant que des softs en VB , mais bientôt des gros softs en delphi ?

Bye

http://www.remixtech.com

Conclusion :


Voila j'espere que ca vous à fait plaisir ,-)

Bye Bon dev Avec Indy

A voir également

Ajouter un commentaire

Commentaires

cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
d'abord, 10/10 pour ce tuto, arrive juste à point...
deux petites choses.
Quand on fait un IdPOP31.Retrieve ou un IdPOP31.RetrieveHeader, il faut penser à faire Clear sur le IdMessage avant de rapeler la fonction une nouvelle fois pour charger le message suivant. Sinon, (chez moi en tout cas) il reste sur le premier message et ne charge jamais les autres. (sans erreur pour autant mais avec 3 ou 4 messages identiques).

Ensuite, je reçoit des messages avec des caractères bizares..
?UTF-8?B?UG9ydGFibGU=?= pour "portable" ou "téléphone" pour "téléphone".
C'est un problème de jeu de caractère mais je n'ai pas encore la réponse.
Je continue de chercher dans mon coin mais si quelqu'un à une solution, merci de me la donner...

Barbichette
cs_Pierre42
Messages postés
19
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
22 novembre 2008
-
Pour répondre à Foucteau :

Avec la version indy 10 :
variables :
i : integer ;
texte : TIdText ;
MemoCorps : Tmemo ;
MSG: TIdMessage;

unité à ajouter : TIdText

code :
for i := 0 to msg.MessageParts.Count -1 do
begin
if msg.MessageParts[i].PartType = mptText then
begin
texte := TIdText.Create(nil);
texte.Assign(msg.MessageParts[i]) ;
MemoCorps.Text := texte.Body.Text ;
texte.free ;
end ;
end ;
cs_Pierre42
Messages postés
19
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
22 novembre 2008
-
Ca ne fonctionne pas avec la version 10 !
kabiben
Messages postés
1
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
17 octobre 2006
-
Merci pour votre aide. Ca marche tres bien. Merci!!!
Filipe35
Messages postés
496
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
-
Comment récupérer les headers d'une connexion idHTTP ?

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.