Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy: POP und SSL - wie? (https://www.delphipraxis.net/131165-indy-pop-und-ssl-wie.html)

ManuMF 19. Mär 2009 22:51


Indy: POP und SSL - wie?
 
Hallo,

ich schreibe an einem Programm, das meine Adressen auf neue Mails überprüft. Dabei verwende ich IdPOP3. Das funktioniert bisher relativ gut.

Für die GoogleMail-Adresse bräuchte ich nun SSL. Wie kann ich das mit den Indys realisieren?

Ich habe 2 Komponenten gefunden, die etwas mit SSL zu tun haben - weiß aber weder, welche von beiden ich brauche, noch wie ich sie einstellen muss. :(

Thomas Horstmann 20. Mär 2009 00:07

Re: Indy: POP und SSL - wie?
 
Hallo,

das Ganze läuft über "TIdOpenSSL". Die Komponente in der IDE anlegen und mit "TIdSMTP" bzw. "TIdPOP" verknüpfen.
Die OpenSSL Dateien "libeay32.dll" und "ssleay32.dll" müssen installiert sein (System) oder im Programm-Ordner liegen.

Ggf. muss "UseTLS" und die "Ports" für SSL angepasst werden. Je Nachdem was der Mail-Server verlangt.

Viele Grüße :-D

Delphi-Quellcode:
Standard/gebräuchliche Ports:

POP3, Standard  =  110
POP3, SSL       =  995

SMTP, Standard  =  25 oder 587
SMTP, SSL       =  25 oder 587 

IMAP, Standard  =  143
IMAP, SSL       =  993
Delphi-Quellcode:
...
Info: Die Variablen MyUseSSL und MySSLType werden im Vorfeld definiert.
...
with IdPOP do
  begin
  if MyUseSSL = TRUE then
    begin
    { Mit SSL }
    IOHandler := IdOpenSSL ;
    if MySSLType = 'Explicit' then UseTLS := utUseExplicitTLS ;
    if MySSLType = 'Implicit' then UseTLS := utUseImplicitTLS ;
    if MySSLType = 'Require' then UseTLS := utUseRequireTLS ;
    end
  else
    begin
    { Ohne SSL }
    IOHandler := nil ;
    UseTLS   := utNoTLSSupport ;
    end ;
  { Anmelden }
  Connect ;
  end ;

ManuMF 20. Mär 2009 10:27

Re: Indy: POP und SSL - wie?
 
Hallo,

danke schonmal soweit :)

TIdOpenSSL habe ich nicht, nur die beiden anderen Komponenten. Die eine (halte ich für die eher richtige) heißt TIdSSLIOHandlerSocketOpenSSL. Meinst du die? Die hat auch nochmal Einstellungen für Host und Port, muss ich die auch einstellen?

Assertor 20. Mär 2009 10:58

Re: Indy: POP und SSL - wie?
 
Hi ManuMF,

Zitat:

Zitat von ManuMF
TIdOpenSSL habe ich nicht, nur die beiden anderen Komponenten. Die eine (halte ich für die eher richtige) heißt TIdSSLIOHandlerSocketOpenSSL. Meinst du die? Die hat auch nochmal Einstellungen für Host und Port, muss ich die auch einstellen?

Richtig, die Komponente heißt TIdSSLIOHandlerSocketOpenSSL. Die Einstellungen kannst Du so lassen. In der anderen Komponente POP/HTTP/FTP verknüpfst Du den IOHandler damit. Und die OpenSSL DLLs müssen in das Programmverzeichnis Deiner Anwendung gelegt werden (auch bei den Nutzern wenn diese installiert wird).

Link zu den DLLs:
http://indy.fulgan.com/SSL/

Da dann bitte die openssl-0.9.8j-i386-win32.zip nehmen (bzw. falls der Thread später mal gelesen wird, die jeweils aktuellste für Win32 oder Win64 je nach System und Delphi).

Achtung: Die "neuen" DLLs gehen aber nur mit einer aktuellen Indy Version, z.B. der mit Delphi 2009 ausgelieferten oder einer selbst aktualisierten Version von unserem SVN.

Gruß Assertor

Thomas Horstmann 20. Mär 2009 10:59

Re: Indy: POP und SSL - wie?
 
Hallo,

entschuldigung ich hatte das Objekt in der IDE umbenannt. "TIdSSLIOHandlerSocketOpenSSL" ist richtig.
Die Ports setze ich nicht in dieser Komponente (steht beim mir auf "0"), sondern in "TIdSMTP" bzw. "TIdPOP".

Ich kann mich Assertor nur anschließen. Am besten immer einen aktuellen "Snapshop" benutzen. Vor allem bei
D2009. Gerade bei Mails (Encode/Decode) hat sich in den letzten Tagen einiges getan.

Viele Grüße :-D

ManuMF 20. Mär 2009 12:40

Re: Indy: POP und SSL - wie?
 
Super, danke, probier ich gleich aus! :thumb:

Noch eine Frage: In Thunderbird kann ich entweder TLS oder SSL wählen, für Google ist SSL gewählt. Welche der drei Möglichkeiten für TLS (UseTLS) muss ich in meinem Programm nehmen?

Assertor 20. Mär 2009 12:51

Re: Indy: POP und SSL - wie?
 
Hi,

Zitat:

Zitat von ManuMF
Noch eine Frage: In Thunderbird kann ich entweder TLS oder SSL wählen, für Google ist SSL gewählt. Welche der drei Möglichkeiten für TLS (UseTLS) muss ich in meinem Programm nehmen?

Sollte mit explicit TLS gehen.

Schau Dir mal das Beispiel zu Indy + Google Mail von Marco Cantu dazu an:
http://www.marcocantu.com/tips/oct06_gmail.html

Gruß Assertor

ManuMF 20. Mär 2009 14:13

Re: Indy: POP und SSL - wie?
 
Habe die DLLs im Programmverzeichnis und die neueste Verison der Indys installiert.

Leider friert das Programm beim Aufruf von Connect bei GoogleMail ein. Das hatte ich auch schon mit der vorherigen Indy-Version (die mit dem automatischen Installer) und ohne IOHandler (hatte erst nicht daran gedacht, dass SSL nötig ist).

Bei z.B. T-Online (ohne SSL) funktioniert es bestens.

Assertor 20. Mär 2009 14:32

Re: Indy: POP und SSL - wie?
 
Zitat:

Zitat von ManuMF
Leider friert das Programm beim Aufruf von Connect bei GoogleMail ein. Das hatte ich auch schon mit der vorherigen Indy-Version (die mit dem automatischen Installer) und ohne IOHandler (hatte erst nicht daran gedacht, dass SSL nötig ist).

Probier mal im SSL Handler die SSLOptions.Method auf sslvTLSv1 und wenn das nicht geht auf sslvSSLv23 zu setzen.

Bekommst Du denn keine Fehlermeldung? Welche Domain willst Du nutzen? Zeig mal etwas Code...

Gruß Assertor

ManuMF 20. Mär 2009 14:52

Re: Indy: POP und SSL - wie?
 
Bei der Methode habe ich alle probiert, immer das gleiche Ergebnis.

Der eigentlich Prüf-Code:
Delphi-Quellcode:
function POP3MailCheck(aServer, aUser, aPasswort: String; aPort: Integer; aSSL: Boolean): TPopCheckInfo;
begin
  with MCForm.POPInterface do
  begin
    if (Connected) then
      Disconnect;

    Host := aServer;
    Port := aPort;
    Username := aUser;
    Password := aPasswort;

    If aSSL then
    begin
      IOHandler := MCForm.POP_SSL;
      UseTLS   := utUseExplicitTLS;
    end
    else
    begin
      IOHandler := nil;
      UseTLS   := utNoTLSSupport ;
    end;

    try
      Connect;
    except
      on E: Exception do
      begin
        result.PMails := 0;
        result.PError := true;
        result.PErrorMsg := TranslateError(E.Message); // Eigene Funktion (Error-Nummer --> Text)
        exit;
      end;
    end;

    result.PMails := CheckMessages;
    result.PError := false;
    result.PErrorMsg := '';

    Disconnect;
  end;
end;
wobei POPInterface TIdPop3 und POP_SSL der SS-IOHandler sind.

Mit T-Online funktioniert das wie gesagt, aber bei GoogleMail friert das Programm bei Connect ein. Keine Fehlermeldung. Er versucht jedenfalls, sich zu verbinden, weil die Firewall nachfragt (was ich selbstverständlich erlaube). Aber schon die nächste Zeile wird nicht erreicht.

Für das Einfrieren ist es völlig gleich, ob ich einen IOHandler verwende oder nicht und wenn ja ob die DLLs da sind oder nicht.

Edit: Da ich ja nun auch die pas-Dateien habe, habe ich mal einen Breakpoint gesetzt und geschaut, wie weit er kommt. Bei der Funktion Stub_connect in der IdWinsock2.pas passiert nichts mehr.

Edit2: Ups, die Daten. pop.googlemail.com:995.

Assertor 20. Mär 2009 16:36

Re: Indy: POP und SSL - wie?
 
Hi,

also ich habe das gerade mal getestet: Es klappt bei mir mit gmail auch nicht. Mit z.B. 1&1 mit und ohne SSL keine Probleme... Wenn ich das Timeout im SSL IOHandler setzte (z.B. 2500), dann kommt auch irgendwann ein Timeout mit gmail.

Irgendwas stimmt da nicht, ich schau mir das mal genauer an. Danach poste ich wieder hier.

Gruß Assertor

Assertor 20. Mär 2009 17:05

Re: Indy: POP und SSL - wie?
 
Hi,

so - da hast Du mich ja gerade ganz verrückt gemacht. Dachte schon, es sei ein Bug drin ;)

