Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019 (https://www.delphipraxis.net/210488-mail-via-indy-klappt-auf-windows-10-aber-nicht-auf-windows-server-2019-a.html)

MichaMD 29. Apr 2022 23:10

Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Moin,
Ich habe ein für mich seltsames Problem,
Ich habe eine auf Indy basierende Fragebogenabgabe erstellt(mit CE 10.4), welche auf verschiedenen Windows 10 Pcs funktioniert, sobald ich die exe(und die ssleay32.dll sowie libeay32.dll) jedoch auf Windows Server 2019 ziehe funktioniert alles bis auf den Email versand. Ich finde jedoch nichts zu bekannten Problemen diesbezüglich und 10.4 soll Windows Server 2019 unterstützen.

Ergänzung:
Die Windows 10 Pcs sind meine also mit Adminrechten, für Windows Server 2019 habe ich es auf einem Arbeitsrechner getestet, wo ich keinen Adminzugriff habe und wenig Infos oder Einfluss auf Netzwerkeinstellungen etc..

Anbei stark reduziert der Code:

Delphi-Quellcode:
unit Hauptunit;

interface

Uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls, System.UITypes, Mail;

type
  TForm1 = class(TForm)  
    btn_Abgeben: TButton;
    procedure btn_AbgebenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn_AbgebenClick(Sender: TObject);
var
  Abgeben:integer;
  BodyList:TStringList;
  AttachmentList:TStringList;
  Absender:string;
  Empfänger:String;
  Betreff:string;
begin
   BodyList:=TStringList.Create;
   AttachmentList:=TStringList.Create;
       try
   begin
       BodyList.Add(******);
                 AttachmentList.Add(ExtractFilePath(Application.Exename) + '*******csv');
                  Absender:=**********@*******.de;
                  Empfänger:=******@*******.de;
                  Betreff:=***********;
                  if Form2.SendMail(Absender,Empfänger,Betreff,BodyList,AttachmentList) then
                    begin
                      showmessage('Abgabe erfolgreich');
                    end;
   end;
       finally
   begin
       BodyList.Free;
              AttachmentList.Free;
   end;
Delphi-Quellcode:
unit Mail;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,            
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdIOHandler, IdIOHandlerSocket,
  IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
  IdSMTPBase, IdSMTP, IdMessage, IdAttachment, IdAttachmentFile;

type
  TForm2 = class(TForm)
    IdSMTP: TIdSMTP;
    IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
    IdMessage: TIdMessage;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Function SendMail(Absender:string; Empfänger:string; Betreff:String; Nachricht:TStringList; Anhang:TStringlist):Boolean;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

Function TForm2.SendMail(Absender:string; Empfänger: string; Betreff: string; Nachricht: TStringlist; Anhang: TStringlist): Boolean;
var
  Mes:TIdMessage;
  Attachment:TIdAttachment;
  i:integer;
begin
  Mes:=TIdMessage.Create(self);
  try
    begin
      with Mes do
        begin
          Clear;
          ContentType:='multipart/*';
          From.Address:=Absender;
          Recipients.EMailAddresses:=Empfänger;
          Subject:=Betreff;
          Body:=Nachricht;

          if Anhang.Count <> 0 then
            begin
              for i := 0 to Anhang.Count-1 do
                begin
                  Attachment:=TIdAttachmentFile.Create(Mes.MessageParts,Anhang[i]);
                end;
            end;
        end;

      if IdSMTP.Connected then IdSMTP.Disconnect;

      IdSMTP.Port:=587;
      IdSMTP.UseTLS:=utUseExplicitTLS;
      IdSMTP.Host:=******@****.de;
      IdSMTP.Username:=*********;
      IdSMTP.Password:=********************;
      IdSMTP.AuthType:=TIdSMTPAuthenticationType.satDefault;

      IdSMTP.ConnectTimeout:=1000;
      IdSMTP.Connect;
      IdSMTP.Authenticate;

      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        begin
          result:=false;
        end;
      end;
    end;
  finally
    begin
      IdSMTP.Disconnect;
      Attachment.Free;
      Mes.Free;
    end;
  end;
end;
end.

hoika 30. Apr 2022 05:38

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Hallo,
was kommt denn im try except als Fehlermeldung?

Delphi.Narium 30. Apr 2022 08:55

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Zitat:

Zitat von hoika (Beitrag 1505295)
Hallo,
was kommt denn im try except als Fehlermeldung?

Delphi-Quellcode:
      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        begin
          result:=false;
        end;
      end;
Solche Konstrukte sind meiner Meinung nach verantwortungslos.
Delphi-Quellcode:
      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        on e : Exception do
        begin
          result := false;
          MessageDlg(e.Message,mtError,[mbOk],0);
          // oder zumindest einen Eintrag in 'ner Log-Datei, einem Protokoll, ...
        end;
      end;
Auch in btn_AbgebenClick könnte das Abfangen einer Exception hilfreich sein.

In SendMail werden nur Fehler beim
Delphi-Quellcode:
IdSMTP.Send(Mes);
abgefangen, aber letztlich ignoriert. Die Fehlerursache könnte aber durchaus auch z. B. beim
Delphi-Quellcode:
Attachment := TIdAttachmentFile.Create(Mes.MessageParts,Anhang[i]);
oder beim
Delphi-Quellcode:
IdSMTP.Connect;
oder beim
Delphi-Quellcode:
IdSMTP.Authenticate;
oder beim ... liegen.

Aus dem Code ist beim besten Willen nicht zu erkennen, was denn hier ggfls. falsch laufen könnte.

EmWieMichael 30. Apr 2022 09:09

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Du rufst SendMail in Form11 auf; hier ist die Routine in Form2 definiert. Testest Du mit der richtigen Unit?

MichaMD 30. Apr 2022 17:27

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Zitat:

Zitat von hoika (Beitrag 1505295)
Hallo,
was kommt denn im try except als Fehlermeldung?

Asche auf mein Haupt..., das hatte ich noch garnicht angeschaut.
Ich habs mal schnell nachgeholt, aber es werden keine Meldungen(weder bei Abgabe noch SendMail ausgespuckt, es hängt sich einfach auf.(Task Manager Status: inaktiv)

Zitat:

Zitat von Delphi.Narium (Beitrag 1505299)
Delphi-Quellcode:
      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        begin
          result:=false;
        end;
      end;
Solche Konstrukte sind meiner Meinung nach verantwortungslos.

Wegen der fehlenden Exceptionausgabe, oder weshalb? (Ehrlich interessiert)


Zitat:

Zitat von Delphi.Narium (Beitrag 1505299)
In SendMail werden nur Fehler beim
Delphi-Quellcode:
IdSMTP.Send(Mes);
abgefangen, aber letztlich ignoriert. Die Fehlerursache könnte aber durchaus auch z. B. beim
Delphi-Quellcode:
Attachment := TIdAttachmentFile.Create(Mes.MessageParts,Anhang[i]);
oder beim
Delphi-Quellcode:
IdSMTP.Connect;
oder beim
Delphi-Quellcode:
IdSMTP.Authenticate;
oder beim ... liegen.

Aus dem Code ist beim besten Willen nicht zu erkennen, was denn hier ggfls. falsch laufen könnte.

Du hast absolut recht, ich habe jetzt entsprechende Fehlerausgaben eingefügt, die jedoch (siehe Antwort auf hoika) nichts ausgespuckt haben.
Zusätzlich habe ich einige Sendmessages verteilt und konnte eingrenzen wo das problem zu liegen scheint
Delphi-Quellcode:
showmessage('4');

          IdSMTP.ConnectTimeout:=1000;
showmessage('5');
          IdSMTP.Connect;
showmessage('6');
          IdSMTP.Authenticate;
  showmessage('7');
5 wird noch ausgegeben, 6 nicht mehr.


Zitat:

Zitat von EmWieMichael (Beitrag 1505300)
Du rufst SendMail in Form11 auf; hier ist die Routine in Form2 definiert. Testest Du mit der richtigen Unit?

Kleiner Übertragungsfehler hier fürs Forum, habs oben korrigiert. Ist die korrekte Unit. Aber Stimmt, hätte es natürlich sein können.

Delphi.Narium 30. Apr 2022 17:37

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Zitat:

Zitat von MichaMD (Beitrag 1505319)
Zitat:

Zitat von Delphi.Narium (Beitrag 1505299)
Delphi-Quellcode:
      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        begin
          result:=false;
        end;
      end;
Solche Konstrukte sind meiner Meinung nach verantwortungslos.

Wegen der fehlenden Exceptionausgabe, oder weshalb? (Ehrlich interessiert)

Ja, genau wegen der fehlenden Exceptionausgabe. Im Fehlerfalle die Fehlermeldung nicht auszugeben (egal wie, egal wohin) sondern einfach nur als Ergebnis ein false zu liefern, ist für die Fehlersuche nicht wirklich hilfreich.
Damit nimmt man sich jegliche Chance irgendwie auf Fehler zu reagieren, da man nie erfährt, was denn überhaupt schiefgelaufen sein könnte. Und wenn man solche Konstrukte über mehrere Funktionen und / oder Prozeduren verschachtelt hat, erfährt man nichtmal, wo denn ein Fehler aufgetreten sein könnte.

MichaMD 30. Apr 2022 17:39

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Oben noch vergessen zu erwähnen,
Die Windows 10 Pcs sind meine also mit Admin rechten, für Windows Server 2019 habe ich es auf einem Arbeitsrechner getestet, wo ich keinen Adminzugriff habe und wenig Infos oder Einfluss auf Netzwerkeinstellungen etc.

MichaMD 30. Apr 2022 17:43

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1505320)
Zitat:

Zitat von MichaMD (Beitrag 1505319)
Zitat:

Zitat von Delphi.Narium (Beitrag 1505299)
Delphi-Quellcode:
      try
        begin
          IdSMTP.Send(Mes);
          result:=true;
        end;
      except
        begin
          result:=false;
        end;
      end;
Solche Konstrukte sind meiner Meinung nach verantwortungslos.

Wegen der fehlenden Exceptionausgabe, oder weshalb? (Ehrlich interessiert)

Ja, genau wegen der fehlenden Exceptionausgabe. Im Fehlerfalle die Fehlermeldung nicht auszugeben (egal wie, egal wohin) sondern einfach nur als Ergebnis ein false zu liefern, ist für die Fehlersuche nicht wirklich hilfreich.
Damit nimmt man sich jegliche Chance irgendwie auf Fehler zu reagieren, da man nie erfährt, was denn überhaupt schiefgelaufen sein könnte. Und wenn man solche Konstrukte über mehrere Funktionen und / oder Prozeduren verschachtelt hat, erfährt man nichtmal, wo denn ein Fehler aufgetreten sein könnte.

Ok, da hast du schon Recht mit.
Da werde ich wohl zukünftig den inneren Schweinehund noch etwas überwinden müssen. Danke für den Hinweis.

Delphi.Narium 30. Apr 2022 17:53

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Zitat:

Zitat von MichaMD (Beitrag 1505319)
Zusätzlich habe ich einige Sendmessages verteilt und konnte eingrenzen wo das problem zu liegen scheint
Delphi-Quellcode:
showmessage('4');

          IdSMTP.ConnectTimeout:=1000;
showmessage('5');
          IdSMTP.Connect;
showmessage('6');
          IdSMTP.Authenticate;
  showmessage('7');
5 wird noch ausgegeben, 6 nicht mehr.

Das könnte auf ein Netzwerkproblem schließen lassen. Die Verbindung Richtung Mailserver scheint nicht wirklich aufgebaut werden zu können.

Kennst Du Blat?

Das ist ein Konsolenprogamm zum Versenden von Mails. Eventuell kannst Du damit mal versuchen, ob damit 'ne Mail zu verschicken ist. Wenn ja, dann musst Du in Deinem Programm weitersuchen, wenn nein, dann liegt da eine grundlegendere Problematik vor.

Achso:

Mails könnte man auch über die Kommandozeile via TelNet verschicken, da sieht man ggfls. auch, wo es hakt.
Gebrauchsanweisung dazu: E Mails über Telnet verschicken

oakley 30. Apr 2022 22:09

AW: Mail via Indy klappt auf Windows 10 aber nicht auf Windows Server 2019
 
Versuch mal: if idSMTP.connected then showmessage('6');

Ich bezweifle dass er überhaupt verbindet.
Schalte zum Testen mal die Windows Firewall ab.

Mirko


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr.
Seite 1 von 2  1 2      

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