Ti "giro" la parte di codice che utilizzo per l'autenticazione SSL.
Funziona correttamente con Aruba, ma non ho la certezza che sia stata utilizzata anche per legalmail
Nella mia gestione prevedo un parametro RecMail.AuthMode che mi consente di specificare quale tipo di autenticazione devo utilizzare
I valori previsti per questo parametro li ho impostati a:
type
TMailAuthMode = (
maStd,
maTls, maTlsv1, maTlsv1_1, maTlsv1_2,
maSsl, maSslv2, maSslv23, maSslv3,
maGmail,
maArubaPec
);
TSetMailAuthMode = maStd .. maArubaPec;
const
MailAuthMode_Ssl = [maSsl, maSslv2, maSslv23, maSslv3];
MailAuthMode_Tls = [maTls, maTlsv1, maTlsv1_1, maTlsv1_2];
MailAuthMode_Gmail = [maGmail];
MailAuthMode_ArubaPec = [maArubaPec];
Questo mi consente sia di gestire in semplicità per l'operatore finale la connessione con Aruba, sia di impostarne altre ai vari server in base alle richieste specifiche
Per ultimo, utilizzando varie versioni di Delphi, ho inserito una compilazione condizionale per gestire le modifiche fatte negli anni alla parametrizzazione in Indy.
Ho definito la chiave di compilazione condizionale DelphiXEN per tutte le versioni dalla XE3 (VER240) in poi.
{ --- Aggiunte --- }
IOHandler := IdSSLIOHandlerSocketOpenSSL;
{ --- Modalità di Autenticazione Implicita / Esplicita --- }
if RecMail.AuthMode in (MailAuthMode_Ssl + MailAuthMode_ArubaPec)
then UseTLS := utUseImplicitTLS
else UseTLS := utUseExplicitTLS;
{ --- SSL --- }
if IdSSLIOHandlerSocketOpenSSL <> Nil
then begin
IdSSLIOHandlerSocketOpenSSL.Destination := RecMail.SmtpHost + ':' + Str000(RecMail.SmtpPort);
IdSSLIOHandlerSocketOpenSSL.Host := RecMail.SmtpHost;
IdSSLIOHandlerSocketOpenSSL.Port := RecMail.SmtpPort;
{ --- Opzioni Autenticazione --- }
case RecMail.AuthMode of
// Tls
maTls: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
maTlsv1: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
{$ifdef DelphiXEN}
maTlsv1_1: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_1;
maTlsv1_2: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_2;
{$else}
maTlsv1_1: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
maTlsv1_2: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
{$endif}
// Ssl
maSsl: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv23;
maSslv2: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;
maSslv23: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv23;
maSslv3: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv3;
// Gmail
maGmail: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
// Aruba Pec
maArubaPec: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv23;
end;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyMode := [];
IdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyDepth := 0;
end;
Il codice al momento funziona correttamente con la versione Delphi 10.4, ma in realtà non è stato modificato da molti anni (se non per i parametri delle versioni di Indy...), quindi sono sicuro che funziona anche con le varie 10.* sia con le XE* precedenti