Lösung mit einem TIdPOP3 und einem TIdSSLIOHandlerSockenOpenSSL (als IOHandler für TIdPOP3):

Delphi-Quellcode:
IdPOP31.Host := 'pop.gmail.com';
IdPOP31.Port := 995; // Port für Secure POP3
IdPOP31.UseTLS := utUseImplicitTLS; // wichtig, gmail akzeptiert nichts anderes!
IdPOP31.Username := 'meinname@gmail.com';
IdPOP31.Password := 'passwort';
IdPOP31.Connect;
Alles andere auf Default lassen.

Ergebnis (per StatusInfo ausgelesen):
Zitat:

Resolving hostname pop.gmail.com.
Connecting to 74.125.79.111.
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
SSL status: "SSLv3 read server certificate A"
SSL status: "SSLv3 read server done A"
SSL status: "SSLv3 write client key exchange A"
SSL status: "SSLv3 write change cipher spec A"
SSL status: "SSLv3 write finished A"
SSL status: "SSLv3 flush data"
SSL status: "SSLv3 read server session ticket A"
SSL status: "SSLv3 read finished A"
SSL status: "SSL negotiation finished successfully"
SSL status: "SSL negotiation finished successfully"
Cipher: name = RC4-MD5; description = RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
; bits = 128; version = TLSv1/SSLv3;
Connected.
Anzahl E-Mails:0
Disconnecting.
SSL status: "SSL negotiation finished successfully"
Disconnected.
Fürs das Checken hab ich noch eine TIdMessage Komponente auf die Form gezogen und diesen Code verwendet:
Delphi-Quellcode:
var
  i, MsgAnz: Integer;
