AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SMTP SSL mit Indy10

Ein Thema von Bemano · begonnen am 13. Jan 2014 · letzter Beitrag vom 25. Mai 2021
Antwort Antwort
Bemano

Registriert seit: 4. Sep 2006
2 Beiträge
 
#1

SMTP SSL mit Indy10

  Alt 13. Jan 2014, 08:53
Hallo zusammen,

der Tatsache geschuldet, dass nun immer mehr E-Mail-Provider dazu übergehen, ausschließlich SSL-verschlüsselte Mails anzunehmen, muss ich meinen E-Mail-Versand im Programm anpassen. Dafür habe ich mich nun zum ersten Mal mit SSL beschäftigt.

Ich bekomme in meinen Testprojekt die E-Mails erfolgreich versandt. Dazu verwende ich die Komponenten

- TIdSMTP
- TIdSSLIOHandlerSocketOpenSSL und
- TIdMessage

Auf meiner Oberfläche kann man aktuell wählen, ob

- SSL genutzt werden soll oder nicht
- und wenn SSL verwendet werden soll, welcher "UseTLS"-Typ genommen werden soll (utUseExplicitTLS, utUseImplicitTLS, utUseRequireTLS)

Nun ergibt sich dazu eine Frage:

In den mir bekannten Programmen muss der User nicht zwischen den "UseTLS"-Typen entscheiden. Hier vor möchte ich meine Anwender eigentlich auch bewahren. Daher möchte ich gerne herausfinden, welchen Typ ich verwenden muss. Doch leider habe ich hierzu bisher nichts hilfreiches gefunden. Hat jemand eine Ahnung?

Code:
procedure TfrmMain.InitSendMail;
begin
  // Komponenten erzeugen
  if not Assigned(IndySMTP)      then IndySMTP      := TIdSMTP.Create(Application);
  if not Assigned(IndyMessage)   then IndyMessage   := TIdMessage.Create(Application);
  if not Assigned(IndySSLHandler) then IndySSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Application);

  if not cbSSL.Checked then
  begin
    IndySMTP.IOHandler := nil; // nicht benötigt
    IndySMTP.UseTLS := utNoTLSSupport;
  end
  else
  begin
    // SSLHandler inititlisieren
    IndySSLHandler.MaxLineAction         := maException;
    IndySSLHandler.SSLOptions.Method     := sslvTLSv1;
    IndySSLHandler.SSLOptions.Mode       := sslmUnassigned;
    IndySSLHandler.SSLOptions.VerifyMode := [];
    IndySSLHandler.SSLOptions.VerifyDepth := 0;

    IndySMTP.IOHandler := IndySSLHandler;
  end;

  // Verbindungsdaten setzen
  IndySMTP.Host := edtHost.Text;
  IndySMTP.Port := StrToInt(edtPort.Text);
  if cbSSL.Checked then
  begin
    // https://forums.embarcadero.com/message.jspa?messageID=528772
    if cbbSSLType.Text = 'Explicit' then IndySMTP.UseTLS := utUseExplicitTLS;
    if cbbSSLType.Text = 'Implicit' then IndySMTP.UseTLS := utUseImplicitTLS;
    if cbbSSLType.Text = 'Require' then IndySMTP.UseTLS := utUseRequireTLS;
  end;

  if (edtUser.Text = '') and (edtPassword.Text = '') then
    IndySMTP.AuthType := satNone
  else begin
    IndySMTP.AuthType := satDefault;
    IndySMTP.Username := edtUser.Text;
    IndySMTP.Password := edtPassword.Text;
  end;

end;


function TfrmMain.SendMail: String;
begin
  Result := '';
  Screen.Cursor := crHourGlass;
  try

    with IndyMessage do
    begin
      Clear;
      From.Name                := edtSender.Text;
      From.Address             := edtSenderAdress.Text;
      Recipients.EMailAddresses := edtRecipient.Text;
      Subject                  := edtSubject.Text;

      ContentType := 'Multipart/Alternative';

      Body                     := mmMessage.Lines;
    end;

    // mit SMTP verbinden
    IndySMTP.Connect;

    if IndySMTP.Connected then
    begin
      IndySMTP.Send(IndyMessage);
      IndySMTP.Disconnect;
      MessageDlg('Die E-Mail wurde erfolgreich versandt.', mtInformation, [mbOK], 0);
    end;

  except
    on E: Exception do
    begin
      Result := E.Message;
      if IndySMTP.Connected then IndySMTP.Disconnect;
    end;
  end;
  Screen.Cursor := crDefault;
end;

Kleine Nebenfrage dazu:
Laut den Dokumentationen müssen entsprechende DLLs von Indy mit benutzt werden. Hierfür gibt es aber 32- und 64-Bit DLLs. Orientiert sich die benötigten Bit-Version in diesem Fall am Betriebssystem oder an der Bit-Version meiner Anwendung?

Ich danke euch für eure Unterstützung.

Viele Grüße,
bemano
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.250 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: SMTP SSL mit Indy10

  Alt 22. Jan 2014, 08:26
gleiche Frage, immer mehr Provider stellen auf SSL um (z.B. 1und1). Was muss man machen auch in Hinsicht auf Multiplattform App, da geht ja bekanntlich keine DLL!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

