IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Envoi d'un email


Sujet :

Web & réseau Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut Envoi d'un email
    Bonjour à tous,

    Pour les besoins de mon application j'ai besoin d'intégrer une procédure d'envoi d'email et étant un débutant dans ce sujet j'ai pris la première procédure que j'ai trouvée sur le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    var
      IdMessage: TIdMessage;
      IdSMTP: TIdSMTP;
      Message: TStrings;
      i: Integer;
    begin
      IdMessage := TIdMessage.Create(nil); //création dynamique du composant
      IdMessage.From.Address :=adrexp.Text;
     
      IdMessage.ReplyTo.Add.Address := adrexp.Text;
      IdMessage.Recipients.Add.Address := adrdes.Text;
     
      IdMessage.Subject := obj.text;
     
      IdMessage.ContentType := 'multipart/alternative'; 
     
      Message := texte.Lines;
     
      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;
     
       with TIdText.Create(IdMessage.MessageParts, Message) do
        ContentType := 'text/html';
     
      for i := 0 to lpj.Items.Count-1 do
        TIdAttachmentfile.Create(IdMessage.MessageParts, lpj.Items[i]);
     
      IdSMTP := TIdSMTP.Create(nil) ; //Création dynamique du composant
     
      IdSMTP.Port := 25; //Le port SMTP standard...
      IdSMTP.Host := sermes.Text;  //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;
    Mais il me signale une erreur "connect error to SMTP serveur 46.228..47.115 (46.228..47.115:25) connect error 10060

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    j'ai changer le port

    il me signale maintenant erreur " la connexion s'est fermer proprement"

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    la plupart des serveurs de messageries n'utilise plus le port 25 et utilisent un protocole sécurisé (TLS/SSL)
    Donc déjà il faudrait vérifier ce qu'il en est à propos de l'host

    voici le un petit programme sans prétention (le destinataire est fixe, le corps du message est rempli directement dans le composant idMessage1) qui me permet de tester les paramètres
    d'envoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    unit MainUnit;
    // Berlin 10.1
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdMessage,
      IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP,
      IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdIOHandler, IdIOHandlerSocket,
      IdIOHandlerStack;
     
    type
      TForm8 = class(TForm)
        Button1: TButton;
        IdSMTP1: TIdSMTP;
        IdMessage1: TIdMessage;
        Serveur: TEdit;
        Port: TEdit;
        Utilisateur: TEdit;
        PassWord: TEdit;
        TLS: TCheckBox;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form8: TForm8;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm8.Button1Click(Sender: TObject);
    begin
    idSMTP1.Host:=Serveur.Text;
    idSMTP1.Username:=Utilisateur.Text;
    idSMTP1.Password:=PassWord.Text;
    idSmtp1.Port:=StrToIntDef(port.Text,25);
    if TLS.Checked then idSmtp1.UseTLS:=utUseImplicitTLS
                   else idSmtp1.UseTLS:=utNoTLSSupport;
    try
    try
      idSMTP1.Connect;
      idSMTP1.Send(Idmessage1);
      showmessage('envoyé');
    except
      on E:Exception do
       Showmessage(E.Message);
    end;
    finally
      idSMTP1.Disconnect;
    end;
    end;
     
    end.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    comment vérifier si le host doit utiliser une TLS ou non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if TLS.Checked then idSmtp1.UseTLS:=utUseImplicitTLS
                   else idSmtp1.UseTLS:=utNoTLSSupport;////?!

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour ,

    J'ai integrer un composant IdssLIOhandlerSocketopenSSL que j'ai affecté à IdSMTP.IOHandler, et il me signale "erreur: la connexion s'est fermé correctement"!

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Tu dois aller plus loin sur ta connexion. Très peu de serveur SMTP acceptent la connexion sans login mdp. Cela évite que n'importe qui les contacte pour faire du spam.

    Voici un bloc permettant une connexion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
                IdSMTP1:= TIdSMTP.Create(Nil);
                IdSMTP1.AuthType := satDefault;    //Type d'authentification
                IdSMTP1.Host     := sServerSmtp;   //Hôte (par exemple : smtp.free.fr)
                IdSMTP1.Port     := iPortSmtp;     //Port (par exemple : 25)
                if bModeSecurise then
                begin
                   IdSMTP1.Username  := sUser; //Remplace par ton login
                   IdSMTP1.Password  := sPassword; //Remplace par ton mot de passe
                   IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
                   IdSMTP1.UseTLS    := utUseExplicitTLS;
                end;
                try
                   IdSMTP1.Connect; //Connexion
                except
                   on e : SysUtils.Exception do
                   begin
                      iResult := -1;
                      showmessage(e.message);
                      exit;
                   end;
                end;

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    j'ai tout fait comme vous l'avez indiquer sauf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     usetls:=utuseimplicittls
    C'est quoi la difference entre "utuseimplicittls et utuseexplicittls, aussi c'est quoi "bModeSecurise"?

  8. #8
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Bonjour,

    j'ai tout fait comme vous l'avez indiquer sauf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     usetls:=utuseimplicittls
    C'est quoi la difference entre "utuseimplicittls et utuseexplicittls, aussi c'est quoi "bModeSecurise"?
    Un lien expliquant les différences : http://www.indyproject.org/kb/index....betweentls.htm
    Le "bModeSecurise" est une variable que j'utilise pour activer l'encodage (boolean passé à une fonction), désolé j'aurais dû la virer. Mais comme je te l'ai dit très peu de serveurs autorise la connexion non sécurisé.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par chekkal Voir le message
    et il me signale "erreur: la connexion s'est fermé correctement"!
    Un grand classique de Indy

    Voici ma fonction d'envoie de mail
    note la capture de EIdConnClosedGracefully

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    //------------------------------------------------------------------------------
    function TSLTSMTP.SendTextStream(const AFrom, AReplyTo, ADest, ASubject: string; ATextStream: TStream; AFileNames: TStrings = nil; const ACC: string = ''; const ABCC: string = ''; ATextStreamEncoding: TEncoding = nil): Boolean;
    var
      IdMessage: TIdMessage;
      IdSMTP: TIdSMTP;
      I: Integer;
    begin
      Result := False;
      FLastErrorMessage := '';
     
      IdMessage := TIdMessage.Create(nil);
      try
        IdMessage.From.Address := AFrom;
        if AReplyTo <> '' then
          IdMessage.ReplyTo.EMailAddresses := AReplyTo
        else
          IdMessage.ReplyTo.EMailAddresses := AFrom;
        IdMessage.Recipients.EMailAddresses := ADest;
        IdMessage.Subject := ASubject;
     
        if ACC <> '' then
          IdMessage.CCList.EMailAddresses := ACC;
        if ABCC <> '' then
          IdMessage.BccList.EMailAddresses := ABCC;
     
        if ATextStreamEncoding = nil then
          ATextStreamEncoding := TEncoding.Default;
     
        if ATextStreamEncoding = TEncoding.ANSI then
        begin
          IdMessage.Encoding := meMIME;
          IdMessage.CharSet := 'ISO-8859-1';
        end;
     
        if Assigned(AFileNames) then
        begin
          IdMessage.ContentType := CONTENT_TYPE_TEXT_MPA;
     
          with TIdText.Create(IdMessage.MessageParts) do
          begin
            ContentType := CONTENT_TYPE_TEXT_PLAIN;
            if ATextStreamEncoding = TEncoding.ANSI then
              CharSet := 'ISO-8859-1';
            Body.LoadFromStream(ATextStream, ATextStreamEncoding);
          end;
     
          for I := 0 to AFileNames.Count - 1 do
            TIdAttachmentFile.Create(IdMessage.MessageParts, AFileNames.Strings[I]);
        end
        else
        begin
          IdMessage.ContentType := CONTENT_TYPE_TEXT_PLAIN;
          IdMessage.Body.LoadFromStream(ATextStream, ATextStreamEncoding);
        end;
     
        IdSMTP := TIdSMTP.Create(nil);
        try
          IdSMTP.Port := ConnectionInfo.Port;
          IdSMTP.Host := ConnectionInfo.Host;
          IdSMTP.ConnectTimeout := ConnectionInfo.ConnectTimeout;
          if (ConnectionInfo.User <> '') and (ConnectionInfo.Password <> '') then
          begin
            IdSMTP.AuthType := satDefault;
            IdSMTP.Username := ConnectionInfo.User;
            IdSMTP.Password := ConnectionInfo.Password;
          end
          else
            IdSMTP.AuthType := satNone;
     
          try
            IdSMTP.Connect();
            try
              IdSMTP.Send(IdMessage);
              Result := True;
            finally
              IdSMTP.Disconnect();
            end;
     
          except
            // Voir "connection closed gracefully" sur Developpez.net, Post Number 6248414
            // le développeur Indy a eu l'idée saugrenue de déclencher une exception EIdConnClosedGracefully en cas d'une connexion propre !
            on E: EIdConnClosedGracefully do
            begin
              FLastErrorMessage := E.Message;
              {$IFDEF DEBUG_SLT_SMTP}OutputDebugSMTP('SendTextStream : ' + E.Message);{$ENDIF DEBUG_SLT_SMTP}
            end;
            on E: Exception do
            begin
              FLastErrorMessage := E.Message;
              {$IFDEF DEBUG_SLT_SMTP}OutputDebugSMTP('SendTextStream : ' + E.Message);{$ENDIF DEBUG_SLT_SMTP}
              Result := False;
            end;
          end;
        finally
          IdSMTP.Free();
        end;
      finally
        IdMessage.Free();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour joc02 ,

    le document est en anglais, et moi je suis pas un grand connaisseur de la langue de Shakespeare.

    Bonjour ShaiLeTroll,

    c'est quoi IdSMTP.AuthType := satNone//satdefault;?
    C'est quoi "connectioninfo","CONTENT_TYPE_TEXT_PLAIN"?
    "EIdConnClosedGracefully" et "FLastErrorMessage" c'est quelle unité?
    Quel port utiliser? comment définir le host?....
    Je suis vraiment un débutant, et si quelqu'un peut me donner un exple simple d'envoi d'email avec pièce jointe ça serait formidable.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    j'ai modifié le code de cette maniére
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    var
      IdMsg: TIdMessage;                          
      IdIOHandler: TIdSSLIOHandlerSocketOpenSSL;  
      IdSmtp: TIdSMTP;                         
      i:byte;
    begin
     
      IdMsg := TIdMessage.Create(nil);
      idmsg.Date:=now;
      idmsg.Priority:=mpnormal;
     
      IdIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      IdIOHandler.SSLOptions.Method:=sslvtlsv1;
     
      IdSmtp := TIdSMTP.Create(nil);
      try
     
        IdMsg.ContentType := 'text/plain';
        IdMsg.From.Address := adrexp.Text; // 'email.emetteur@yahoo.com';
        IdMsg.ReplyTo.Add.Address :=adrexp.Text; // 'email.emetteur@yahoo.com';
        IdMsg.Recipients.Add.Text :=adrdes.Text; // 'email.destinataire@voila.fr';
     
        IdMsg.Subject :=obj.Text ;
        IdMsg.Body.AddStrings(texte.Lines);
       for i := 0 to lpj.Items.Count-1 do
        TIdAttachmentfile.Create(IdMsg.MessageParts, lpj.Items[i]);
        // Affectation du gestionnaire SSL
        IdSmtp.IOHandler := IdIOHandler;
     
        // Paramétrage du composant SMTP
     
        IdSmtp.Host :='SMTP.'+SERMES.Text;
        IdSmtp.Port :=strtoint(port.Text);
        case tls.ItemIndex of
        0:IdSmtp.UseTLS := utUseImplicitTLS;
        1:IdSmtp.UseTLS := utUseExplicitTLS;
        end;
        // Identifiant/mot de passe de connexion
       IF username1.text<>'' THEN IdSmtp.Username :=username1.text;
       IdSmtp.Password :=MOTEXP.Text ;
     
        // Connexion
        IdSmtp.Connect;
        try
          // Envoi
          IdSmtp.Send(IdMsg);
          SHOWMESSAGE('Envoi effectué!');
        finally
          // Déconnexion avec notification au serveur
          IdSmtp.Disconnect(True);
        end;
      finally
        // Libération des objets
        IdSmtp.Free;
        IdIOHandler.Free;
        IdMsg.Free;
    il signale erreur "username and password not accepted" malgré que l'adresse email et le mot de passe sont correcte

Discussions similaires

  1. Envoi d'un email sans passer par outlook
    Par mosquitout dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/12/2005, 19h23
  2. envoi automatique d'email
    Par zorba49 dans le forum ASP
    Réponses: 3
    Dernier message: 20/12/2005, 13h43
  3. Envoi Formulaire par Email, la soupe...!
    Par ni31x dans le forum Langage
    Réponses: 14
    Dernier message: 19/12/2005, 22h04
  4. envoi automatique d'email
    Par zorba49 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/12/2005, 15h39
  5. Envoie de l'email par le composant TIdSMTP
    Par C-H-A-P-L-A-S-T dans le forum Composants VCL
    Réponses: 23
    Dernier message: 01/12/2005, 08h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo