FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 919, dernière mise à jour : 14 juin 2019  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

Commentez


SommaireSystèmeInternet (6)
précédent sommaire suivant
 

Il suffit de se servir de la fonction de l'API suivante contenue dans l'unité WinInet :

Code delphi : Sélectionner tout
InternetGetConnectedState (lpdwFlags : LPDWORD; dwReserved : DWORD) : BOOL; stdcall;
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
uses 
  WinInet; 
  
function DetectionConnexion: Boolean; 
var 
  dwFlags: DWord; 
begin 
  dwFlags := INTERNET_CONNECTION_MODEM or INTERNET_CONNECTION_LAN or INTERNET_CONNECTION_PROXY; 
  Result := InternetGetConnectedState(@dwFlags, 0); 
end;
Cette fonction nous renvoie True si on est connecté ou False si on ne l'est pas.

Ceci ne fonctionne pas pour une connexion par LAN.

Mis à jour le 14 janvier 2014 Al-Yazdi

Deux possibilités s'offrent à nous : l'utilisation de FastNet ou Indy.

FastNet

Le protocole SMTP (Simple Mail Transfer Protocol) permet d'envoyer un e-mail via le port 25 du serveur. Ce protocole a également des propriétés d'identification de l'émetteur (login/mdp) mais elles sont rarement utilisées par les providers classiques.

Pour aller plus loin : http://www.rfc-editor.org/rfc/rfc821.txt.
Et pour la version simplifiée : http://www.salemioche.com/smtp/.

Les versions antérieures à Delphi 7 fournissent un onglet Fastnet : le composant qui va nous intéresser est TNMSMTP.

Le composant :

Tout d'abord, on instancie l'objet. Vous avez le choix entre glisser le composant sur votre form ou l'instancier à la main. Je préconise l'instanciation manuelle qui est plus pratique si vous voulez réaliser un utilitaire en ligne de commande par exemple. Surtout, cette méthode est plus propre puisqu'elle évite d'encombrer la mémoire avec des objets non utilisés.

La propriété host indique l'adresse de votre serveur de messagerie.
La propriété postmessage représente le message lui-même et sa description : émetteur, destinataire, sujet, corps du message et pièce jointe.
Un certain nombre de paramètres comme le format du mail (html, plain text) ou le jeu de caractères peuvent y être définis (voir l'aide sur postmessage). Le corps du message (Body) et l'adresse de l'expéditeur sont des TStrings.

Mais un peu de code vaut mieux qu'un bon discours :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
begin 
  with TNMSMTP.Create(nil) do 
  try 
    Host := 'mail.developpez.com'; Connect; PostMessage.FromAddress :=  
'moi@monserveur.com'; 
    PostMessage.ToAddress.Text := 'toi@tonserveur.com'; 
    PostMessage.Subject :='Sujet de mon message'; 
    PostMessage.Body.Text := 'Corps du message'; 
    PostMessage.Attachments.Add(nomdufichier); {Attachments est un TStrings  
contenant les chemins des fichiers attachés. } 
    SendMail; 
    Disconnect; 
  finally 
    Free; 
  end; 
end;

Indy

Bon, Fastnet n'existant plus en Delphi 7, je vous présente la même chose avec les composants Indy.
On procède à peu près de la même manière. Sauf qu'il y a maintenant deux objets à instancier : le message (TIdMessage) et la connexion au serveur SMTP (TIdSMTP).

Il faut d'abord instancier les deux objets, remplir les propriétés du TIdmessage et l'envoyer. À noter que l'on peut envoyer plusieurs TIdMessage en laissant la connexion ouverte.

Concernant le TIdSMTP, il n'y a rien de particulier a savoir, on crée l'objet et on définit le nom du serveur de messagerie puis Connect, Send et Disconnect !
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var 
  IdMessage: TIdMessage; 
  IdSMTP: TIdSMTP; 
  Message: TStrings; 
  i: Integer; 
  Fichiers: Array Of String; 
begin 
  IdMessage := TIdMessage.Create(nil); //création dynamique du composant 
  
  IdMessage.From.Address := 'expediteur@domaine.com'; 
  
  //Ces deux lignes peuvent-être répétées autant de fois que vous désirez  
  //d'adresse de réponse et/ou de destinataire 
  IdMessage.ReplyTo.Add.Address := 'expediteur@domaine.com'; 
  IdMessage.Recipients.Add.Address := 'destinataire@domaine.com' ; 
  
  IdMessage.Subject := 'Sujet du message'; 
  
  IdMessage.ContentType := 'multipart/alternative'; //Message 'découpé' en plusieurs parties 
  
  Message := Memo1.Lines; //par exemple... il faut juste que ce soit un TStrings ! 
  
  //Ici on va créer les différentes parties du message 
  //Au cas où le client ne gère pas les messages HTML : 
  With TIdText.Create(IdMessage.MessageParts, Message) Do 
  Begin 
    ContentType := 'text/plain'; 
    Body.Insert(0, 'Ce message est un message HTML. Configurez votre client de courrier électronique' + 
  'pour le visionner de manière appropriée'); 
  end; 
  
  //Ajout du message au format HTML (en supposant que Message contient du HTML) : 
  with TIdText.Create(IdMessage.MessageParts, Message) do 
    ContentType := 'text/html'; 
  
  //Et maintenant, l'ajout des pièces jointes : 
  //Le tableau de strings Fichiers doit être remplis avec les chemins complets des fichiers à inclure 
  for i := Low(Fichiers) to High(Fichiers) do 
    TIdAttachment.Create(IdMessage.MessageParts, Fichiers[i]); 
  
  //On passe ensuite à l'envoi du message: 
  IdSMTP := TIdSMTP.Create(nil) ; //Création dynamique du composant 
  
  IdSMTP.Port := 25; //Le port SMTP standard... 
  IdSMTP.Host := 'smtp.serveur.com';  //Le serveur auquel se connecter 
  
  //Ensuite on se connecte et on envoit le message, en gérant les erreurs, tant qu'à faire ! 
  Try 
    Try 
      IdSMTP.Connect; 
      IdSMTP.Send(IdMessage); 
    except 
      on e: exception do MessageDlg(e.Message, mtError, [mbOK], 0); 
    end; 
  finally 
    IdSMTP.Disconnect; 
    IdSMTP.Free; 
    IdMessage.Free; 
  end; 
  
end;
Le principe est de créer un message en 'multipart', où chaque partie contiendra soit une pièce jointe, soit le message html, soit l'alternative en texte brut (pour les clients mail qui ne supportent pas l'HTML).

