2017-09-14 8 views
0

Un peu bizarre ici, lorsque vous définissez "UseTLS" sur utUseExplicitTLS puis que vous vous connectez à un serveur de messagerie sur son port implicite TLS, la première tentative permet la connexion et envoie l'e-mail, les tentatives suivantes sur ce port échouent correctement.SMTP implicite TLS et TLS explicite utilisant Indy 10.6.2.5341 dans Delphi

Je me demandais juste si quelqu'un avait des idées sur la façon d'éviter le faux positif sur la connexion initiale et envoyer.

La vérification consiste à gérer les ports non standard qui peuvent être utilisés pour le serveur de messagerie d'un utilisateur. Presque tous les exemples que j'ai vus supposent que l'information correcte sera toujours fournie.

Ci-dessous la partie de code qu'il gère (hors journalisation des erreurs):

function SendTestEmail(EmailAddress: String): Boolean; 
var 
    EmailMessage: TidMessage; 
begin 
    IdSMTPEmail.AuthType := satDefault 
    IdSMTPEmail.Username := ...; 
    IdSMTPEmail.Password := ...; 
    IdSMTPEmail.Port := 465; 

    IdSMTPEmail.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTPEmail); 
    IdSMTPEmail.UseTLS := utUseExplicitTLS; 
    TIdSSLIOHandlerSocketOpenSSL(IdSMTPEmail.IOHandler).SSLOptions.Method := sslvTLSv1_2; 
    try 
    // Connect 
    IdSMTPEmail.Connect('smtp.gmail.com'); 

    try 
     // Create 
     EmailMessage := TidMessage.Create(nil); 

     try 
     // Set values 
     EmailMessage.Body.Add('Test Email'); 
     EmailMessage.Subject := 'Test Email'; 

     // Set sender details 
     EmailMessage.From.Address := '[email protected]'; 
     EmailMessage.From.Name := 'SSL Test'; 

     // Set recipient 
     EmailMessage.Recipients.Add.Address := EmailAddress; 

     try 
      // Send message 
      IdSMTPEmail.Send(EmailMessage); 

     except 
      // Exception 
      on E: EIdSMTPReplyError do 
      begin 
      // Result 
      Result := False; 
      end; 
     end; 

     finally 
     // Free email 
     EmailMessage.Free; 
     end; 

    finally 
     // Disconnect 
     IdSMTPEmail.Disconnect; 
    end; 

    except 
    // Exception 
    on E: Exception do 
    begin 
     IdSMTPEmail.Disconnect; 
     // Result 
     Result := False; 
    end; 
    end; 
end; 
+0

Ce que vous décrivez n'est pas possible. Le port TLS implicite nécessite que la prise de contact TLS soit lancée immédiatement après la connexion et soit complètement terminée avant que le message d'accueil SMTP puisse être envoyé. 'utUseExplicitTLS' n'envoie pas de handshake lors de la connexion, donc' Connect() 'bloque l'attente d'un message d'accueil qui n'est jamais envoyé, jusqu'à ce que le serveur se déconnecte ou que ReadTimeout' s'écoule, selon la première éventualité. De toute façon, le code d'appel ne sera pas en mesure d'aller assez loin pour envoyer des courriels. –

+0

@RemyLebeau ce que vous avez dit est le comportement que je m'attendais et a été stupéfait quand ce qui précède a fonctionné pour la première tentative. En guise de vérification, Wireshark fonctionnait en même temps et cela a montré du succès lors des premières tentatives (un e-mail a également été reçu) mais les tentatives suivantes ont expiré et Wireshark n'a rien trouvé. – Aaron

+0

Ce que vous dites n'est simplement pas possible sur un port ** implicite TLS **. La prise de contact TLS est * obligatoire *. Vous étiez probablement connecté à un port * non implicite * lors de la première tentative, puis connecté à un port * implicite * lors des tentatives suivantes. Utilisez Wireshark pour vérifier le port utilisé sur chaque connexion. –

Répondre

0

En utilisant le code ci-dessous, correctement échoué sur toutes les tentatives d'essayer d'envoyer un courriel au port 465.

Je ne Je prétends même comprendre pourquoi cela fonctionne mais pas mon original.

function SendTestEmail(EmailAddress: String): Boolean; 
var 
    EmailMessage: TidMessage; 
    IdSSLHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    IdSMTPEmail.AuthType := satDefault; 

    IdSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create; 
    IdSSLHandler.SSLOptions.Method := sslvTLSv1_2; 

    IdSMTPEmail.IOHandler := IdSSLHandler; 
    IdSMTPEmail.UseTLS := utUseExplicitTLS; 

    IdSMTPEmail.Username := ...; 
    IdSMTPEmail.Password := ...; 
    IdSMTPEmail.Port := 465; 

    try 
    // Connect 
    IdSMTPEmail.Connect('smtp.gmail.com'); 

    try 
     // Create 
     EmailMessage := TidMessage.Create(nil); 

     try 
     // Set values 
     EmailMessage.Body.Add('Test Email'); 
     EmailMessage.Subject := 'Test Email'; 

     // Set sender details 
     EmailMessage.From.Address := '[email protected]'; 
     EmailMessage.From.Name := 'SSL Test'; 

     // Set recipient 
     EmailMessage.Recipients.Add.Address := EmailAddress; 

     try 
      // Send message 
      IdSMTPEmail.Send(EmailMessage); 

     except 
      // Exception 
      on E: EIdSMTPReplyError do 
      begin 
      // Result 
      Result := False; 
      end; 
     end; 

     finally 
     // Free email 
     EmailMessage.Free; 
     end; 

    finally 
     // Disconnect 
     IdSMTPEmail.Disconnect; 
    end; 

    except 
    // Exception 
    on E: Exception do 
    begin 
     IdSMTPEmail.Disconnect; 
     // Result 
     Result := False; 
    end; 
    end; 
end;