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 :

Erreur envoi Mail avec Delphi 10


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 476
    Par défaut
    Bonjour Serge,

    j'ai trouvé ceci sur le net, mais je n'ai pas testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Accusé de réception
    if checkbox1.Checked then
      begin
        idmessage.ReceiptRecipient.Address:='Expediteur@provider.com';
        idmessage.Headers.Add('disposition-notification-to: <'+Expediteur@provider.com+'>');
      end;
    A+
    Charly

  2. #2
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 339
    Par défaut
    [B] Merci Sergio pour ton aide précieuse[B]

    [QUOTE j'avais pourtant écrit
    au préalable il faut bien évidemment mettre ces bibliothèques soient copiées soit dans le répertoire de l'application selon la cible du programme
    ou, pour windows installer les versions adhoc dans le cas de windows 64 dans System32 on met celles en 64 et dans syswow64 celles en 32 (oui je sais MS est étrange parfois ][/QUOTE]

    Bah, je suis confus mdr! je ne vais certainement pas critiquer quelqu'un qui m'aide à réfléchir!... Mais à force d'essayer des trucs je finis par oublier.

    Beaucoup de paramètres possibles ne sont pas testés, entre les paramètres de SSLIOHandler et ceux de IdSmtp les combinaisons sont nombreuses
    Oui, c'est clair! Je regrette le temps de notre VCL limitée qui nous faisait quand même passer quelques heures de recherche quand on avait besoin de trouver un truc spécifique...
    Mais bon, l'outil puissant qu'est devenu Delphi demande beaucoup de rigueur et de connaissances dès qu'on veut du fiable... On devrait inciter des vocations de formateurs pour des stages pour des gens comme moi qui aimeraient approfondir! Les stages sont réservés à des pro et financer par des entreprises. Moi je suis prêt à me former si c'est pas trop cher et sérieux! A part Colibri, je ne vois personne qui propose des formations pour passionnés. avis aux amateurs.

    Revenons à notre sujet:

    J'avais justement dans l'idée de reprendre tout à zéro d'une part et d'autre part d'essayer ce code qui marche chez certains d'entre vous et de l'adapter pour différentes adresse mails. J'ai trouvé ce tableau sur la toile ICI:

    Nom : Protocole-SMTP.png
Affichages : 600
Taille : 34,1 Ko

    J'étudie ton code Sergio et je reviens vers vous plus tard!
    Je crois qu'effectivement, un bon départ serait de capter toutes les erreurs possibles (codes d'erreur) des serveurs... ça permettrait de circonscrire rapidement l'origine du problème!
    A+
    jlmat

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par Jlmat Voir le message
    Les stages sont réservés à des pro et financer par des entreprises. Moi je suis prêt à me former si c'est pas trop cher et sérieux! A part Colibri, je ne vois personne qui propose des formations pour passionnés. avis aux amateurs.
    Il m'arrive d'en faire, tant que je n'ai pas à me déplacer ! j'ai déjà fait quelques cours "on-line" via TeamViewer (ou autre truc du même genre) avec Skype au besoin pour porter la voix. Et je ne suis pas cher sauf que, ayant abandonné mon activité d'indépendant => plus de facturation mais, à défaut de numéraitre, j'accepte tous les "pots de vin :pizza: ... "
    C'est plus une question de temps dispo qui me manque (encore 4 ans et 5 mois de full time)

    Si non, bien vérifier les versions de TLS. Il y a aussi un sujet en cours ici

  4. #4
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 476
    Par défaut
    Bonjour,

    bon, après moult essais et recherche sur le web, cette fonction ne marche pas trop mal, avec D10.3 (LblThread est un TLabel). Elle permet l'envoi en mode txt ou Html avec ou sans fichier joint :

    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
    { ===================================================================== }
    Function TF_Mail.SendEmailIndy(
        const SMTPServer: string;   // Adresse IP ou nom du serveur SMTP (ex : smtp.orange.fr)
        const FromName : String;    // Nom de l'expéditeur  (facultatif)
        const FromAddress: string;  // Adresse mail de l'expéditeur
        const ToAddresses: string;  // Liste des adresses des destinataires séparés par des virgules
        const CCAddresses: string;  // Liste des adresses des destinataires en copie séparés par des virgules
        const BCCAddresses: string; // Liste des adresses des destinataires en copie cachée séparés par des virgules
        const Port1  : Integer ;    // port Smtp pour l'envoi Ex : 25
        const User1  : String ;     // Adresse de l'expéditeur enregistré sur le serveur SMTP ( = FromAdress en général)
        const Pswd1  : String ;     // Mot de passe de cet expéditeur
        const Subject: string;      // Objet du mail
        const EmailBody: string;    // Corps du mail
        const IsBodyHtml: Boolean;  // texte en HTML ?
        const Fichier   : String ) : Boolean ; //  Fichier à mettre en PJ
    var
      smtp: TIdSMTP;                   // Uses IdSmtp
      msg: TidMessage;                 // Uses IdMessage
      builder: TIdMessageBuilderHtml;  // Uses IdMessageBuilder
    Begin
      Result := False ;
      LblThread.Caption := ' .... ' ;
      msg := TidMessage.Create(nil);
      try
        builder := TIdMessageBuilderHtml.Create;
        try
          if IsBodyHtml then
            begin
              builder.Html.Text := EmailBody;
              builder.HtmlCharSet := 'utf-8';
              builder.HtmlContentTransfer := 'quoted-printable';
            end
          Else
            begin
              builder.PlainText.Text := EmailBody;
              builder.PlainTextCharSet := 'utf-8';
              builder.PlainTextContentTransfer := 'quoted-printable';
            end;
     
          if Fichier <> '' then
            begin
              builder.Attachments.Add(Fichier);
            end;
     
          builder.FillMessage(msg);
        finally
          builder.Free;
        end;
     
        msg.From.Name := FromName;
        msg.From.Address := FromAddress;
        msg.Subject := Subject;
     
        msg.Recipients.EmailAddresses := ToAddresses;
        msg.CCList.EmailAddresses := CCAddresses;
        msg.BccList.EmailAddresses := BCCAddresses;
     
        smtp := TIdSMTP.Create(nil);
        try
          smtp.Host     := SMTPServer ;
          Smtp.UseTLS   := utNoTLSSupport ;
          smtp.Port     := Port1 ;
          smtp.Username := User1 ;
          smtp.Password := Pswd1 ;
          smtp.AuthType := satDefault ;
     
          SMTP.Connect;
     
          try
            SMTP.Send(msg);
            LblThread.Caption := 'Le message à '+ToAddresses+' a été envoyé' ;
            Result := True ;
          except
            LblThread.Caption := 'Erreur : E-mail non envoyé' ;
          end;
           SMTP.Disconnect;
          except
           LblThread.Caption := 'Erreur : Impossible de se connecter au serveur SMTP';
          end;
     Except
       LblThread.Caption := 'Erreur : Impossible de créer le message';
     End ;
    end;
    { ========================================================================== }
    mais comme avec le serveur d'Orange il y a parfois des échecs d'envois, je l'utilise comme ceci dans une boucle :

    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
    { ===================================================================== }
    procedure TF_Mail.Button4Click(Sender: TObject);
    Const
      NbMax = 3 ;
    Var
      Nb : Integer ;
      Ok : Boolean ;
    begin
      Nb := 0 ;
      while ((not Ok) And (Nb < NbMax)) do
        Begin
          Nb := Nb + 1 ;
          Ok := SendEmailIndy(
                  edServeur.Text,
                  edNom.Text, edSender.Text,
                  edTo.Text,
                  EdCC.Text,
                  EdBCC.Text,
                  StrToInt(EdPort.Text) ,
                  EdLogin.text ,
                  EdPassword.text ,
                  edObject.Text,
                  Memo.Text,
                  False,
                  EdPJ.Text ) ;
        End;
      if Ok then
        Vcl.Dialogs.MessageDlg('Message envoyé - Essai : '+IntToStr(Nb), mtInformation,
          [mbOk], 0, mbOk)
      Else
        Vcl.Dialogs.MessageDlg('Message non envoyé - Essai : '+IntToStr(Nb), mtInformation,
          [mbOk], 0, mbOk) ;
    End ;
    { ===================================================================== }
    Avec mon smtp orange, mon email, le port 25, et mon Pswd de messagerie, cela fonctionne au premier ou deuxieme essai.

    J'espère que cela pourra être utile.

    A+
    Charly

  5. #5
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 339
    Par défaut
    Bon j'ai testé hier soir, mais j'ai oublié de poster le message. Du coup, je reprends rapidement avant que je n'oublie :

    En testant le code de Sergio, j'obtiens l'erreur : E-mail non envoyé, ce qui sous entant que le code se connecte!
    Comme mon erreur plantait dans l'unité IdReplySMTP, j'ai cherché à exporer quelques codes d'erreurs de cette unité définies à la ligne 180:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      EIdSMTPReply = class(EIdException);
      EIdSMTPReplyInvalidReplyString = class(EIdSMTPReply);
      EIdSMTPReplyInvalidClass = class(EIdSMTPReply);
    J'ai ajouté à uses l'unité IdReplySMTP
    Le débogueur prend le devant chez moi sur le processus try...except du code, j'ai donc décoché cette option de manière à obliger le code à gérer les exceptions lui-même.
    voici le code de Sergio que j'ai modifié pour la circonstance:

    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
      try
        idSMTP1.Connect;
        try
          idSMTP1.Send(idMessage1);
          Memo1.Lines.Add('SMTP Ok , message envoyé');
        except
          on EIdSMTPReplyInvalidReplyString do ShowMessage('EIdSMTPReply ER 1 =>  E-mail non envoyé');
          on EIdSMTPReplyInvalidClass do ShowMessage('EIdSMTPReply ER 2 =>  E-mail non envoyé');
          on EIdSMTPReply do ShowMessage('EIdSMTPReply ER 0 =>  E-mail non envoyé');
          // Memo1.Lines.Add('E-mail non envoyé');
        end;
        idSMTP1.Disconnect;
      except
        Memo1.Lines.Add('Impossible de se connecter au serveur SMTP');
      end;
    J'obtiens cette fois l'erreur :Impossible de se connecter au serveur SMTP, ce qui sous entend que le code ne trouve pas les erreurs de EIdSMTPReply

    Bon ben à suivre, je vais essayer de trouver d'autres erreurs à détecter!... y'en a un paquet, mais pas évident de les explorer.

    A+

  6. #6
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 339
    Par défaut
    merci Charly pour ta contribution!

    Heu, petite question basique:

    Mon projet ne trouve pas directement l'unité IdMessageBuilder.pas qui se trouve cependant dans le répertoire Studio\20.0\Indy10\protocols\

    Que me recommandez-vous de faire?
    1. Ajouter le chemin de l'unité IdMessageBuilder.pas dans Projet\Options\Compilateur delphi\Chemin de recherche.
    Je l'ai fait mais apparemment le compilateur ne trouve toujours pas l'unité en question?!? Y a t-il un alias ou autre subtilité à mettre?
    2. Mettre directement la version dcu dans le répertoire Exe?

    Pour l'instant, je suis dans les tests, je peux aussi mettre directement l'unité dans les sources de mon répertoire, mais ça n'est pas très propre comme méthode! Lol

    Il est indiqué sur le forum de orange (mais pas que) que le port 25 n'est pas recommandé, qu'il est souvent relégué vers les indésirables par le serveur. Tu as essayé avec le port 465? as-tu constaté une différence?

    A Sergio à propos de formation, oui OK pour mais quand même, 4 ans, c'est trop long
    ...

    A+
    jlmat

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par Jlmat Voir le message
    à propos de formation, oui OK pour mais quand même, 4 ans, c'est trop long
    À qui le dis-tu ! Sainte CARSAT n'est pas facile à satisfaire
    Enfin il reste les samedis et dimanches (matin) et les quelques vacances et ponts (MP pour plus d'infos)

    Il est indiqué sur le forum de orange (mais pas que) que le port 25 n'est pas recommandé, qu'il est souvent relégué vers les indésirables par le serveur.
    je n'arrête pas de le dire

    Autre propriété de IdSSLIOHandler à vérifier SSLOptions.Method = sslvSSLv23 ce qui permet de balayer des différents certificats
    et un évènement utile OnStatusInfo ou OnStatusInfoEx qui permet de "visualiser" la "négociation"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm7.IdSSLIOHandlerSocketOpenSSL1StatusInfo(AMsg: string);
    begin
    memo1.lines.Add(AMsg);
    end;

  8. #8
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 476
    Par défaut
    Bonjour,

    Pour IdMessageBuilder, je ne sais pas avec mon D10.3 community Edition, et une installation Standard, je n'ai pas eu ce problème, l'unité IdMessageBuilder, a tété reconnue sans problème.
    Tu peux mettre IdMessageBuilder.pas dans le répertoire de ton projet et l'ajouter, mais je ne pense pas que ce soit une bonne solution, car ce n'est pas très propre et cela peut entrainer d'autres dépendances. Il searit surement mieux d'ajouter le chemin aux options de Delphi (ou ? bibliothèques ? je ne sais pas)

    Sinon je suis un peu désespéré car ce matin, avec mon code échec total d'envoi sur 10 essais au moins (avec les ports 25, 465 ou 597) !

    Cet après midi cela passe un peu mieux (1 sur 2 ou 3 !) avec le port 25.

    j'envoie de mon adresse orange, (serveur smtp.orange.fr) avec comme expéditeur et identifiant mon adresse mail orange, et mon password de messagerie vers mon adresse gmx.fr

    Tout cela est très aléatoire et je ne suis pas assez compétent pour savoir pourquoi !

    C'est dommage, car ce n'est pas fiable et je vais abandonner l'idée d'envoyer des mails depuis ma petite application de type contact

    A+
    Charly

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Étrange, j'ai testé plusieurs fois (à différentes heures) orange sans aucun souci d'envoi

  10. #10
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 476
    Par défaut
    Bonjour Serge,

    avec quel port testes tu ? 25, 465 ou 587 ? (avec ou sans identifiant et Pswd ?

    A+
    Charly

  11. #11
    Membre éclairé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Par défaut
    Bonjour,

    je mets le lien de cette discussion au cas où :

    https://www.developpez.net/forums/d1...ant-hyperlien/

    et un code qui fonctionne avec orange sous Delphi 7 et Indy10.

    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
     
    procedure TFAlerte.SendMail;
    var
      MonTexte: string;
    begin
      cxmemo1.Lines.Clear;
      idSmtp1.Host := 'smtp.orange.fr';
      idsmtp1.Port := 25;
      IdMessage1.Clear;
      IdMessage1.From.Text := 'robot@domaine.fr';
      IdMessage1.ReplyTo.EMailAddresses := 'DeMail@orange.fr';
      IdMessage1.Recipients.EMailAddresses := 'AMail@orange.fr';
      IdMessage1.Date := Now;
      IdMessage1.Subject := 'TEST';
      idmessage1.ContentType := 'text/plain';
      MonTexte := 'tester les accents, rêvé, donné';
      MonTexte := UTF8Encode(MonTexte);
      idmessage1.Body.Text := MonTexte;
     
    //  idmessage1.Body.Text := '<a href="https://www.google.fr">CLICK ME</a>';
     
      try
        idSMTP1.Connect;
        idSMTP1.Send(idMessage1);
        idSMTP1.Disconnect;
        cxMemo1.Lines.Add('SMTP Ok , message envoyé');
      except
        cxMemo1.Lines.Add('Impossible de se connecter au serveur SMTP. E-mail non envoyé');
      end;
    end;
    @+

  12. #12
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 476
    Par défaut
    Merci Cantador,

    j'ai suivi le fil de cette discussion, mais comme jlmat, je cherchais à envoyer des mails avec D10.3 - ça marche maintenant assez bien, même si parfois j'ai encore des ratés. Je ne sais pas pourquoi.

    quand ça marche bien j'arrive à envoyer avec le port 25 sans TLS ou avec le port 465 avec TLS, et avec ou sans PJ.

    Pour Info, voici mon code :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    { ===================================================================== }
    procedure TF_Mail.Button4Click(Sender: TObject);
    Const
      NbMax = 3 ;  // Nombre maxi d'essai d'envois
    Var
      Nb     : Integer ;
      Ok     : Boolean ;
      Heure1 : TDateTime ;
      Heure2 : TDateTime ;
      Delta  : TDateTime ;
    begin
      // Il faut déposer plusieurs TLabel sur la fiche (  Lbl_Mess, LblThread, Lbl_Time)
      Nb := 0 ;
      Ok := False ;
      while ((not Ok) And (Nb < NbMax)) do
        Begin
          Heure1 := Time ;
          Nb := Nb + 1 ;
          Application.ProcessMessages ;
          Lbl_Nb.Caption := 'Essai n° '+ InttoStr(Nb) ;
          Application.ProcessMessages ;
     
          SMTPServer2   := edServeur.Text ;        // Adresse IP ou nom du serveur SMTP (ex : smtp.orange.fr)
          FromName2     := edNom.Text ;            // Nom de l'expéditeur  (facultatif)
          FromAddress2  := edSender.Text ;         // Adresse mail de l'expéditeur
          ToAddresses2  := edTo.Text ;             // Liste des adresses des destinataires séparés par des virgules
          CCAddresses2  := EdCC.Text ;             // Liste des adresses des destinataires en copie séparés par des virgules
          BCCAddresses2 := EdBCC.Text ;            // Liste des adresses des destinataires en copie cachée séparés par des virgules
          Port12        := StrToInt(EdPort.Text) ; // port Smtp pour l'envoi Ex : 25
          User12        := EdLogin.text ;          // Adresse de l'expéditeur enregistré sur le serveur SMTP ( = FromAdress en général)
          Pswd12        := EdPassword.text ;       // Mot de passe de cet expéditeur
          Subject2      := edObject.Text ;         // Objet du mail
          EmailBody2    := Memo.Text ;             // Corps du mail
          IsBodyHtml2   := False ;                 // texte en HTML ?
          Fichier2      := EdPJ.Text ;             // Fichier à mettre en PJ
     
          Ok := SendEmailIndy(
                  SMTPServer2,
                  FromName2,
                  FromAddress2,
                  ToAddresses2,
                  CCAddresses2,
                  BCCAddresses2,
                  Port12,
                  User12,
                  Pswd12,
                  Subject2,
                  EmailBody2,
                  IsBodyHtml2,
                  Fichier2) ;
          Heure2 := Time ;
          Delta  := Heure2 - Heure1 ;
          lbl_Time.Caption := 'Temps écoulé : '+ TimeToStr(Delta)+' (Essai précédent)' ;
        End;
      if Ok then
        Vcl.Dialogs.MessageDlg('Message envoyé - Essai : '+IntToStr(Nb), mtInformation,
          [mbOk], 0, mbOk)
      Else
        Vcl.Dialogs.MessageDlg('Message non envoyé - Essai : '+IntToStr(Nb), mtInformation,
          [mbOk], 0, mbOk) ;
    End ;
    { ===================================================================== }
    Function TF_Mail.SendEmailIndy(
        const SMTPServer: string;   // Adresse IP ou nom du serveur SMTP (ex : smtp.orange.fr)
        const FromName : String;    // Nom de l'expéditeur  (facultatif)
        const FromAddress: string;  // Adresse mail de l'expéditeur
        const ToAddresses: string;  // Liste des adresses des destinataires séparés par des virgules
        const CCAddresses: string;  // Liste des adresses des destinataires en copie séparés par des virgules
        const BCCAddresses: string; // Liste des adresses des destinataires en copie cachée séparés par des virgules
        const Port1  : Integer ;    // port Smtp pour l'envoi Ex : 25
        const User1  : String ;     // Adresse de l'expéditeur enregistré sur le serveur SMTP ( = FromAdress en général)
        const Pswd1  : String ;     // Mot de passe de cet expéditeur
        const Subject: string;      // Objet du mail
        const EmailBody: string;    // Corps du mail
        const IsBodyHtml: Boolean;  // texte en HTML ?
        const Fichier   : String ) : Boolean ; //  Fichier à mettre en PJ
    var
      SMTP: TIdSMTP;                   // Uses IdSmtp
      msg: TidMessage;                 // Uses IdMessage
      builder: TIdMessageBuilderHtml;  // Uses IdMessageBuilder
    //  IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
     
    Begin
      if Test2 then  Memo1.Clear ;
     
      Result := False ;
      LblThread.Caption := ' .... ' ;
      msg := TidMessage.Create(nil);
      try
        builder := TIdMessageBuilderHtml.Create;
     //   IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
     
        try
          if IsBodyHtml then
            begin
              builder.Html.Text := EmailBody;
              builder.HtmlCharSet := 'utf-8';
              builder.HtmlContentTransfer := 'quoted-printable';
            end
          Else
            begin
              builder.PlainText.Text := EmailBody;
              builder.PlainTextCharSet := 'utf-8';
              builder.PlainTextContentTransfer := 'quoted-printable';
            end;
          F_Mail.Lbl_Mess.Caption := 'Corps du message construit' ;
          Application.ProcessMessages ;
          if Fichier <> '' then
            begin
              builder.Attachments.Add(Fichier);
          F_Mail.Lbl_Mess.Caption := 'Fichier joint' ;
          Application.ProcessMessages ;
            end;
     
          builder.FillMessage(msg);
        finally
          builder.Free;
        end;
     
           F_Mail.Lbl_Mess.Caption := 'Fin du builder' ;
          Application.ProcessMessages ;
        msg.From.Name := FromName;
        msg.From.Address := FromAddress;
        msg.Subject := Subject;
     
        msg.Recipients.EmailAddresses := ToAddresses;
        msg.CCList.EmailAddresses := CCAddresses;
        msg.BccList.EmailAddresses := BCCAddresses;
     
        smtp := TIdSMTP.Create(nil);
        try
           SMTP.Host     := SMTPServer ;
           SMTP.Port     := Port1 ;
           SMTP.Username := User1 ;
           SMTP.Password := Pswd1 ;
           SMTP.AuthType := satDefault ;
     
     //     SMTP.IOHandler := IdSSLIOHandlerSocket;
           SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1 ;
           if useTLS.Checked then
              begin
                SMTP.UseTLS:=utUseImplicitTLS; // 1
                SMTP.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
              end
            else
              begin
                SMTP.UseTLS:=utNoTLSSupport; // 0
              End ;
     
          SMTP.Connect;
          F_Mail.Lbl_Mess.Caption := 'Serveur SMTP connecté' ;
          Application.ProcessMessages ;
     
          try
            SMTP.Send(msg);
            LblThread.Caption := 'Le message à '+ToAddresses+' a été envoyé' ;
            Result := True ;
          F_Mail.Lbl_Mess.Caption := 'Message envoyé' ;
          Application.ProcessMessages ;
     
          except
            LblThread.Caption := 'Erreur : E-mail non envoyé' ;
          end;
           SMTP.Disconnect;
          except
           LblThread.Caption := 'Erreur : Impossible de se connecter au serveur SMTP';
          end;
     Except
       LblThread.Caption := 'Erreur : Impossible de créer le message';
     End ;
     // Ajout
    //      IdSSLIOHandlerSocket.free ;     //  J'ai enlevé le create car ça plante
                                            //  j'ai déposé le composant IdSSLIOHandlerSocketOpenSSL1 sur la fiche
                                            //  et la méthode onStatusInfoEx  est ci-dessous
    end;
    { ===================================================================== }
     procedure TF_Mail.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
      const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
      AMsg: string);
    begin
      // Test2 est une constante à True si on veux écrire dans Memo1
      if Test2  then memo1.lines.Add(AMsg);
    end;
    { ========================================================================== }
    A+
    Charly

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 113
    Par défaut
    Bonjour

    Sous Delphi 10.2. Tokyo, j'éprouve aussi des problèmes, avec l'envoi de mail, avec la méthode de Robin Valtot. Selon l'OS, selon l'OS sur lequel je compile...

    Y a 15 ans, avec MAPI, ça marchait très bien. Maintenant, avec l'arrivée de la sécurité, SSL, l'abandon des protocoles non sécurisés, l'envoi du mail devient aléatoire.
    Je n'ai trouvé aucune méthode qui fonctionne à 100% sous Windows 7, Win10...etc..

    Solution : Je propose donc au client ( dans mon application ) 3 méthodes d'envoi de mail : MAPI + SMTP ( Robin V. ) + avec Outlook express.

    et mon dialogue mémorise tout ça...Donc le client test la 1ère fois, puis c'est mémorisé...

    Bon ok, ce n'est pas pas " top ", mais je n'ai pas trouvé mieux, pour proposer un envoi natif de mail avec PJ directement depuis mon appli...

    RQ : C'est quand même " dingue " que en 2019, avec un Delphi à 1200 €, un windows 7 ou 10, un développeur n'a aucune méthode fiable pour envoyer un simple email...
    Ha les joies de la programmation...toujours évoluer...toujours adapter...


    Pascal

Discussions similaires

  1. [Delphi 7] Envoi mail avec Delphi
    Par Oncle_Pete dans le forum Web & réseau
    Réponses: 6
    Dernier message: 06/05/2012, 11h30
  2. erreur envoi mail avec CDO
    Par bambino13 dans le forum ASP
    Réponses: 2
    Dernier message: 26/08/2009, 16h19
  3. Erreur envoi mail avec phpmailer (fichier joint)
    Par rhadien dans le forum Langage
    Réponses: 1
    Dernier message: 02/07/2008, 10h23

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