Newsgroup: it.comp.lang.delphi
Titolo: Indy10.6.2 invio email PEC

Vorrei inviare una email con il componente indy TIDSMTP ed il server PEC 
di legalmail.
 
Ho configurato il componente idSMTP come segue:
 
UseTLS := utUseImplicitTLS;
Port := 465;
IOHandler := idSSlIoHandlerSocketOpenSSL;
Host := 
sendm.cert.legalmail.it
 
username := 'XXX';
password := 'XXX';
 
Tutte le altre proprietà sono come da default.
 
Il componente idSSLIOHandlerSocketOpenSSL ha tutto di default tranne
Destination := :465;
port := 465;
Method := sslTLSv1; // (default)
 
 
Quando provo ad inviare mi viene restituito l'errore:
ERROR: Socket Error # 10054
Connection reset by peer.
 
Se provo ad inviare dal server smtp di tiscali funziona correttamente.
 
Dove sbaglio?
 
Grazie.

leggendo in giro per la rete leggo che bisogna impostare il metodo SSL a 
sslTLSv1_2 però non riesco ugualmente ad inviare ne con legalmail ne con 
aruba.
 
Da thunderbird non ho problemi:
1) con legalmail impostando il metodo di autenticazione = "Password 
Normale"
2) con tiscali impostando il metodo di autenticazione = "Password cifrata"
 
Ma con il componente SMTP delle indy come faccio ad impostare queste 
varianti?
 
Grazie.

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

 
 
Niente da fare.
Ottengo sempre l'errore:
"ERROR: Socket Error # 10054
Connection reset by peer."
 
Questo è il mio codice:
begin
 
   IdSSLIOHandlerSocketOpenSSL1.Destination := edtHost.Text + ':465';
   IdSSLIOHandlerSocketOpenSSL1.Host := edtHost.Text;
   IdSSLIOHandlerSocketOpenSSL1.Port := 465;
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
   IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
   IdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyMode := [];
   IdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyDepth := 0;
 
   SMTP.UseTLS := utUseImplicitTLS;
   SMTP.Host := edtHost.Text;
   SMTP.Port := 465;
   SMTP.Username := edtUsername.Text;
   SMTP.Password := edtPassword.Text;
 
   //setup mail message
   MailMessage.From.Address := edtFrom.Text;
   MailMessage.Recipients.EMailAddresses := edtTo.Text + ',' + edtCC.Text;
   MailMessage.Subject := edtSubject.Text;
   MailMessage.Body.Text := mmoBody.Text;
   if FileExists(edtAttachment.Text) then
     TIdAttachmentFile.Create(MailMessage.MessageParts, 
edtAttachment.Text) ;
 
   //send mail
   try
     try
       SMTP.ConnectTimeout := 1000;
       SMTP.Connect;
       SMTP.Send(MailMessage);
     except
       on E:Exception do
         mmoStatusMemo.Lines.Insert(0, 'ERROR: ' + E.Message) ;
     end;
   finally
     if SMTP.Connected then SMTP.Disconnect;
   end;
end;
 
Grazie.

Ho risolto: utilizzavo una libreria OpenSSL molto vecchia senza 
accorgermene :(
 
Utilizzando la versione 1.1.0.2q ho risolto.
 
Grazie.


Ciao Luigi,
 
sono queste le dll a cui ti riferisci?
 
libeay32.dll
ssleay32.dll
 
fanno parte del pacchetto OpenSSL 1.1.0.2q.
Vanno posizionate nella cartella dell'eseguibile?
 
Con Aruba pec non ne vuole sapere 
 
Grazie Mille

 
Non ho problemi con Aruba.
 
Ciao.


Scusami,
 
 
Ho posizionato le due dll in una cartella "D:\Lib" e Richiamato il metodo IdOpenSSLSetLibPath(' D:\Lib')
 
Mi compare sempre il messaggio:
" ERROR: Could not load SSL library. "
 
Hai idea di quale sia la causa di questo errore?
Voglio precisare che la chiamata " IdOpenSSLSetLibPath(' D:\Lib')" l'ho inserita nell'evento OnCreate della Form principale 
e che ho utilizzato la stessa libreria che hai indicato tu " openssl-1.0.2q"
 
Sto impazzendo.
Uso delphi XE7
 
Grazie Mille
Leo


Risolto con le librerie "openssl-1.0.2q-i386-win32"
Grazie

 Hai idea di quale sia la causa di questo errore?
 
Probabilmente il problema è lo spazio che c'è prima della lettera D, 
prova a cambiare con IdOpenSSLSetLibPath('D:\Lib');
 
Ciao