begin
  IdPOP31.Host := 'pop.gmail.com';
  IdPOP31.Port := 995; // Port für Secure POP3
  IdPOP31.UseTLS := utUseImplicitTLS; // wichtig, gmail akzeptiert nichts anderes!
  IdPOP31.Username := 'meinname@gmail.com';
  IdPOP31.Password := 'passwort';
  IdPOP31.Connect;
  // mails checken
  MsgAnz := IdPOP31.CheckMessages;
  Memo1.Lines.Add('Anzahl E-Mails:' + IntToStr(MsgAnz));
  for i:= 1 to MsgAnz do
  begin
    idpop31.RetrieveHeader(i, IdMessage1);
    Memo1.Lines.Add('E-Mail Nr:' + IntToStr(i)+ sLineBreak +
      ' Von:' + IdMessage1.From.Text + sLineBreak +
      ' Betreff:' + IdMessage1.Subject);
    IdMessage1.Clear;
  end;
  IdPOP31.Disconnect;
end;
Natürlich muß POP3 in den GMail-Einstellungen per Webinterface explizit eingeschaltet werden. Dann geht das mit den aktuellen Indys und OpenSSL aber einwandfrei. Ich hoffe, es hilft Dir etwas weiter!

Gruß Assertor

ManuMF 20. Mär 2009 17:37

Re: Indy: POP und SSL - wie?
 
Jupp, funktioniert einwandfrei!
Vielen Dank! :thumb:

Tja, kleines Wörtchen, großer Effekt (Implicit statt Explicit) :wink:

