Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Indy10.6.2 invio email PEC

185 views
Skip to first unread message

Luigis

unread,
Oct 23, 2020, 2:16:51 PM10/23/20
to
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.

Luigis

unread,
Oct 24, 2020, 5:32:05 AM10/24/20
to
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.

Alessandro B.

unread,
Oct 25, 2020, 4:52:54 AM10/25/20
to
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

Luigis

unread,
Oct 25, 2020, 6:59:16 AM10/25/20
to
Il 25/10/2020 09:52, Alessandro B. ha scritto:
>
> 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.

Luigis

unread,
Oct 25, 2020, 1:09:33 PM10/25/20
to
Ho risolto: utilizzavo una libreria OpenSSL molto vecchia senza
accorgermene :(

Utilizzando la versione 1.1.0.2q ho risolto.

Grazie.

Leo Rizzi

unread,
Jul 22, 2021, 1:09:31 PM7/22/21
to
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

Luigis

unread,
Jul 22, 2021, 1:18:55 PM7/22/21
to
Il 22/07/2021 19:09, Leo Rizzi ha scritto:
>
> sono queste le dll a cui ti riferisci?
>
> libeay32.dll
> ssleay32.dll
>
Si

> fanno parte del pacchetto OpenSSL 1.1.0.2q.
> Vanno posizionate nella cartella dell'eseguibile?
>
Non necessariamente.
Io le ho posizionate in altra cartella perché vengono condivise con
altro software per non avere troppi duplicati in giro per l'hdd.

Da programma, però, prima di utilizzare la libreria openssl
inizializzare la libreria con "IdOpenSSLSetLibPath(OpenSSLLibPath);"
L'inizializzazione va fatta una sola volta.

> Con Aruba pec non ne vuole sapere
>
Non ho problemi con Aruba.

Ciao.

Leo Rizzi

unread,
Jul 22, 2021, 2:31:56 PM7/22/21
to
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

Leo Rizzi

unread,
Jul 22, 2021, 2:38:21 PM7/22/21
to
Risolto con le librerie "openssl-1.0.2q-i386-win32"
Grazie

Luigis

unread,
Jul 23, 2021, 4:44:44 AM7/23/21
to
Il 22/07/2021 20:31, Leo Rizzi ha scritto:
>
> 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?

Probabilmente il problema è lo spazio che c'è prima della lettera D,
prova a cambiare con IdOpenSSLSetLibPath('D:\Lib');

Ciao
0 new messages