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

  1. #1
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut Erreur envoi Mail avec Delphi 10
    Bonjour,

    Je m'essaye dans l'envoi d'un mail en reprenant le code du tutorial de https://robin-valtot.developpez.com/...s-avec-delphi/ de Robin Valtot qui m'a paru bien rédigé. mais il me manque le A du ABC pour vraiment comprendre!

    (je suis sous Delphi 10.3 communauty Edition)

    A l'exécution, j'obtiens J'obtiens la réponse suivante:
    Nom : img erreur message 1.png
Affichages : 1090
Taille : 7,0 Ko

    En fait, je ne comprends pas trop comment ça marche:

    Questions

    1. Est-ce que à Expéditeur, on peut mettre n'importe quelle adresse mail que l'on possède?
    2. Si oui à la première question, que dois-je mettre à identifiant?
    3. Est-ce que le mot de passe est celui de la messagerie de l'expéditeur?

    J'avoue ne pas avoir trouvé de réponse sur les forums ou tutoriaux parcourus

    Bien à vous
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    j'ai essayé la même chose de mon coté.

    j'arrive à envoyer des messages avec mon adresse mail orange et le serveur smtp.orange.fr sans authentification avec le port 25 vers une autre de mes adresse mail, ou bien avec le port 465 en indiquant comme identifiant mon adresse orange et mon mot de passe de messagerie.

    Mais le résultat est aléatoire : parfois le mail est envoyé rapidement, parfois l'envoi échoue au bout d'un temps assez long. Je ne comprends pas pourquoi !

    Si quelqu'un a des éclaircissements, cela m'intéresse aussi.

    A+
    Charly

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Heureusement que Charly a répondu car hier soir bien qu'ayant lu le post j'étais trop crevé pour y répondre, du coup la discussion était passée sous mon radar ce matin
    Citation Envoyé par Jlmat Voir le message
    Questions

    1. Est-ce qu’à Expéditeur, on peut mettre n'importe quelle adresse mail que l'on possède?
    2. Si oui à la première question, que dois-je mettre à identifiant?
    3. Est-ce que le mot de passe est celui de la messagerie de l'expéditeur?
    1 - oui, à partir du moment où le fournisseur permet le smtp
    2 - cela dépend du fournisseur
    3 - en général oui
    Donc, cela dépend beaucoup du fournisseur de messagerie donc il faut un peu fouiller sur internet par exemple ici pour obtenir les ports, mais aussi sur le site du fournisseur surtout concernant le point 2 certains fournisseurs demandent l'adresse mail complète d'autre juste la première partie de l'adresse etc..
    Toujours privilégié un port avec authentification, le port 25 est trop sujet à "crise"
    par crise j'entends blocages du fournisseur, du fournisseur du destinataire, etc. sans parler de leurs anti-spams à la c.n (par exemple essayez d'envoyer un mail de laposte.net vers google.com => direct spam quand ce n'est pas destruction).

    D'ailleurs si quelqu'un sait comment ajouter un certificat à un mail (et même obtenir des certificats gratuits ) je suis preneur

    J'ai remis ici https://www.developpez.net/forums/d1.../#post10691087 un bout de code qui fonctionne depuis des années (j'ai dû le mettre dans d'autres endroits mais c'est le dernier dont je me souvienne)
    bien sûr ce code qui est un programme test demande à saisir les informations mais rien n'empêche de mettre dans un fichier ini (ou autre) les valeurs

    pour ce programme il fallait ssl donc pour construire mon message les composants
    idsmtp, idssliohandlersocketopenSSL, et idmessage et donc les dlls pour le ssl
    J'ai cru comprendre qu'avec la version Rio certaines choses concernant le SSL mais je n'ai pas encore fait de recherche à ce sujet (un truc qui fonctionne depuis 2010 pourquoi changer )
    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 expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    avec D10.3, ton code ne compile pas chez moi :

    [dcc32 Erreur] uFormEmail.pas(145): E2003 Identificateur non déclaré : 'TIdMessage'

    j'ai pourtant ajouté TidMessage depuis la palette des composants sur ma Form. Normalement, la clause Uses aurait du être mise à jour ?

    A+
    Charly

    PS : mon OS est 64 bits, mais je développe une appli 32 bits. Je suppose que c'est les Dll 32 bits que je dois mettre dans le répertoire de mon exe ? (ssleay32.dll et libeay32.dll)

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Re,

    j'ai repris le code sous rio
    Nom : Capture.PNG