Il peut arriver que vous ayez un bug en voulant ajouter des pièces jointes à un message au format HTML (bug existant dans les versions antérieures d'Indy). Pour le corriger, il faut modifier IdMessageClient.pas (situé dans le répertoire Borland\Delphi7\Sources\Indy\) aux lignes 359 et 377, en remplaçant text/plain par text/html.

Si le serveur SMTP que vous avez choisi est en 'free relay' (accepte toute connexion, smtp.free.fr par exemple !) alors votre message sera envoyé dans les plus brefs délais !

Solution gérant les connexions SSL :

Les fichiers .cer seront obtenus auprès de votre fournisseur de services.
Code Delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
var 
  IdMessage: TIdMessage; 
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; 
  IdSMTP: TIdSMTP; 
  Message: TStrings; 
  i: Integer; 
  Fichiers: Array Of String; 
begin 
  IdMessage := TIdMessage.Create(nil); //création dynamique du composant 
  
  IdMessage.From.Address := 'expediteur@domaine.com'; 
  
  //Ces deux lignes peuvent-être répétées autant de fois que vous désirez  
  //d'adresse de réponse et/ou de destinataire 
  IdMessage.ReplyTo.Add.Address := 'expediteur@domaine.com'; 
  IdMessage.Recipients.Add.Address := 'destinataire@domaine.com' ; 
  
  IdMessage.Subject := 'Sujet du message'; 
  
  IdMessage.ContentType := 'multipart/alternative'; //Message 'découpé' en plusieurs parties 
  
  Message := Memo1.Lines; //par exemple... il faut juste que ce soit un TStrings ! 
  
  //Ici on va créer les différentes parties du message 
  //Au cas où le client ne gère pas les messages HTML : 
  With TIdText.Create(IdMessage.MessageParts, Message) Do 
  Begin 
    ContentType := 'text/plain'; 
    Body.Insert(0, 'Ce message est un message HTML. Configurez votre client de courrier électronique' + 
   'pour le visionner de manière appropriée'); 
  end; 
  
  //Ajout du message au format HTML (en supposant que Message contient du HTML) : 
  with TIdText.Create(IdMessage.MessageParts, Message) do 
    ContentType := 'text/html'; 
  
  //Et maintenant, l'ajout des pièces jointes : 
  //Le tableau de strings Fichiers doit être remplis avec les chemins complets des fichiers à inclure 
  for i := Low(Fichiers) to High(Fichiers) do 
    TIdAttachment.Create(IdMessage.MessageParts, Fichiers[i]); 
  
  //On passe ensuite à l'envoi du message: 
  IdSMTP := TIdSMTP.Create(nil) ; //Création dynamique du composant 
  
  IdSMTP.Port := 25; //Le port SMTP standard...  
  IdSMTP.Host := 'smtp.serveur.com';  //Le serveur auquel se connecter 
  
// paramétrage de la connexion SSL. 
If SSLConnect Then 
 begin 
   IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.RootCertFile :='RootCert.cer'; 
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile := 'Certificat.cer'; 
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.KeyFile := ''; 
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3; 
 end; 
  
  //Ensuite on se connecte et on envoit le message, en gérant les erreurs, tant qu'à faire ! 
  Try 
    Try 
      IdSMTP.Connect; 
      IdSMTP.Send(IdMessage); 
    except 
      on e: exception do MessageDlg(e.Message, mtError, [mbOK], 0); 
    end; 
  finally 
    IdSMTP.Disconnect; 
    IdSMTP.Free; 
    IdMessage.Free; 
  end; 
  
end ;

Mis à jour le 11 mars 2014 aityahia Bestiol nut62

Pour assigner les valeur par défaut pour l'expédition de mail, il suffit de récupérer les valeurs du client mail par défaut de l'utilisateur.
Les exemples d'utilisation de ces informations sont donnés avec les composants Indy, mais elles peuvent être utilisées sur tous les types de composant POP et SMTP.

Pour récupérer les information d'Outlook (le client mail le plus utilisé) :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TMain.RetrieveIdMailFromOutlook; 
var 
  Registry: TRegistry; 
begin 
  Registry := TRegistry.Create; 
  try 
    Registry.RootKey := HKEY_CURRENT_USER; 
    if Registry.OpenKeyReadOnly('Software\microsoft\internet account manager\Accounts\00000001') then 
      begin 
edtHost.Text := Registry.ReadString('SMTP Server'); 
IdSMTP.Host := edtHost.Text; 
IdMessage.Sender.Address := Registry.ReadString('SMTP EMail Address'); 
IdMessage.Sender.Name := Registry.ReadString('SMTP Display Name'); 
{ Assignation des champs From afin de les faire correspondre avec l'envoyeur } 
IdMessage.From.Assign(IdMessage.Sender); 
      end else 
raise exception.Create('Don''t match outlook data !'); 
  finally 
    Registry.Free; 
  end; 
end;

Pour récupérer les information d'Eudora :

Eudora stocke seulement quelques infos dans la base de registre, le chemin d'accès à ses fichiers de configuration qui sont sous forme de fichiers TIni…
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TMain.RetrieveIdMailFromEudora; 
var 
  IniPath: string; 
  Registry: TRegistry; 
  IniEudora: TIniFile; 
begin 
  Registry := TRegistry.Create; 
  try 
    Registry.RootKey := HKEY_CURRENT_USER; 
    if Registry.OpenKeyReadOnly('Software\Qualcomm\Eudora\CommandLine') then 
      begin 
IniPath := Registry.ReadString('Current'); 
{ Récupération du Chemin/Nom du fichier de configuration pour l'utilisateur } 
{ de l'ordinateur (loggé) qui est le dernier dans la chaîne } 
while pos(' ',IniPath) <> 0 do  
  delete(IniPath,1,pos(' ',IniPath)); 
IniEudora := TIniFile.Create(IniPath); 
edtHost.Text := IniEudora.ReadString('Settings','SMTPServer',''); 
IdSMTP.Host := edtHost.Text; 
IdMessage.Sender.Address := IniEudora.ReadString('Settings','ReturnAddress',''); 
IdMessage.Sender.Name := IniEudora.ReadString('Settings','RealName',''); 
{ Assignation des champs From afin de les faire correspondre avec l'envoyeur } 
IdMessage.From.Assign(IdMessage.Sender); 
      end; 
  finally 
    FreeAndNil(Registry); 
    FreeAndNil(IniEudora); 
  end; 
end;

Mis à jour le 18 octobre 2013 ptitbob

Ou plutôt, récupérer une image depuis un site web et l'afficher dans notre application.

J'ai choisi d'utiliser ici un Tidhttp, composant faisant partie d'Indy et livré avec Delphi 7. Le Tidhttp nous renvoie un TStream contenant notre ressource. J'ai choisi d'utiliser un TMemoryStream mais on peut très bien utiliser un TFileStream pour enregistrer le fichier sur le disque.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var 
  IdHTTP1:Tidhttp; 
  MyStreamt:TMemoryStream; 
  jp:TJpegImage; 
begin 
  MyStreamt:=TMemoryStream.Create; { ou tout autre TStream } 
  Try 
    IdHTTP1:=Tidhttp.Create(nil); 
    Try 
      IdHTTP1.Get('http://www.developpez.biz/images/logo.jpg',Mystreamt); 
    except 
      ShowMessage('Fichier indisponible'); 
      Exit; 
    End; 
    Mystreamt.Seek(0, soFromBeginning);  { on rembobine le stream } 
    jp:=TJpegImage.Create; 
    Try 
      jp.LoadFromStream(MyStreamt); 
      Image1.Picture.Assign(jp); 
    Finally 
      jp.free; 
    End; 
  Finally 
    IdHTTP1.Free; 
    MyStreamt.Free; 
  End; 
end;
En pensant à ajouter l'unité JPEG dans les uses.

Pour du gif :

J'ajoute l'unité rxGIF de rxlibrary, elle définit le type TGifImage (rxlibrary). On remplace le TJpegImage par un TGifImage.

Pour du bitmap :

Pour le cas du Bitmap, même chose, on remplace par un TBitmap.
À noter que sous Kylix, le TBitmap gère nativement le jpeg.

Le TidHTTP travaille en mode bloquant : l'application est bloquée pendant la récupération de l'image. Travailler avec un Tthread est alors nécessaire, ou alors, il faut utiliser les composants ICS. Une exception a lieu lorsque l'image n'est pas trouvée. Donc, pensez à protéger votre code par un try/except.

Mis à jour le 18 octobre 2013 nut62

Pour récupérer des liens sur une page HTML, il faut ouvrir une instance d'Internet Explorer et se servir des fonctions OLE disponibles

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure ListerLiens(List: TStrings; IEApp: OLEVariant; aURL:string);  
var  
  IEApp: OLEVariant;  
  nbLinks,i:Integer;  
begin  
  //Si l'objet OLE n'est pas créé  
  if(VarIsEmpty(IEApp))then  
  begin  
    //Créer l'objet OLE  
    IEApp := CreateOleObject('InternetExplorer.Application');  
    //Le rendre visible  
    IEApp.Visible := true;  
    //Ouvrir la page spécifiée pas aURL dans l'objet OLE  
    IEApp.Navigate(aURL);  
  end;  
  
    //Attendre que la page soit complètement chargée avec  
    // READYSTATE_COMPLETE = 4  
    while Cardinal(IEApp.readyState) <> 4 do sleep(1000);  
  
    // Récupérer le nombre de liens  
    nblinks := Cardinal(IEApp.Document.links.length);  
    //Ajouter le nombre de liens dans le TStrings  
    List.Add(Format('Nombre de liens = %d',[nblinks]));  
  
    // Ajoute les liens à la suite du TStrings  
    for i := 0 to nblinks - 1 do  
      Self.MemoLog.Lines.Add(string(IEApp.Document.links.item(i).href));  
end;
Pour cliquer sur les liens de cet instance de Internet Explorer, il suffit de faire :
Code delphi : Sélectionner tout
1
2
3
4
procedure CliqueLien(LinkIndex:Integer);  
begin  
  IEApp.Document.links.item(LinkIndex).click;  
end;

Mis à jour le 14 janvier 2014 Pedro

Nous vous proposons une méthode pour télécharger un fichier sans utiliser les composants Indy.

Voici la fonction :
Unités à placer dans vos clauses uses :

Code delphi : Sélectionner tout
use Classes, WinInet;
La fonction elle-même :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function TForm1.DownloadFileHttp(const fileURL,FileName: string):Boolean ; 
 const BufferSize = 1024; 
var hSession, hURL: HInternet; 
    Buffer: array[1..BufferSize] of Byte; 
    BufferLen: DWORD; 
    f: File; 
    sAppName: string; 
    FS:TFileStream; 
begin 
     Result   := False; 
     sAppName := ExtractFileName(Application.ExeName); 
  
     hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, 
	   'xxx_Login_Proxy_Nom Utilisateur_xxx', 'xxx_Login_Proxy_Mot_de_Passe_xxx', 0); 
  
     if FileExists(FileName) then DeleteFile(FileName); 
     FS:=TFileStream.Create(FileName,fmCreate); 
     try 
        hURL := InternetOpenURL(hSession, PChar(fileURL), nil,0,0,0); 
        try 
           repeat 
             InternetReadFile(hURL, @Buffer, BufferSize, BufferLen); 
             FS.WriteBuffer(Buffer, BufferLen); 
             Label1.Caption:=IntToStr(fs.Size); 
           until BufferLen = 0; 
           Result:=True; 
        finally 
          InternetCloseHandle(hURL) 
        end 
     finally 
         InternetCloseHandle(hSession); 
         FS.Free; 
     end 
end;

Mis à jour le 14 janvier 2014 LadyWasky

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2019 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -

Partenaire : Hébergement Web