Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mailversand mit Indy geht nur einmal (https://www.delphipraxis.net/169630-mailversand-mit-indy-geht-nur-einmal.html)

HPB 1. Aug 2012 16:48


Mailversand mit Indy geht nur einmal
 
Guten Tag Delphianer,
mit nachfolgender Procedure kann ich einmal eine Mail versenden. Ein erneutes Aufrufen der Procedure erzeugt eine Fehlermeldung (Fehler bei der Verbindung).
wenn ich den try except-Block auskommentiere wird nur ein Fehlerbildschirm ohne Angabe des Fehlers angezeigt.

Delphi-Quellcode:
procedure TMSFmDruckeUndExport.MailmitIndy;
var
 pBody: TStringList;
 pAttachment: TIdAttachmentFile;
begin
  pBody := TStringList.Create;
  pBody.Clear;
  pBody.Add('Hallo');
 
  idsmtp1.Host := 'XXXXXX.XXXXXXX.de';
  idsmtp1.Username := 'XXX@XXXXXXXX.de';
  idsmtp1.Password := 'XXXXXXXX';
  idsmtp1.Port := 25;

  idmsg1.Clear;
  idmsg1.ClearBody;
  idmsg1.ClearHeader;
  idmsg1.From.Text := 'bps@bps-nienburg.de';
  idmsg1.Sender.Text := 'ich bins';
  idmsg1.Recipients.EMailAddresses := 'verkauf@bps-nienburg.de';
  idmsg1.Subject := 'testmail';
  idmsg1.Body   := pBody;
  pAttachment := TIdAttachmentFile.Create(idmsg1.MessageParts,
                                                         'd:\erntetag2012.jpg');
 
  try
   idsmtp1.Connect;
   idsmtp1.Send(idmsg1);
   idsmtp1.Disconnect();
   pBody.Free;
   pAttachment.Free;
  except
   ShowMessage('Fehler bei der Verbindung!');
   pBody.Free;
   pAttachment.Free;
  end;
end;
Wo kann nur der Fehler liegen?
Vielen Dank im voraus für die Hilfe.
HPB

s.h.a.r.k 1. Aug 2012 16:54

AW: Mailversand mit Indy geht nur einmal
 
Das
Delphi-Quellcode:
pBody.Clear;
brauchst gar nicht aufrufen, da du ja die Liste direkt davor erzeugst. Und neu erzeugte Listen sind von Haus aus leer.

Du solltest auch den Fehler selbst abfangen und dir ausgeben lassen. Würdest du das tun, würdest du sehen, warum es wohl kein zweites Mal klappt.

Delphi-Quellcode:
try
  // ...
except on Ex : Exception do
  ShowMessage(Ex.Message);
end;

himitsu 1. Aug 2012 16:58

AW: Mailversand mit Indy geht nur einmal
 
Es hat wohl keiner Lust uns den Inhalt der Fehlermeldung zu nennen?

Aber was ist das bitte für eine Speicherschutzbehandulng, mit dem Try Except?
Delphi-Quellcode:
procedure TMSFmDruckeUndExport.MailmitIndy;
var
 pBody: TStringList;
 pAttachment: TIdAttachmentFile;
begin
  pBody := TStringList.Create;
  try
    //pBody.Clear; ist noch leer
    pBody.Add('Hallo');
 
    idsmtp1.Host := 'XXXXXX.XXXXXXX.de';
    idsmtp1.Username := 'XXX@XXXXXXXX.de';
    idsmtp1.Password := 'XXXXXXXX';
    idsmtp1.Port := 25;

    idmsg1.Clear;
    idmsg1.ClearBody;
    idmsg1.ClearHeader;
    idmsg1.From.Text := 'bps@bps-nienburg.de';
    idmsg1.Sender.Text := 'ich bins';
    idmsg1.Recipients.EMailAddresses := 'verkauf@bps-nienburg.de';
    idmsg1.Subject := 'testmail';
    idmsg1.Body := pBody;
    pAttachment := TIdAttachmentFile.Create(idmsg1.MessageParts, 'd:\erntetag2012.jpg');
    try
      idsmtp1.Connect;
      idsmtp1.Send(idmsg1);
      idsmtp1.Disconnect();
    finally
      pAttachment.Free;
    end;
  finally
    pBody.Free;
  end;
end;
Und eventuell um Alles noch ein Try-Except drumrum.
Delphi-Quellcode:
try

  ...

except
  on E: Exception do begin
    //ShowMessage(E.Message);
    E := 'Fehler beim Versenden der Mail.' + sLineBreak + sLineBreak + E.Message;
    raise;
  end;
end;
PS: Was mag wohl passieren, wenn es zwischen dem Try und Except, bei einem der Free knallt?

Klaus01 1. Aug 2012 16:59

AW: Mailversand mit Indy geht nur einmal
 
Hallo,

mache mal aus

Delphi-Quellcode:
try
   idsmtp1.Connect;
   idsmtp1.Send(idmsg1);
   idsmtp1.Disconnect();
   pBody.Free;
   pAttachment.Free;
  except
   ShowMessage('Fehler bei der Verbindung!');
   pBody.Free;
   pAttachment.Free;
  end;
end;
dieses hier:

Delphi-Quellcode:
try
 try
   idsmtp1.Connect;
   idsmtp1.Send(idmsg1);
   idsmtp1.Disconnect();
  except
    on E:Exception do
    ShowMessage('Fehler bei der Verbindung! ' +E.Message);
  end;
finally
   pBody.Free;
   pAttachment.Free;
end;
Hilfe eventuell beim Fehlerfinden.

Grüße
Klaus

himitsu 1. Aug 2012 17:06

AW: Mailversand mit Indy geht nur einmal
 
Ähhhm, ich bin mir grade nicht sicher, ob indy nicht die Freigabe des Attachments übernimmt.
Laß mal probehalber das
Delphi-Quellcode:
pAttachment.Free
weg, bzw. entferne gleich die ganze pAttachment-Variable (wenn Ersteres was half).

HPB 1. Aug 2012 17:22

AW: Mailversand mit Indy geht nur einmal
 
Vielen Dank für die Antworten.
Ich habe nun den Fehler im try except-Block, wie vorgeschlagen, abgefangen. Aber es wird keine Fehlercode oder sonst etwas ausgegeben. Siehe hierzu auch den Screenshot-Anhang. Kann es sein dass ich den Port in der Firewall freigeben muß? Aber nein, sonst hätte ich ja nicht das Erstemal senden können!?

Delphi-Quellcode:
try
     idsmtp1.Connect;
     idsmtp1.Send(idmsg1);
     idsmtp1.Disconnect();
except

     on E : Exception do
     begin
      ShowMessage('Fehler beim Versenden der Mail!' + sLineBreak + sLineBreak +
       E.Message);
      raise;
    end;
end;
Kann ich sonst noch etwas tun?
Mit Gruß
HPB

Klaus01 1. Aug 2012 17:28

AW: Mailversand mit Indy geht nur einmal
 
Hallo,

vielleicht solltest Du das Verbinden mit dem MailServer und dem Verschicken der Mails trennen.

In etwa so:
- zum Mailserver verbinden
- alle Mails verschicken
- Verbindung zum Mailserver trennen.

Du machst es zur Zeit so:
- zum Mailserver verbinden
- eine Mail verschicken
- Verbindung zum Mailserver trennen.

- zum Mailserver verbinden
- eine Mail verschicken
- Verbindung zum Mailserver trennen.

- zum Mailserver verbinden
- eine Mail verschicken
- Verbindung zum Mailserver trennen.


Vielleicht mag der Server es nicht innerhalb von kurzer Zeit vom gleichen User kontaktiert zu werden?

Grüße
Klaus

HPB 1. Aug 2012 17:45

AW: Mailversand mit Indy geht nur einmal
 
Zitat:

Zitat von Klaus01 (Beitrag 1176596)
Hallo,

vielleicht solltest Du das Verbinden mit dem MailServer und dem Verschicken der Mails trennen.

Grüße
Klaus

Ja Klaus, da scheint was dran zu sein.
Ich habe nun den Fehler näher eingegrenzt. Siehe hierzu den Anhang (EIdSMTPReplayErrorFehler).

Ich habe die Verbindung zum Server in das FormCreate-Ereignis gelegt. Die Verbindung schliessen im FormDeactivate-Ereignis. Allem zu Trotz die Fehlermeldung bleibt die Selbe.
Mit Gruß
HPB

Klaus01 1. Aug 2012 17:55

AW: Mailversand mit Indy geht nur einmal
 
.. dann bohre mal Dein Exception handling auf:

Delphi-Quellcode:
 
 on e: EIdSMTPReplyError do
   begin
    if e.EnhancedCode.Available then
       begin
         ShowMessage(e.Message + #13#10 + '--' + #13#10 + e.EnhancedCode.ReplyAsStr);
       end
    else
      begin
        showMessage(e.Message);
      end;
   end;
 on e: Exception do
   begin
     showMessage(e.Message);
   end;
code von hier

Grüße
Klaus

p80286 1. Aug 2012 18:05

AW: Mailversand mit Indy geht nur einmal
 
Irgendetwas scheint da nicht zu stimmen:
Delphi-Quellcode:
ShowMessage('Fehler beim Versenden der Mail!' + sLineBreak + sLineBreak +
       E.Message);
was kommt:
"Fehler bei der Verbindung"

Zitat:

Allem zu Trotz die Fehlermeldung bleibt die Selbe.
"EIdSMTPReplayErrorFehler"

Das legt für mich den Schluß nahe, das der Fehler ganz irgendwo anders auftritt.
Gruß
K-H

HPB 1. Aug 2012 18:37

AW: Mailversand mit Indy geht nur einmal
 
Zitat:

Zitat von p80286 (Beitrag 1176604)
Irgendetwas scheint da nicht zu stimmen:
Delphi-Quellcode:
ShowMessage('Fehler beim Versenden der Mail!' + sLineBreak + sLineBreak +
       E.Message);
was kommt:
"Fehler bei der Verbindung"

Zitat:

Allem zu Trotz die Fehlermeldung bleibt die Selbe.
"EIdSMTPReplayErrorFehler"

Das legt für mich den Schluß nahe, das der Fehler ganz irgendwo anders auftritt.
Gruß
K-H

Ich bekomme nur die eine Fehlermeldung, wie in der angehängten Grafik zusehen ist, und sonst nichts.
Mit Gruß
HPB

himitsu 1. Aug 2012 19:07

AW: Mailversand mit Indy geht nur einmal
 
Zitat:

Irgendetwas scheint da nicht zu stimmen
Das Gefühl hatte ich auch grade.

Und was sagt der Debugger, also wo kommst du alles vorbei und wird wirklich dieses ShowMessage ausgeführt,
bzw. bei welchem Befehl knallt es denn nun genau?



PS: Bei derartigen MessageBoxen funktioniert oftmals das Strg+C, womit man den Text rauskopieren kann.

HPB 2. Aug 2012 12:07

AW: Mailversand mit Indy geht nur einmal
 
Zitat:

Zitat von himitsu (Beitrag 1176609)
Zitat:

Irgendetwas scheint da nicht zu stimmen
Das Gefühl hatte ich auch grade.

Und was sagt der Debugger, also wo kommst du alles vorbei und wird wirklich dieses ShowMessage ausgeführt,
bzw. bei welchem Befehl knallt es denn nun genau?



PS: Bei derartigen MessageBoxen funktioniert oftmals das Strg+C, womit man den Text rauskopieren kann.

Moin,
Ich habe nun den Mailversand mal in XE2 geschrieben und getestet.
Der Debugger hält an der richtigen Stelle an. Für Debugfehler siehe begefügte Grafik.
Scheinbar stimmt etwas bei meinem Provider nicht, oder wass soll sonst die Meldung
"qq trouble in home directory" bedeuten?
Vielen Dank für die bisherigen Hilfestellungen.
HPB

Mit Gruß
HPB

p80286 2. Aug 2012 13:07

AW: Mailversand mit Indy geht nur einmal
 
Vielleicht bekommst Du ja hier einen hinweis (Greylisting?)

Gruß
K-H

HPB 2. Aug 2012 15:06

AW: Mailversand mit Indy geht nur einmal
 
Zitat:

Zitat von p80286 (Beitrag 1176677)
Vielleicht bekommst Du ja hier einen hinweis (Greylisting?)

Gruß
K-H

Ja, Hinweise dieser Art habe ich unter Google gefunden. Scheint etwas mit dem Plesk und die Einstellung von Greylisting nicht zustimmen. Werde dies mit meinem Provider absprechen!
Vielen Dank für die Hinweise.
HPB

Klaus01 2. Aug 2012 15:52

AW: Mailversand mit Indy geht nur einmal
 
Hallo,

gerade von meinem Provider bekommen:
Zitat:

Greylisting ist eine besonders wirksame Waffe gegen Spam, da sich diese
Methode die Tatsache zunutze macht, dass Spammer selten standardkonforme
Software für den Versand ihrer Mailings einsetzen. Beim Greylisting wird
überprüft, ob der Absender bekannt ist, d.h. von diesem schon einmal eine
Mail einging. Ist dies nicht der Fall, wird die Mail zurückgewiesen mit der
Meldung, es sei ein temporärer Fehler aufgetreten. Ein standardkonformer
Mailserver wird dann nach einer gewissen Zeit versuchen, die Mail erneut
zuzustellen; dieser zweite Versuch wird dann akzeptiert.
Weitere Mails des
gleichen Absenders werden danach verzögerungsfrei angenommen. Ein Spamversender
wird dagegen den zweiten Zustellversuch in der Regel nicht unternehmen.
Wenn das auch bei Dir zutreffen sollte, dann kannst Du ja, nachdem die Mail abgewiesen wurde,
eine Zeitlang warten und diese Mail nochmals schicken.
Grüße
Klaus

p80286 2. Aug 2012 16:00

AW: Mailversand mit Indy geht nur einmal
 
Wenn ich mich richtig erinnere ist es genau umgekehrt, aber wer kann sich schon auf sein Gedächtnis verlassen.

Gruß
K-H

sewi56 8. Aug 2012 13:00

AW: Mailversand mit Indy geht nur einmal
 
vielleicht:
procedure
var
Att : TIdAttachment;
begin
..
idsmtp1.Disconnect;
try
FreeAndNil(Att);
except
..
end;
end;

Bei "Free" wird einfach der Speicher freigegeben und das Object zerstört;die Objektvariable beinhaltet abr noch eine "gültige" Zeiger-Adresse, die aber nach dem Free je doch auf einen ungültigen Speicherbereich verweist.
Bei "FreeAndNil" wird das Object auch freigegeben und der zeiger auf nil gesetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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 by Thomas Breitkreuz