Affichages : 1246
Taille : 6,1 Ko
    voir zip
    petite note, pour laposte.net l'utilisateur c'est monadressemail quand l'adresse mail est monadressmail@laposte.net

    Bien sûr je ne vous fournis pas le fichier Ini et je n'ai pas mis de onclose qui permet de sauvegarder le fichier ini
    Je n'ai pratiquement pas fait de changement par rapport à D2010 , j'avais cru comprendre ou lire qu'il y avait des améliorations pour le ssl (intégration), j'ai dû me gourer, me reprendra celui qui aurait de meilleures infos

    pour information j'ai créé le programme de la manière suivante :
    j'ai ouvert sur mon nouveau poste ma version Rio + nouvelle application VCL
    je me suis connecté à mon ancien poste via TightVNC, ouvert mon D2010 et fait des opérations de copier/coller d'abord des composants puis du code
    Deux petites modifs de code et une compilation, vous avez le résultat plus haut


    PS : mon OS est 64 bits, mais je développe une appli 32 bits.
    Je suppose que c'est les Dll 32 bits que je dois mettre dans le répertoire de mon exe ? (ssleay32.dll et libeay32.dll)
    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 )
    Fichiers attachés Fichiers attachés
    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

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour Serge,

    désolé, je m'était un peu mélangé les pinceaux avec les Uses ! ça compile, mais en cochant TSL j'ai l'erreur :

    Erreur SSL IOHandler
    nécessaire pour le paramétrage

    Je vais tester ton zip

    A+
    Charly

  7. #7
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Bonjour les amis,

    Je vous remercie pour vos réponses détaillées et documentées... C'est un vrai plaisir de travailler sur ce forum!
    Je suis sur d'autres dossiers ces jours-ci, mais je me penche sur le problème dès ce WE...
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    j'ai réessayé avec le logiciel de Robin Valtot. Avec :

    Exp : monMail@orange.fr
    Dest: MonMail@gmx.fr
    Serveur smtp : smtp.orange.fr
    Port : 25
    identifiant : vide
    Password : vide

    sur 4 tests successifs : 3 envoi Ok et 1 manqué

    et avec identifiant :

    Exp : monMail@orange.fr
    Dest: MonMail@gmx.fr
    Serveur smtp : smtp.orange.fr
    Port : 465
    identifiant : monMail@orange.fr
    Password : Mon Mot de Passe de Messagerie Orange

    sur 2 essais successifs : 1 envoi Ok et un manqué

    (Tous mes essais ont même message et même objet mais numérotés)

    Bref, cela reste un peu aléatoire !! je ne sais pas pourquoi (firewall ZoneAlarm ?, Serveur Orange ?)

    A+
    Charly

    PS : je n'ai pas réussi à faire fonctionner le petit logiciel de Serge. Les envois échouent

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    c'est vrai que je n'ai pas testé avec smtp.orange.fr et il y a beaucoup de paramètres qui ne sont pas pris en compte dans ce petit programmes : types de protocole SSL, valeurs de Use TLS (j'en ai pris qu'une)

    j'ai essayé avec succès :
    laposte.net (mon image)
    OVH (ssl0.ovh.net port 465, USETLS , utilisateur contact%mondomaine.com mail contact@mondomaine.com)
    orange (smtp.orange.fr, port 465, UseTLS, utilisateur monadresse@orange.fr mail monadresse@orange.fr) étrangement hier ça ne fonctionnait pas !

    Gmail non, google ne reconnait pas le poste qui envoie le message et m'envoie une alerte de sécurité
    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

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    oui, le smtp.orange.fr semble aléatoire ! (port 25 et même port 465 sécurisé)

    A+
    Charly

  11. #11
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Bonsoir, effectivement nous avions déjà eu des soucis avec certains FAI

    Il est rare que l'envoi anonyme (sans login/mot de passe) soit autorisé et je trouve bizarre que cela fonctionne sous orange, ça veut dire que l'on peut envoyer avec n'importe quel destinataire, au bout d'un moment le serveur SMTP bloque peut être..

    Après il faut distinguer les erreurs d'envoies (exception) et les mails non reçu (à la main du serveur SMTP normalement)

    Sinon pour Outlook il y a pas mal de règle, de mémoire 60 mails max à la minute

    Tu as mis quoi comme adresse du serveur smtp ? tu utilises un office365 ?
    Pour outlook :
    - expediteur doit être égal à identifiant (ton email)
    - renseigner le mot de passe de ton compte de messagerie

    A+
    Robin

  12. #12
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Hello,

    Après de multiples essais infructueux ce WE avec le test de Sergio et autres exemples trouvés, je me suis plongé dans la théorie pour comprendre tout ce charabia...
    La difficulté vient de la grande quantité d'exemples de codes écrit dans différentes versions de Delphi. Aussi, je crois qu'il nous faut préciser maintenant dans quelle version nous écrivons les codes exemples afin de gagner du temps dans nos recherches...

    J'ai testé le code de Sergio par exemple sous Delphi 10.3 et ma messagerie orange :

    J'avais oublié de mettre les Dll libeay32.dll et ssleay32.dll dans le répertoire Exe: Le message d'erreur est le suivant : (ça peut aider à localiser les unités ressources de Delphi utilisées:

    Nom : ErreurSSL.jpg
Affichages : 969
Taille : 19,2 Ko

    Le débogueur s'arrête sur le code de l'unité unit IdSSLOpenSSL;
    sur la ligne raise...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    constructor TIdSSLContext.Create;
    begin
      inherited Create;
      //an exception here probably means that you are using the wrong version
      //of the openssl libraries. refer to comments at the top of this file.
      if not LoadOpenSSLLibrary then begin
        raise EIdOSSLCouldNotLoadSSLLibrary.Create(RSOSSLCouldNotLoadSSLLibrary);
      end;
      fVerifyMode := [];
      fMode := sslmUnassigned;
      fSessionId := 1;
    end;
    Rappel : pour utiliser TLS/SSL avec Indy, il faut télécharger les fichiers bibliothèques libeay32.dll et ssleay32.dll disponibles à l'adresse suivante http://indy.fulgan.com/SSL/et les copier dans le même répertoire que le fichier exécutable.

    En fait, il faudrait un tuto qui reprend chaque point du protocole SMTP en permettant à chaque étape de vérifier le bon fonctionnement:

    Donc avec l'option TSL cochée, l'erreur devient:

    Nom : ErreurSSL-2.jpg
Affichages : 940
Taille : 25,8 Ko

    et la ligne de code de l'unité unit IdSSLOpenSSLHeaders qui génère l'erreur:

    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
    { EIdOpenSSLAPICryptoError }
    class procedure EIdOpenSSLAPICryptoError.RaiseException(const AMsg : String = '');
    begin
      RaiseExceptionCode(ERR_get_error(), AMsg);
    end;
    
    class procedure EIdOpenSSLAPICryptoError.RaiseExceptionCode(
      const AErrCode: TIdC_ULONG; const AMsg: String);
    var
      LMsg: String;
      LException : EIdOpenSSLAPICryptoError;
    begin
      if AMsg <> '' then begin
        LMsg := AMsg + sLineBreak + String(GetErrorMessage(AErrCode));
      end else begin
        LMsg := String(GetErrorMessage(AErrCode));
      end;
      LException := Create(LMsg);
      LException.FErrorCode := AErrCode;
      raise LException;
    end;
    Enfin, j'ai essayé sans la case à cocher SSL:

    Nom : ErreurSSL-3.jpg
Affichages : 941
Taille : 25,7 Ko

    et le code où ça plante (unité IdReplySMTP):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TIdReplySMTP.RaiseReplyError;
    begin
      raise EIdSMTPReplyError.CreateError(NumericCode, FEnhancedCode, Text.Text);
    end;

    j'avoue être dans l'expectative, il me dit que mot de passe n'est pas correct pour ma messagerie que j'utilise en expéditeur. C'est ma messagerie principale que j'utilise tous les jours.
    Pour le destinataire, j'ai mis une adresse mail sur un site internet que je gère.

    Donc j'ai pas tout compris, mdr!

    Pour l'instant, j'ai compris que SMTP était un protocole de TCP.

    Et les protocole TCP et UDP sont les protocoles de la couche 4 de la communication entre machines.
    Donc il faut des identifiants de machines (IP )

    TCP correspond à un besoin de protocole fiable mais sans nécessité de rapidité (grande majorité des applications d'internet qui vérifie que
    chaque paquet soit reçu coûte que coûte)
    UDP correspond au contraire à un protocole rapide mais sans nécessité de fiabilité comme le streaming,, la radio ou la télé sur internet

    SMTP (Simple Mail Transfer Protocol) ou Protocole Simple de Transfert de Courrier est le protocole standard permettant de transférer le courrier d'un
    serveur identifié (Adresse IP numérique ou symbolique Jlmat.cnam.fr <=> machine.sous-domaine.domaine) à un autre en connexion point à point.

    La structure du tutorial de https://robin-valtot.developpez.com/...s-avec-delphi/ de Robin Valtot me parait lisible en terme de compréhension des étapes. Je vais me concentrer sur le protocole SMTP uniquement.
    Je crois que l'on devrait y arriver :
    1. soit en étudiant les unités spécialisées de Delphi en ce qui concerne la mise en oeuvre des protocoles TCP et SMTP
    2. Soit en étudiant en détail ce que font les composants que cite Robin Valtot :
    - TIdSMTP : pour se connecter au serveur ;
    - TIdSSLIOHandlerSocketOpenSSL : pour sécuriser les connexions réseau ;
    - TIdMessage : il s'agit de notre message.et aller fouiller dans les uniiso

    Bon, ben je vais continuer de creuser...

    A+
    jlmat
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Jlmat Voir le message
    .
    La difficulté vient de la grande quantité d'exemples de codes écrit dans différentes versions de Delphi. Aussi, je crois qu'il nous faut préciser maintenant dans quelle version nous écrivons les codes exemples afin de gagner du temps dans nos recherches...
    c'est ce que je n'arrête pas de clamer dès que l'on pose une question sans ce contexte il est toujours plus difficile de répondre

    J'avais oublié de mettre les Dll libeay32.dll et ssleay32.dll dans le répertoire Exe
    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 )
    En ce qui concerne le smtp Orange.
    Pas sûr que ce soit dû à Indy. Tout d'abord lors de mes essais le 16/01 cela plantait, les mêmes essais le 17/01 étaient concluant
    Premier point :
    Notez que j'ai une petite erreur de gestion de l'erreur dans le code que j'ai fourni, il faudrait plutôt faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    try
    idSMTP1.Connect;
     
    try
      idSMTP1.Send(idMessage1);
      Memo1.Lines.Add('SMTP Ok , message envoyé');
    except
      Memo1.Lines.Add('E-mail non envoyé');
    end;
     idSMTP1.Disconnect;
    except
     Memo1.Lines.Add('Impossible de se connecter au serveur SMTP');
    end;
    c'est dans les messages dus aux exceptions qu'il faudrait obtenir l'erreur exacte mais il faudrait peut-être, si c'est possible, chercher aussi celle du composant SSLIOHandler

    Deuxième point :
    Beaucoup de paramètres possibles ne sont pas testés, entre les paramètres de SSLIOHandler et ceux de IdSmtp les combinaisons sont nombreuses
    Orange n'étant pas très explicite sur ce point il peut tout aussi bien s'agir d'un délai d'obtention de certificat que comme indiqué dans le message un problème de version de certificat.
    du coup la question à se poser (ou poser à orange) "mais quelle est donc cette version nécessaire ?" car SSLIOHandler en propose plusieurs (voir propriété SSLOptions.SSLVersions)

    Ps. pour info, je viens de réessayer avec mon smtp.orange, toujours avec succès, en sslversions j'ai toutes les versions de TLS (v1,v1_1,v1_2) je ne me souviens plus de ce qu'il en était lors de mes tests du 17/01

    pps pour info aussi un webmaster qui à l'air d'en connaitre un rayon fait cette remarque
    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

  14. #14
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    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 : 548
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
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  15. #15
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    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+
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    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
    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

  17. #17
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    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

  18. #18
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    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
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    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 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    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;
    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

  20. #20
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    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

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