Assertor 20. Mär 2009 18:14

Re: Indy: POP und SSL - wie?
 
Hi ManuMF,

Zitat:

Zitat von ManuMF
Jupp, funktioniert einwandfrei!
Vielen Dank! :thumb:

Tja, kleines Wörtchen, großer Effekt (Implicit statt Explicit) :wink:

Das freut mich zu hören, gerne! Ja, die Option hatte ich auch erst wieder übersehen ;)

:dp:

Gruß Assertor

BBoy 28. Mai 2009 16:30

Re: Indy: POP und SSL - wie?
 
Ich nutze Delphi 2007, welche .dll brauche ich denn dafür? und woher bekomme ich die?
Denn bei mir kommt immer der fehler "EIdOSSLCouldNotLoadSSLLibrary". Die 2 dlls habe ich in den ordner kopiert indem das programm ist wo ich programmiere. ich denke es sind die falschen dll, oder?

Assertor 28. Mai 2009 17:12

Re: Indy: POP und SSL - wie?
 
Hallo BBoy,

Zitat:

Zitat von BBoy
Ich nutze Delphi 2007, welche .dll brauche ich denn dafür? und woher bekomme ich die?
Denn bei mir kommt immer der fehler "EIdOSSLCouldNotLoadSSLLibrary". Die 2 dlls habe ich in den ordner kopiert indem das programm ist wo ich programmiere. ich denke es sind die falschen dll, oder?

Richtig, die DLLs sind falsch bzw. Deine Indy Installation ist veraltet.

Wenn Du in diesem Forum in den Bereich Übersicht > "VCL / WinForms / Controls" gehst, findest Du einen Thread der sticky gemacht ist mit dem Titel "Indy OpenSSL Sicherheitsupdates". Dort gehst Du ganz zum Ende und findest den Link zu den aktuellen DLLs.

Ich rate, wie immer, davon ab andere DLLs zu verwenden: Unsere sind geprüft und gegen msvcrt.dll gelinkt, die etlichen im Internet gerne gegen das msvcrt 8+ (benötigen also sonst je nach Betriebssystem eigene Runtime DLLs).

Die DLLs funktionieren nur mit aktuellen Indy Versionen, weil sich etwas in OpenSSL geändert hat. Im Forum findest Du sicherlich nach kurzer Suche auch dazu Tipps. Indy liegt ebenfalls auf dem Fulgan Mirror (ein Verzeichnis hoch, ZIP, IndyTiburon.zip). Du könntest theoretisch ältere DLLs einsetzen, damit Du Indy nicht aktualisieren mußt (~ bis OpenSSL 0.9.8e) - aber davon rate ich wegen bekannter Sicherheitslücken ab.

Gruß Assertor

BBoy 28. Mai 2009 17:27

Re: Indy: POP und SSL - wie?
 
Ich habe Indy Direct 10.1.5, und mir alle dll mal runtergeladen und probiert, aber keine davon funktioniert. Da ich einfach nur meine mails abragen will, würde ich gerne auf indy updates usw verzichten. Gibt es keine dll für meine version die ich einfach nutzen kann?

Assertor 28. Mai 2009 17:32

Re: Indy: POP und SSL - wie?
 
Zitat:

Zitat von BBoy
Ich habe Indy Direct 10.1.5, und mir alle dll mal runtergeladen und probiert, aber keine davon funktioniert. Da ich einfach nur meine mails abragen will, würde ich gerne auf indy updates usw verzichten. Gibt es keine dll für meine version die ich einfach nutzen kann?

Die aktuellen OpenSSL DLLs (0.9.8e bis 0.9.8k) benötigen - abgesehen von meinen früheren Backports - Indy 10.2.3 und neuer (z.B. in Delphi 2009).

Du kannst auf dem Fulgan Mirror in das Verzeichnis Archiv gehen - diese Dateien laufen auch mit den alten Indy Versionen. Aber: Ich empfehle dringen, dies nur zu machen, wenn man genau weiß, was man macht. Dies eröffnet u.U. ausnutzbare Sicherheitslücken für den Entwickler und eventuelle Kunden bzw. Nutzer. Also an alle anderen: Nicht nachmachen! ;)

Gruß Assertor

BBoy 28. Mai 2009 17:41

Re: Indy: POP und SSL - wie?
 
ok, danke das funktioniert jetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz