FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 933, dernière mise à jour : 28 septembre 2024 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.
- Comment savoir si on est connecté à Internet ou pas ?
- Comment envoyer un e-mail ?
- Comment récupérer les informations d'un client mail ?
- Comment charger une image depuis internet ?
- Comment récuperer les liens dans une page HTML avec IE et simuler un clic sur un de ces liens ?
- Comment télécharger un fichier en http sans utiliser Indy ?
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; |
Ceci ne fonctionne pas pour une connexion par LAN.
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; |
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 ; |
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; |
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; |
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.
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; |
Code delphi : | Sélectionner tout |
1 2 3 4 | procedure CliqueLien(LinkIndex:Integer); begin IEApp.Document.links.item(LinkIndex).click; end; |
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;
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; |
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 çaLes 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 © 2024 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.