Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   SMTP-Mail zum 100sten mal (https://www.delphipraxis.net/188528-smtp-mail-zum-100sten-mal.html)

MarkSE 12. Mär 2016 21:33

SMTP-Mail zum 100sten mal
 
Guten Abend Freunde,
ich stehe seit Stunden wie Ochs am Berg und bekomme nicht ein einfaches Mail-Versand zum laufen. mal bekomme ich Socket-Error 11001 , mal 11004.
Bitte wenn jemand eine Idee hätte, wo ich daneben liege, wäre ewig dankbar.

unit Unit2; // mit XE7. Auch mit Delphi 7 angepasst und probiert >> das gleiche Problem
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP, Vcl.StdCtrls, IdMessage;
type
TForm2 = class(TForm)
senden: TButton;
IndySMTP: TIdSMTP;
IndyMessage: TIdMessage;
Memo1: TMemo;

procedure sendenClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.sendenClick(Sender: TObject);
var
m: TIdMessage;
begin
m := TIdMessage.Create(self);
m.Clear;
m.From.Address := 'info@xxx.de';
m.Recipients.EMailAddresses := 'info@yyyy.de;
m.Subject := 'sowasvonegal';
m.Body := Memo1.Lines;

// if IndySMTP.Connected then
// IndySMTP.Disconnect;
IndySMTP.Port := StrToInt('465');
IndySMTP.Host := 'smtp.strato.de';
IndySMTP.Username := 'info@xxx.de'; // wie Absender
IndySMTP.Password := 'pwpwpwpw';
IndySMTP.AuthType := TIdSMTPAuthenticationType.satDefault;

IndySMTP.Connect('1000');
IndySMTP.Authenticate;

if IndySMTP.Connected then // ab hier geht nicht mehr weiter :-(
try
IndySMTP.Send(m);

except
on E: Exception do
Writeln(E.Classname+ ' - ' + E.Message);
end;

IndySMTP.Disconnect;
showmessage('Das Mail wurde erfolgreich versendet!');
if IndySMTP.Connected then
IndySMTP.Disconnect;
end;
end.

BUG 12. Mär 2016 22:32

AW: SMTP-Mail zum 100sten mal
 
Hallo,

bevor jemand diesen Blob angucken muss ... benutze doch Delphi-Tags:
Code:
[DELPHI]
unit Unit2;
// ...
[/DELPHI]
Du kannst deinen Beitrag 24h Stunden lang ändern, der passende Beitrag dafür ist unter deinem Beitrag :wink:


EDIT: First!!! :mrgreen:

Luckie 12. Mär 2016 22:33

AW: SMTP-Mail zum 100sten mal
 
Fass den Quelltext mal in Delphi-Tags ein. Damit ist schon mal viel gewonnen auf dem Weg zur Hilfe. So ist dein Quelltext kaum lesbar.

Sir Rufo 12. Mär 2016 22:35

AW: SMTP-Mail zum 100sten mal
 
Lies dir den Thread http://www.delphipraxis.net/186912-i...tellungen.html durch, da gibt es auch eine komplette Implementation von mir.

Die ist so einfach zu verwenden wie ein normaler email-Client.

Probleme hier:
  • Keine Delphi-Tags verwendet
  • Kein IOHandler der die Kommunikation verschlüsselt. Bei Port 465 muss die aber verschlüsselt erfolgen

MarkSE 13. Mär 2016 07:10

AW: SMTP-Mail zum 100sten mal
 
Sorry Leute,
Anfänger behalten leider, wie in diesem Fall, ihr Attribut viel zu lang.
Ich habe hier gelöste Probleme eins-zu-eins übernommen: leider erfolgslos:-(
(sorry wegen Blob ohne Tags)
Delphi-Quellcode:
unit Unit2; // mit XE7. Auch mit Delphi 7 angepasst und probiert >> das gleiche Problem
 interface
 uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
 IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
 IdSMTPBase, IdSMTP, Vcl.StdCtrls, IdMessage;
 type
 TForm2 = class(TForm)
 senden: TButton;
 IndySMTP: TIdSMTP;
 IndyMessage: TIdMessage;
 Memo1: TMemo;

 procedure sendenClick(Sender: TObject);
 private
 { Private-Deklarationen }
 public
 { Public-Deklarationen }
 end;

 var
 Form2: TForm2;

 implementation

 {$R *.dfm}

 procedure TForm2.sendenClick(Sender: TObject);
 var
 m: TIdMessage;
 begin
  m := TIdMessage.Create(self);
  m.Clear;
  m.From.Address := 'info@xxx.de';
  m.Recipients.EMailAddresses := 'info@yyyy.de;
  m.Subject := 'sowasvonegal';
  m.Body := Memo1.Lines;

    // if IndySMTP.Connected then
    // IndySMTP.Disconnect;
  IndySMTP.Port := StrToInt('465');
  IndySMTP.Host := 'smtp.strato.de';
  IndySMTP.Username := 'info@xxx.de'; // wie Absender? Aber warum doppelt?
  IndySMTP.Password := 'pwpwpwpw';
  IndySMTP.AuthType := TIdSMTPAuthenticationType.satDefault;
  IndySMTP.Connect('1000');
  IndySMTP.Authenticate;

  if IndySMTP.Connected then // ab hier geht nicht mehr weiter
   try
    IndySMTP.Send(m);
   except
    on E: Exception do
    Writeln(E.Classname+ ' - ' + E.Message);
   end;

  IndySMTP.Disconnect;
  showmessage('Mail erfolgreich!');
  if IndySMTP.Connected then
    IndySMTP.Disconnect;
 end;
 end.
Jetzt vermute ich wenigstens, dass irgendwo/irgendwie die Verschlüsselung hingehört.
das Wo und Wie, in Paar Wochen weiss ich eventunel
Wahrscheinlich gleich beim connect:
Delphi-Quellcode:
Connect(smtpHostname, SslMode.Explicit);
Das mit Delphi-Tags tut weh, sorry viel mals

Sir Rufo 13. Mär 2016 07:35

AW: SMTP-Mail zum 100sten mal
 
Nochmal:

Wenn du dich über den Port 465 mit dem Mail-Server verbindest dann MUSS diese Verbindung verschlüsselt erfolgen. (Ich kann es leider nicht noch lauter schreiben).

Auszug aus meinem Code (aus dem Link)
Delphi-Quellcode:
  if Configuration.UseSSL
  then
    begin
      FSMTP.IOHandler := FSSLIOHandlerSocketOpenSSL; // <- SSL-IOHandler zuweisen
      if Configuration.UseStartTLS
      then
        begin
          FSMTP.UseTLS := utUseExplicitTLS; // <- UseTLS setzen
        end
      else
        begin
          FSMTP.UseTLS := utUseImplicitTLS; // <- UseTLS setzen
        end;
    end
  else
    begin
      FSMTP.IOHandler := nil; // <- wir brauchen keinen IOHandler
      FSMTP.UseTLS := utNoTLSSupport; // <- UseTLS setzen
    end;
Und hier die automatische Port-Einstellung aus meinem Code
Delphi-Quellcode:
TSendMailConfiguration = class
  private const
    DefaultPort = 25;
    DefaultImplicitTLSPort = 465;
    DefaultExplicitTLSPort = 587;
  ...
end;

procedure TSendMailConfiguration.SetDefaultPort;
begin
  if FUseSSL
  then
    begin
      if FUseStartTLS
      then
        FPort := DefaultExplicitTLSPort // 587
      else
        FPort := DefaultImplicitTLSPort // 465
    end
  else
    FPort := DefaultPort; // 25
end;

MarkSE 13. Mär 2016 10:45

AW: SMTP-Mail zum 100sten mal
 
Sir Rufo
Du hast meinen Sonntag gerettet.
Ich danke Dir massiv

MarkSE 13. Mär 2016 11:11

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von Sir Rufo (Beitrag 1332775)
Lies dir den Thread http://www.delphipraxis.net/186912-i...tellungen.html durch, da gibt es auch eine komplette Implementation von mir.

Die ist so einfach zu verwenden wie ein normaler email-Client.

Probleme hier:
  • Keine Delphi-Tags verwendet
  • Kein IOHandler der die Kommunikation verschlüsselt. Bei Port 465 muss die aber verschlüsselt erfolgen

Ich bin mit Deinem Rat merklich kluger, hätte auch gern Deine Komplette Implenetation sehen dürfen
Ich finde aber unter dem angegebenen Link, keine Implementation von Dir, muss wahrscheinlich weiter üben :-(

blawen 13. Mär 2016 11:47

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von MarkSE (Beitrag 1332792)
Ich bin mit Deinem Rat merklich kluger, hätte auch gern Deine Komplette Implenetation sehen dürfen
Ich finde aber unter dem angegebenen Link, keine Implementation von Dir, muss wahrscheinlich weiter üben :-(

Schau Dir insbesondere die Beiträge #12 und #20 an.

MarkSE 13. Mär 2016 15:49

AW: SMTP-Mail zum 100sten mal
 
Sir Rufo, was Du sagtest, leuchtete ein und ich dachte die Lösung verstanden zu haben.

Habe auch den IOHandler und utUseImplizitTLS eingebaut (Port 465) ged aber trotzdem nix.
Delphi-Quellcode:
procedure TForm2.sendenClick(Sender: TObject);
var
   m: TIdMessage;
begin
       m := TIdMessage.Create(self);
       m.Clear;
       m.From.Address := 'info@xxxx.de';
       m.Recipients.EMailAddresses := 'infoqyyyy.de';
       m.Subject := 'würscht';
       m.Body := Memo1.Lines;

       IndySMTP.IOHandler:=IdSSLIOHandlerSocketOpenSSL1; //  <<<<<<
       IndySMTP.UseTLS:=utUseImplicitTLS;                //  <<<<<<

       //     if IndySMTP.Connected then
       //       IndySMTP.Disconnect;
     IndySMTP.Port := StrToInt('465');
     IndySMTP.Host :='smtp.strato.de';
     IndySMTP.Username := 'DasGleicheWieBeimFrom';
     IndySMTP.Password := edPW.Text;
     IndySMTP.AuthType := TIdSMTPAuthenticationType.satDefault;

     IndySMTP.Connect('1000'); //hier erhalte ich Socket-fehler 11001 
                                //host nicht gefunden

     IndySMTP.Authenticate;

if IndySMTP.Connected then
   try
       IndySMTP.Send(m);

   except
      on E: Exception do
         Writeln(E.Classname+ ' - ' + E.Message);
   end;

end;
end.
bekomme immer Socket fehler 11001 Host nicht gefunden:(
Das ganze nun mit XE7
Bitte schau Dir das nochmal an

mjustin 13. Mär 2016 16:22

AW: SMTP-Mail zum 100sten mal
 
Eine ganz einfache SMTP / SSL Komponente habe ich mal aus Embarcadero und Delphi-Praxis Code zusammengetragen und hier veröffentlicht:

https://mikejustin.wordpress.com/201...-applications/

Sie unterstützt mehrere AuthTypes, ob das aber den Connect Fehler behebt kann ich nicht sagen.

Existiert smtp.strato.de denn? Kann man den Server anpingen oder mit einem anderen Mailclient (Thunderbird) ansprechen?

dataspider 13. Mär 2016 20:06

AW: SMTP-Mail zum 100sten mal
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
IndySMTP.Connect('1000');
Wozu ist die '1000'?

Bei den überladenen Methoden die er mir anzeigt (Anhang) will er das wohl als Host verwenden.

Das kann IMHO nicht funktionieren.

Versuch es mal nur mit:
Delphi-Quellcode:
IndySMTP.Connect;
Frank

MarkSE 15. Mär 2016 11:37

AW: SMTP-Mail zum 100sten mal
 
Hallo dataspider,
1000 = 1 Sekunde
connect allein dauert viele Sekunden bevor die gleiche Fehlermeldung erscheint
Ich bekomms einfach nicht hin:-(

dataspider 15. Mär 2016 11:52

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von MarkSE (Beitrag 1332966)
1000 = 1 Sekunde

Wenn du das gleiche Indy wie ich hast, dann verwendet er '1000' als Host anstatt 'smtp.strato.de'.

Deshalb der Screenshot mit der Methode Connect.
Ruft doch mal ohne den Parameter auf...

Kannst dir ja mal den Code hier laden.
Damit bekomme ich Mails mit Strato raus.


Frank

mjustin 15. Mär 2016 12:40

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von MarkSE (Beitrag 1332966)
Hallo dataspider,
1000 = 1 Sekunde
connect allein dauert viele Sekunden bevor die gleiche Fehlermeldung erscheint
Ich bekomms einfach nicht hin:-(

Delphi-Quellcode:
IndySMTP.Connect('1000');
Warum würde man einen Timeout-Wert als String übergeben? :gruebel:

Im Indy Sourcecode der Unit IdTCPClient kann man die overloads der Connect Methode nachlesen, und da ist nur optional der Host und der Port als Parameter vorgesehen.

vagtler 15. Mär 2016 12:53

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von mjustin (Beitrag 1332970)
[...] Im Indy Sourcecode der Unit IdTCPClient kann man die overloads der Connect Methode nachlesen [...]

Das wäre jetzt aber doch wirklich zu einfach, meinst Du nicht?

nahpets 15. Mär 2016 13:08

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von vagtler (Beitrag 1332971)
Zitat:

Zitat von mjustin (Beitrag 1332970)
[...] Im Indy Sourcecode der Unit IdTCPClient kann man die overloads der Connect Methode nachlesen [...]

Das wäre jetzt aber doch wirklich zu einfach, meinst Du nicht?

Doch, es ist so einfach:

Unter Delphi 7 finde ich:
Delphi-Quellcode:
Connect;
Connect('Host');
Connect('Host',Port);
Es käme also auf den Versuch an:
Statt
Delphi-Quellcode:
Connect('1000');
nehme man
Delphi-Quellcode:
Connect('smtp.strato.de');
Funktioniert dies, nehme man
Delphi-Quellcode:
Connect;
Klappt bei mir wunderbar ;-)

mjustin 15. Mär 2016 13:10

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von vagtler (Beitrag 1332971)
Zitat:

Zitat von mjustin (Beitrag 1332970)
[...] Im Indy Sourcecode der Unit IdTCPClient kann man die overloads der Connect Methode nachlesen [...]

Das wäre jetzt aber doch wirklich zu einfach, meinst Du nicht?

Zitat:

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher."
:-D

MarkSE 15. Mär 2016 18:11

AW: SMTP-Mail zum 100sten mal
 
Zitat:

Zitat von mjustin (Beitrag 1332973)
Zitat:

Zitat von vagtler (Beitrag 1332971)
Zitat:

Zitat von mjustin (Beitrag 1332970)
[...] Im Indy Sourcecode der Unit IdTCPClient kann man die overloads der Connect Methode nachlesen [...]

Das wäre jetzt aber doch wirklich zu einfach, meinst Du nicht?

Zitat:

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher."
:-D

Frank, das wars wirklich mit connect. Danke Leute.
Sir hat recht: kaum macht mans richtig, schon die 3 Nächte Ärger sind vergessen.
ich kam, sah und (ver-) kodierte ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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