AW: SMTP SSL mit Indy10

  Alt 22. Jan 2014, 09:19
Die Unterscheidung der Einstellungen kann zum Teil schon über den gewählten Port (465 oder 587) geschehen:

Zitat:
For SSL on port 465, the server expects your client to initiate an SSL handshake immediately upon connecting, before the server then sends an encrypted Greeting. UseTLS=utUseImplicitTLS does that, but UseTLS=utUseExplicitTLS does not. When UseTLS=utUseExplicitTLS, TIdSMTP will expect the server to send an unencrypted Greeting immediately, which would explain the hang in select() - the server is not sending any data!

For TLS on port 587, the server is expecting the client to connect initially unencrypted and then send an explicit STARTTLS command when it is ready to initiate encryption. UseTLS=utUseExplicitTLS does that, but UseTLS=utUseImplicitTLS does not.

http://stackoverflow.com/questions/1...77518#11677518

In einer (älteren) Indy Dokumentation wird auch noch auf die Capabilities Property hingewiesen:

Zitat:
Use Capabilities to determine if the server supports use of StartTLS prior to performing authentication for the SMTP session.
("Zur Verschlüsselung über SSL/TLS wird heute das STARTTLS-Kommando empfohlen. Es läuft auf dem gleichen TCP-Port wie unverschlüsseltes SMTP. Alternativ kann SMTP über SSL (SMTPS) verwendet werden und benötigt einen eigenen TCP-Port, hierfür hat sich 465 eingebürgert." - SMTP)
Michael Justin
habarisoft.com

Geändert von mjustin (22. Jan 2014 um 09:24 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#4

AW: SMTP SSL mit Indy10

  Alt 9. Aug 2014, 10:53
Sourcecode basierend auf zwei anderen Quellen habe ich hier ins Netz gestellt:

Use Indy to send secure SMTP email from Delphi apps
http://mikejustin.wordpress.com/2014...-applications/

Entwickelt und getestet mit Indy 10.6 und Delphi 2009 sowie Free Pascal / Lazarus.
Michael Justin
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#5

AW: SMTP SSL mit Indy10

  Alt 2. Mär 2017, 17:30
Hi, ich ziehe diesen Beitrag mal wieder hoch, das es a) um dieses Thema geht und b) auch um den von mjustin veröffentlichen Code.

Ich habe ein Projekt welches aus zwei Programmen besteht. Programm A ist der Server. Er soll per SMTP-Server E-Mails empfangen und diese auch per SMTP weiterleiten. Und ein Programm B, das ist der Client, welcher E-Mails an Programm A schicken soll.

Folgender Fehler tritt auf: Wenn der Client eine E-Mail an der Server schicken soll, löst das SMTP.Connect die Fehlermeldung "10061-Verbindung abgebrochen" aus.

Das wäre ansich jetzt erst mal ein Fehler meinerseits. Denn entweder ist in meinem SMTP-Server ein Fehler, oder eben der SMTP-Client, in dem ich die IndySecureMailclient in leicht abgeänderter Form verwende.

Nun ist es aber so, dass der Server problemlos E-Mail empfangen kann, die ich per Outlook an ihn sende und gleichermaßen der Client problemlos an den SMTP-Host von 1und1 senden kann, und ich somit keinen von beiden explizit als Fehlerhaft identifizieren kann.

Ich habe mal den betreffenden Source und die von mir (wie gesagt leicht veränderte) IndySecureMailClient.pas angehängt. Der SMTPServer ist bewußt noch sehr rudimentär gehalten, weil ich auch erst mal ohne SSL an diesen senden will (was mit Outlook auch funktioniert).

Vielleicht fällt einem von euch der Fehler auf, den ich gemacht habe. Denn ich fange grad erst an mich mit dem Indy-SMTP-Geraffel zu beschäftigen.

Gruß Hobbycoder
Angehängte Dateien
Dateityp: rar Fehler10061.rar (5,2 KB, 55x aufgerufen)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#6

AW: SMTP SSL mit Indy10

  Alt 2. Mär 2017, 18:24
Ich antworte mir mal selber

Wie sooft sitzt das Problem meist vorm Rechner

Ich war in der Annahme, dass der IdSMTPServer per Default sich auf 0.0.0.0 bindet. Ein Trugschluss. Im Code nachgeholt....schon geht's
  Mit Zitat antworten Zitat
Magnus

Registriert seit: 22. Dez 2002
8 Beiträge
 
#7

AW: SMTP SSL mit Indy10

  Alt 25. Mai 2021, 07:04
Ich habe gerade gemäß Deinem Beispiel in meinem Programm einen TLS Mailversand programmiert. Das funktioniert auch so wie es soll. Es gibt aber einen Schönheitsfehler:

Wenn ich eine Mail schicke, ploppt eine Windowsmeldung auf, ich solle eine Smartcard wählen. Diese Aufforderung kommt mehrfach. Ich kann sie alle "Abbrechen" und die Mail wird verschickt.

Im Code konnte ich feststellen, dass diese Meldungen nicht beim Connect sondern beim Send ausgelöst werden.

Wie werde ich diese Meldungen los?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz