Entwickler-Ecke

Internet / Netzwerk - Indy email Versand


oldprofiprog - Fr 10.03.17 13:16
Titel: Indy email Versand
Hallo,
ich versende emails über Indy IdSMTP.
Das funktioniert bei einem reinen Smtp Server (pop3) problemlos.

Jetzt möchte ich email über Tonline Server versenden.
Ich gehe davon aus, dass der Versand auch über SMTP erfolgt.
Der Postausgangsserver ist securesmtp.t-online.de.
Das funktioniert aber so nicht nicht.
Die Fehlermeldung verlangt ein StartTLS Command.
Hat wer einen Tip wie ich das hinbekomme?

Für einen Tip dankbar.
Gruß Peter


Delete - Fr 10.03.17 13:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


haentschman - Fr 10.03.17 13:43

Moin... :P
...da wirst du auch noch einen IdSSLIOHandler... brauchen. :wink:


oldprofiprog - Fr 10.03.17 14:36

Mit Port 587 habe ich mal probiert Fehler ist unveränderd.
Ich habe wie in Outlook dann Port 465 eingestellt.
Hier ist der StartTLS Fehler weg.
Das Programm bleibt beim Connect längere Zeit hängen.
Im except wird "Connect erfolgreich geschlossen" angezeigt.

Im idSMTP habe ich utNoTLSSupport eingestellt.

Ich möchte eigentlich nur email über t-online versenden.
Am Liebsten wäre mir, wenn ich irgendwo ein Stück Code für diese Aufgabe finde.

Gruß Peter


Delete - Fr 10.03.17 15:39

- Nachträglich durch die Entwickler-Ecke gelöscht -


Narses - Fr 10.03.17 16:43

Moin!

user profile iconoldprofiprog hat folgendes geschrieben Zum zitierten Posting springen:
Im idSMTP habe ich utNoTLSSupport eingestellt.
Kurz zur Erläuterung: Die Fehlermeldung vom T-Online-SMTP bedeutet, dass dieser nur verschlüsselt mit dir sprechen möchte. :think: Das ist auch gut so, denn wir wollen ja keine Spammer unterstützen und ihnen das Leben unnötig leicht machen. ;)

Wenn du also explizit der Indy-Komponente das TLS-Protokoll verbietest, dann wird das nie klappen. :nixweiss: Aber auch wenn du es erlaubst, klappt das nur dann, wenn Indy die SSL-Bibliothek, die dafür nötig ist, nutzen kann. Dazu ist der IdSSLIOHandler da (und die SSL-DLLs brauchst du natürlich auch). Such mal danach, dann kommst du weiter. :les:

cu
Narses


oldprofiprog - Fr 10.03.17 19:05

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wer suchet der findet auch. Oder du zeigst uns dein bisheriges Beispiel


Das ist wohl das kleinste Problem,
hier ist der Quellcode.

Schade ich hatte gehofft, hier schneller eine brauchbare Lösung zu finden.
Dann werde ich mich mal auf die Suche machen.

Vielen Dank
Peter


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
function TDataModMail.SendEmail(Recipient, CCList, sSubject: string;
  Body: TStrings; Anlage: string): boolean;
var
  plainText: TIdText;
begin
  idMessage.MessageParts.Clear;
  idSMTP.Host     := Host;
  idSMTP.Username := User;
  idSMTP.Password := Password;
  idSMTP.Port     := Port;

  idMessage.From.text  := emailAbsender;
  idMessage.Sender.text:= idMessage.From.text;

  idMessage.Recipients.EMailAddresses:= Recipient;
  idMessage.CCList.EMailAddresses    := CCList;
  idMessage.Subject                  := sSubject;
  plainText := TIdText.Create(IdMessage.MessageParts, nil);
  plainText.Body.Text := Body.Text;
  plainText.ContentType := 'text/plain';
  plainText.CharSet := 'ISO-8859-1';
  plainText.ContentTransfer := 'BASE64';
  plainText.ContentDisposition := 'inline';


 if length(Trim(Anlage)) > 0 then
   TIdAttachmentFile.Create(idMessage.MessageParts, Anlage );

 try
   idSMTP.Connect;
   idSMTP.Send(idMessage);
   idSMTP.Disconnect;
   result:=True;
   except on E : Exception do
     begin
       showmessage(E.ToString);

       if idSMTP.connected then try idSMTP.disconnect; except end;
       result := false;
     end;
 end;
 idMessage.MessageParts.Clear;
end;


oldprofiprog - Di 21.03.17 19:04

So das Problem ist gelöst.
Diese Variante funktioniert.
1. Port 465 verwenden.
2. SSL - Dll (für die richtige Indy Version) finden und in den gleichen Ordner wie das Programm kopieren.
3. SSL Handler initialisieren

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
        SSLHandler.SSLOptions.Method := sslvSSLv23; 
        SSLHandler.SSLOptions.Mode := sslmClient;
        SSLHandler.SSLOptions.VerifyMode := [];
        SSLHandler.SSLOptions.VerifyDepth := 0;
        SMTP.IOHandler := SSLHandler;
        if edSMTPPort = 587 then
          SMTP.UseTLS := utUseExplicitTLS
        else
          SMTP.UseTLS := utUseImplicitTLS;


Ich frage mich aber echt wo eigentlich noch Sinn und Nutzen dieses Forums liegt.

Keine Antwort war irgendwie zielführend.
Eine Antwort sinngemäß Ich weiß wie es geht, verrate das aber nicht.
(
Zitat:
IdSSLIOHandler da (und die SSL-DLLs brauchst du natürlich auch). Such mal danach, dann kommst du weiter.
)
Zitat:
...da wirst du auch noch einen IdSSLIOHandler... brauchen.

Ein Sammler der den Quellcode haben wollte.
Zitat:
Wer suchet der findet auch. Oder du zeigst uns dein bisheriges Beispiel.


Sorry ist nicht böse gemeint.
Früher war es in den Foren kommunikativer.
Es ist wohl langsam Zeit, meinen Acount hier zu löschen. (Wie geht das eigentlich?)

Gruß
Peter


Delete - Di 21.03.17 19:18

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Di 04.04.17 03:24

Ich habe dieses Thema eigentlich nur zufällig angeklickt und finde die letzte Antwort von oldprofiprog ziemlich irritierend.

Klar gibt es einerseits Leute, die in Foren Komplettlösungen erwarten und andererseits auch welche, die solche Lösungen hätten, aber nicht verraten wollen. Hier kann ich das so nicht entdecken. Es ist aber nun mal so, daß eine bloße Problembeschreibung ohne auch nur einen Fetzen Quellcode jeden im Dunklen läßt, der helfen will.

Mir beispielsweise genügen meist Lösungsansätze, die sich auf das Wesentliche konzentrieren. Es ist nämlich grundsätzlich besser, dann damit rauszufinden, wie es geht und es für die Zukunft zu wissen, statt an einer Komplettlösung zu verzweifeln, der man inhaltlich nicht folgen und sie entsprechend auch nicht den eigenen Vorstellungen anpassen kann.

Insofern finde ich es doch eher schön, daß oldprofiprog seine Lösung hier anderen mit einem ähnlichen Problem verfügbar macht, statt daß er so reagiert hätte, wie es in vielen anderen Foren zu finden ist. Da steht dann oft einfach nur, jemand hätte nun selbst eine Lösung gefunden, verschweigt sie aber. Und all die Ratlosen, die z.B. googlen und auf solche Beiträge stoßen, die dann auch noch als "gelöst" hingelogen werden, sind nicht klüger als vorher.

Ganz anders als oldprofiprog offenbar bin ich mit diesem Forum hier weitgehend zufrieden. Es kommt eben immer drauf an, welche Ansprüche man hat bzw. wie genügsam man ist. Mich stört beispielsweise manchmal ein Überangebot an Ratschlägen eher als eine karge, aber zielführende Antwort. Besonders schlimm empfinde ich z.B. solche Sachen wie zig Stellungnahmen der Art "iframes und frames sind doch sowas von out" usw., mit denen entsprechend speziell zu solchem Thema Ratsuchenden überhaupt nicht geholfen ist.


jaenicke - Di 04.04.17 08:45

user profile iconoldprofiprog hat folgendes geschrieben Zum zitierten Posting springen:
Keine Antwort war irgendwie zielführend.
Nun ja, wenn du mit dem Stichwort nicht weiterkommst, könntest du ja nachfragen.

Die Suche in der Delphi Dokumentation liefert eine schöne Seite:
Suche bei Google DOCWIKI IDSSLIOHANDLER
http://docwiki.embarcadero.com/RADStudio/XE8/en/Securing_Indy_Network_Connections

Und wenn ich mal nach dem Stichwort in der zweiten Antwort in Kombination mit deiner Anfrage (es geht ja um Delphi und SMTP) suche:
Suche bei Google DELPHI SMTP IDSSLIOHANDLER
Dann findet sich dort einiges, z.B. als erstes:
http://www.delphipraxis.net/178523-smtp-ssl-mit-indy10.html
Und dort unter anderem neben Infos ein Link auf eine Klasse zur Kapselung:
https://mikejustin.wordpress.com/2014/07/27/send-secured-smtp-email-from-delphi-applications/
Die macht genau was du nun gemacht hast:
Zitat:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TSSLEmail.AddSSLHandler;
var
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
  // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
  SSLHandler.SSLOptions.Method := sslvSSLv23;
  SSLHandler.SSLOptions.Mode := sslmClient;
  SSLHandler.SSLOptions.VerifyMode := [];
  SSLHandler.SSLOptions.VerifyDepth := 0;
  SMTP.IOHandler := SSLHandler;
end;


oldprofiprog - Mi 05.04.17 10:35

Nun lasst es gut sein, das Problem ist ja gelöst.

Es ging darum in einem Freeware-Programm, welches ich vor 15 Jahren geschrieben habe,
die email Übertragung (Teilnahmebestätigung) auf SSL zu ändern.
Letztendlich ging es nur um die richtige Komponente, deren Parameter Versorgung,
sowie die benötigten dll.
Mit dem richtigen Stichwort oder Link hätte ich eine Lösung halt schneller gefunden.

Meine Delphi-Version ist XE2 und auf diesem Stand werde ich auch in Zukunft bleiben.
Jenseits des aktiven Berufslebens, sind meine Ambitionen weniger bei Programmierung und Delphi,
sondern eher bei Photoshop und Garten angesiedelt.


Klaus Müller - Sa 15.04.17 11:48

Hallo,

Habe leider das gleich Problem.
Ein altes Proramm welches eine Benutzermaske hat wo der User Daten eingibt.
Diese werden dann per email gesendet.

Habe nun wie von oldprofiprog beschrieben:

1. Die Kasse: https://mikejustin.wordpress.com/2014/07/27/send-secured-smtp-email-from-delphi-applications/
2. Die DLLs: http://docwiki.embarcadero.com/RADStudio/XE8/en/Securing_Indy_Network_Connections


geholt und installirt.
Bekomme jetzt die Fehlemelddung:
"Die Verbindung wurde erfolgreich geschossen."

leider komme ich hier nicht mehr weiter, da ich mit dieser Fehlermeldung nicht anfangen kann.
Kennt das jemand?


jaenicke - Sa 15.04.17 13:09

Das ist normalerweise kein Fehler, sondern lediglich eine Benachrichtigung, dass die Verbindung planmäßig geschlosen wurde. Wo passiert denn das und wie sieht dazu der Code aus?


Klaus Müller - Sa 15.04.17 19:33

Hallo Sebastian,

Hier noch mal die Source:
Habe nun wie von oldprofiprog beschrieben:

1. Die Kasse: https://mikejustin.wordpress.com/2014/07/27/send-secured-smtp-email-from-delphi-applications/
2. Die DLLs: http://docwiki.embarcadero.com/RADStudio/XE8/en/Securing_Indy_Network_Connections


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
Function Sende_Email(RegKey:string;Mode:Byte):Boolean;
Var //Mail: TSSLEmail;
    Mail: TSSLEmail;
    VSubject:String;
    VBody:TStringlist;
    //VSSLEmail : TSSLEmail;
Begin


//---------------------------------------------
//Uses IndySecureMailClient
//---------------------------------------------

  VBody:= TStringlist.Create;
  GibBody(VBody,VINI,RegKey);

  Try
    Mail := TSSLEmail.Create(C_Host, 465,C_Username, C_Password);

    try
      Mail.edSenderName := 'Setup';
      Mail.edSenderEmail := Vini.Email;
      Mail.edToEmail := C_Recipient;
      Mail.edSubject := VSubject;
      Mail.edBody := VBody;

      Mail.SendEmail;
    finally
      Mail.Free;
    end;
  Finally
    VBody.Clear;
    VBody.Free;
  End;
End;


Leider kommt die Meldung nach der ausführung der Funktion (Sende_Email) und im Debug modus pasiert nichts?

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Klaus Müller - So 16.04.17 10:44

Hallo Sebastian,

Habe mich noch mal eingehend mit dem Problem beschäftigt und einen anderen Ansatz genommenen.
Das Problem ist wahrscheinlich das die Objekte nicht alle initialisiert waren.

Hier meiner Sourcecode der Funktioniert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
{
Uses
  IdMessage,IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP,
  IdEMailAddress;
}


Function Sende_Email(RegKey:string;Mode:Byte):Boolean;
Var VSubject:String;
    VBody:TStringlist;
    VIdSMTP:TIdSMTP;
    VIdMessage: TIdMessage;
Begin
  Result:= False;

  case Mode of
  1: VSubject := C_Bestellung;
  2: VSubject := C_Registrierung;
  end;

  //Objekte erzeugen
  VBody:= TStringlist.Create;
  VIdSMTP:= TIdSMTP.Create;
  VIdMessage:= TIdMessage.Create;

  try
    GibBody(VBody,VINI,RegKey);

    //Authentifizierung
    VIdSMTP.AuthType := TIdSMTPAuthenticationType.satDefault;

    //Benutzerdaten für Authentifizierung
    VIdSMTP.Username := C_Username;
    VIdSMTP.Password := C_Password;

    //Server-Daten
    VIdSMTP.Host := C_Host;
    VIdSMTP.Port := 25;

    VIdSMTP.Connect;
    Try
      VIdMessage.From.Address := VINI.Email;
      VIdMessage.Recipients.EMailAddresses := C_Recipient;
      //IdMessage.CCList.EMailAddresses := edCC.Text;
      //IdMessage.BCCList.EMailAddresses := edBCC.Text;
      VIdMessage.Subject := VSubject;
      VIdMessage.Body := VBody;
      VIdSMTP.Send(VIdMessage);
      Result:= True;
    Finally
      VIdSMTP.Disconnect;
    End;
  finally
    VIdSMTP.Free;
    VIdMessage.Free;
    VBody.Free;
  end;
End;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Daniel_DT - Do 04.05.17 10:17

user profile iconKlaus Müller hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

Habe leider das gleich Problem.
Ein altes Proramm welches eine Benutzermaske hat wo der User Daten eingibt.
Diese werden dann per email gesendet.

Habe nun wie von oldprofiprog beschrieben:

1. Die Kasse: https://mikejustin.wordpress.com/2014/07/27/send-secured-smtp-email-from-delphi-applications/
2. Die DLLs: http://docwiki.embarcadero.com/RADStudio/XE8/en/Securing_Indy_Network_Connections


geholt und installirt.
Bekomme jetzt die Fehlemelddung:
"Die Verbindung wurde erfolgreich geschossen."

leider komme ich hier nicht mehr weiter, da ich mit dieser Fehlermeldung nicht anfangen kann.
Kennt das jemand?

Habe das gleiche Problem. Keiner ne Lösung?