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;
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. –
@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
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. –