Bonjour à tous,

Je sais que ce sujet a déjà été abordé, mais malgré les échanges et différentes pistes sur le forum et le Net, j'ai toujours un problème pour me connecter à Gmail avec un composant TIdImap4.
Pour faire simple, j'ai créé une application il y a un moment déjà (delphi 2010, composant Indy V10.5.5) qui se connecte à une boîte Gmail, récupère des messages (contenant des rapports de backups de base de données), décortique le contenu et envoie un mail si un backup n'a pas pu se faire correctement.
Cette application a fonctionné très bien jusqu'à une certaine date. Puis un jour, sans aucun changement sur l'ordinateur, plus moyen de me connecter sur le compte Gmail, il se connecte puis se déconnecte avec le message "Connection closed gracefully"... not authenticated.

J'ai pensé à une mise à jour de sécurité de Gmail. J'ai récupéré les dll à jour de openssl, j'ai revérifié le pare-feu et compagnie et j'ai re-trituré toutes les options de TIDImap et de TIdSSLIOHandlerSocketOpenSSL. Ça fait quelques combinaisons, mais aucune amélioration. Initialement je n'ai pas activé l'authentification en deux étapes dans Gmail, mais même en faisant et en créant un mot de passe d'application, rien à faire. Je commence à être à court d'idées. En faisant un pas à pas, je bloque a priori sur "GetResponse". Pour la gestion de connexion, je me suis inspirée initialement des codes que l'on trouve sur Internet, et ça marchait. Voici la procédure:

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
procedure GetGmailMessages(const UserName, Password: string; Corpsdumail: TStrings);
var
  S: string;
  MsgIndex: Integer;
  MsgObject: TIdMessage;
  PartIndex: Integer;
  Confirmes : array of integer;
  Supp, i : integer;
  Socks : TIdSocksInfo;
begin
 
  //Création et paramétrage composant IMAP
  Corpsdumail.Clear;
  IMAPClient := TIdIMAP4.Create(nil);
 
  try
    OpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 
    try
      //Paramétrage
      OpenSSLHandler.SSLOptions.Method := sslvSSLv3;
      OpenSSLHandler.SSLOptions.Mode := sslmUnassigned;//sslmClient ;//sslmUnassigned
      OpenSSLHandler.SSLOptions.VerifyMode := [];//[sslvrfClientOnce];
      OpenSSLHandler.SSLOptions.VerifyDepth := 0;
      IMAPClient.IOHandler := OpenSSLHandler;
      IMAPClient.Host := IMAPAddress;
      IMAPClient.UseTLS:=utuseExplicitTLS;
      IMAPClient.Port := IMAPPort;
      IMAPClient.Username := UserName;
      IMAPClient.Password := Password;
 
      Try
        IMAPClient.Connect;
        IMAPClient.Login;
      Except
         On e:exception do Showmessage(e.Message);
      End;
 
      try
        //Parcours boîte de réception
        if IMAPClient.SelectMailBox('INBOX') then
        begin
          Corpsdumail.BeginUpdate;
          FenPrincipale.MemEtat.Lines.Add('Parcours Boîte de réception');
          try
            for MsgIndex := 1 to IMAPClient.MailBox.TotalMsgs do
            begin
 
              MsgObject := TIdMessage.Create(nil);
 
              try
                //Récup messages
                S := '';
                FenPrincipale.MemEtat.Lines.Add('Récupération du message');
                IMAPClient.Retrieve(MsgIndex, MsgObject);
                MsgObject.MessageParts.CountParts;
 
                if MsgObject.MessageParts.TextPartCount > 0 then
                begin
                  for PartIndex := 0 to MsgObject.MessageParts.Count - 1 do
                    if MsgObject.MessageParts[PartIndex] is TIdText then
                      S := S + TIdText(MsgObject.MessageParts[PartIndex]).Body.Text;
                      Corpsdumail.Add(S);
                end
                else
                  Corpsdumail.Add(MsgObject.Body.Text);
 
                //Copie messages dans 'TRAITE' car IMAP ne connaît pas MOVE...
                IMAPClient.CopyMsg(MsgIndex,'TRAITE');
                FenPrincipale.MemEtat.Lines.Add('Classement comme ''TRAITE');
 
              finally
                //Libérations et fins de processus
                MsgObject.Free;
              end;
            end;  //endfor
 
            FenPrincipale.MemEtat.Lines.Add('Nettoyage Boîte de réception');
 
            //Une fois classés en Traités, on supprime les mails de Inbox
 
            //Vérification si le mail est non lu
            //FenPrincipale.IMAPClient.RetrieveFlags(MsgIndex,Flags);
            //if mfSeen in Flags  then
            Supp:=0;
            for i := 1 to IMAPClient.MailBox.TotalMsgs do
            begin
              Setlength(Confirmes, Succ(Supp));
              Confirmes[Supp] := i;
              Inc(Supp);
            end;
            FenPrincipale.MemEtat.Lines.Add('Nettoyage Inbox');
            IMAPClient.DeleteMsgs(Confirmes);
            IMAPClient.ExpungeMailBox;
 
          finally
            Corpsdumail.EndUpdate;
          end;
        end;//endif
      finally
        IMAPClient.Disconnect;
      end;
    finally
      OpenSSLHandler.Free;
    end;
  finally
    IMAPClient.Free;
  end;
end;

Je suis preneuse de toute idée. Merci d'avance pour vos réponses.