Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr.
Seite 1 von 2  1 2      

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