Discussione:
Indy10.6.2 invio email PEC
(troppo vecchio per rispondere)
Luigis
2020-10-23 18:16:49 UTC
Permalink
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
2020-10-24 09:32:05 UTC
Permalink
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.
2020-10-25 08:52:52 UTC
Permalink
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
2020-10-25 10:59:20 UTC
Permalink
Post by Alessandro B.
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
2020-10-25 17:09:37 UTC
Permalink
Ho risolto: utilizzavo una libreria OpenSSL molto vecchia senza
accorgermene :(

Utilizzando la versione 1.1.0.2q ho risolto.

Grazie.
Leo Rizzi
2021-07-22 17:09:30 UTC
Permalink
Post by Luigis
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
Luigis
2021-07-22 17:18:53 UTC
Permalink
Post by Leo Rizzi
sono queste le dll a cui ti riferisci?
libeay32.dll
ssleay32.dll
Si
Post by Leo Rizzi
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.
Post by Leo Rizzi
Con Aruba pec non ne vuole sapere
Non ho problemi con Aruba.

Ciao.
Leo Rizzi
2021-07-22 18:31:54 UTC
Permalink
Post by Luigis
Post by Leo Rizzi
sono queste le dll a cui ti riferisci?
libeay32.dll
ssleay32.dll
Si
Post by Leo Rizzi
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.
Post by Leo Rizzi
Con Aruba pec non ne vuole sapere
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
Leo Rizzi
2021-07-22 18:38:20 UTC
Permalink
Post by Leo Rizzi
Post by Luigis
Post by Leo Rizzi
sono queste le dll a cui ti riferisci?
libeay32.dll
ssleay32.dll
Si
Post by Leo Rizzi
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.
Post by Leo Rizzi
Con Aruba pec non ne vuole sapere
Non ho problemi con Aruba.
Ciao.
Scusami,
Ho posizionato le due dll in una cartella "D:\Lib" e Richiamato il metodo IdOpenSSLSetLibPath(' D:\Lib')
" 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
Luigis
2021-07-23 08:44:43 UTC
Permalink
Post by Leo Rizzi
Ho posizionato le due dll in una cartella "D:\Lib" e Richiamato il metodo IdOpenSSLSetLibPath(' D:\Lib')
" 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

Continua a leggere su narkive:
Loading...