Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Attachment löschen (https://www.delphipraxis.net/191744-attachment-loeschen.html)

rokli 15. Feb 2017 15:13

Attachment löschen
 
Moin!

Ich generiere mit den Indy (10.6.2...) Komponenten TMailMessage eine Mail, um diese dann mit TidSMTP zu versenden. Das ganze in einer Schleife, die die Empfänger- (und Sender-) Daten aus einer Datenbank bezieht. Das funktioniert intern (unsere Domain) als auch extern (nach dem wir am Exchange Bescheid gegeben habe, dass ich [also meine IP] rausmailen darf).

Diesen Mails sollen nun Anhänge angefügt werden. Und zwar jeweils ein PDF-Dokument und eine Excel Tabelle. Im Testprogramm sieht das so aus:

Delphi-Quellcode:
         // Anhänge: Uses Klausel:  IdAttachment, IdMessageParts, IdAttachmentFile;
         // Anhang definiert:    VAR Anhang : TIdAttachment;
         if edtAttach.Text <> '' then
            Anhang   := TidAttachmentFile.Create(MailMessage.MessageParts, edtAttach.Text);
         if edtAttach2.Text <> '' then
            Anhang   := TidAttachmentFile.Create(MailMessage.MessageParts, edtAttach2.Text);

         MailSmtp.Connect;
         MailSmtp.Send(MailMessage);

         MailSmtp.Disconnect(true);
Auch das funktioniert! Zumindest bei ersten mal! Denn die so angefügten Attachments werden ich nicht wieder los! Wenn ich eine zweite Mail mit neuen Anhängen losschicke, bleibt ein Anhang vom vorherigen Vorgang erhalten und wird der zweiten Mail auch hinzugefügt. Dementsprechend habe ich dann 3 Anhänge (1 alten und 2 neue). Bei der dritten Mail habe ich schon 4 Anhänge: einen ganz alten, einen alten und die beiden (gewünschten) neuen Anhänge.

Aus einem alten Post (28.03.2006):

Zitat:

Zitat von ste_ett (Beitrag 445896)
Auf die einzelnen Attachments kannst du mit

Delphi-Quellcode:
(*Name der Instanz von TIdMessage*).MessageParts.Items
zugreifen. :)

Um die Datei aus der Attachmentliste zu löschen, reicht es, das Objekt freizugeben.

Delphi-Quellcode:
  for i := 0 to (*Name der Instanz von TIdMessage*).MessageParts.Count-1 do
    if ((*Name der Instanz von TIdMessage*).MessageParts.Items[i].StoredPathName = 'Pfad\zur\Datei') then
      (*Name der Instanz von TIdMessage*).MessageParts.Items[i].Free;

habe ich die Mimik entnommen, die Attachments zu löschen. Das funktioniert aber nicht (mehr?)!

Delphi-Quellcode:
         for I := Anhang.MessageParts.Count downto 1 do begin
            p_ProtoWrite('Attach Name ' + IntToStr(i) + ': ' + Anhang.MessageParts.Items[i].FileName); // nur Info in einer Protokolldatei
            Anhang.MessageParts.Items[i].Free;
            p_ProtoWrite('geFreeT: ' + InttoStr(i)); // nur Info in einer Protokolldatei
         end;
Und ein einfaches

Delphi-Quellcode:
Anhang.Free
oder
Anhang.Destroy
geht auch nicht.

Vielleicht kann mir jemand von Euch aus dem Wald helfen?

Gruß

mjustin 15. Feb 2017 15:20

AW: Attachment löschen
 
Das Mailobjekt (TIdMessage) jeweils pro Empfänger zu erzeugen wäre keine Option? Spätestens beim Free sollten die Attachment Objekte auch gelöscht werden, und bei einem neu erzeugten Mailobjekt wird die Attachmentliste leer sein.

rokli 15. Feb 2017 15:33

AW: Attachment löschen
 
Hallo mjustin,

einfach, aber effizient - und man muss drauf kommen! Das funktioniert:

Delphi-Quellcode:
try
      ... mailen
   
finally
      // um Fehler zu vermeiden: Mailer abhängen und "alte" Anhänge löschen
      MailSmtp.Disconnect(true);
      MailMessage.Destroy;
      //Anhang.Destroy;
      ShowMessage('finally');
   end;
Das hilft jetzt aus der größten Not heraus, aber warum das so ist, bleibt mir ein Rätsel.

Trotzdem herzlichen dank und Gruß

rokli 15. Feb 2017 15:45

AW: Attachment löschen
 
Hi Michael,

ich bins nochmal: In der "richtigen" Anwendung geht es nun auch!

mjustin 15. Feb 2017 15:50

AW: Attachment löschen
 
Das ist fein :)

Slipstream 15. Feb 2017 18:24

AW: Attachment löschen
 
Zitat:

Zitat von rokli (Beitrag 1361677)
Delphi-Quellcode:
  for I := Anhang.MessageParts.Count downto 1 do
  begin
    p_ProtoWrite('Attach Name ' + IntToStr(i) + ': ' + Anhang.MessageParts.Items[i].FileName); // nur Info in einer Protokolldatei
    Anhang.MessageParts.Items[i].Free;
    p_ProtoWrite('geFreeT: ' + InttoStr(i)); // nur Info in einer Protokolldatei
    end;
Vielleicht kann mir jemand von Euch aus dem Wald helfen?

Komme nicht aus dem Wald, aber mir fällt ein: du hast ja immer nur zwei Anhänge, einen mit Index 0 und einen mit Index 1. Dann belege doch, wenn dir das Free und das Create zu langsam sind, diese beiden Items immer wieder einfach neu in der Schleife. Vorher musst du natürlich die beiden Items 0 und 1 erzeugen mit Add:

Delphi-Quellcode:
Anhang.MessageParts.Items[0].FileName := 'C:\Stuff\MyPdf.pdf';
Anhang.MessageParts.Items[1].FileName := 'C:\Stuff\MyExcelsheet.xls';
Wir haben eine Anwendung für unser Office, um Updates bei Kunden anzmelden. Dort wird manchmal bei kleinen Umfang eine zip-Datei mitverschickt. Bis jetzt haben wir dieses Problem nicht gefunden. Wir machen das aber auch ein bisschen anders innerhalb der Schleife:
Delphi-Quellcode:
Function TFormSend.SendMail: Boolean;
Var
  MList : TStrings;
begin
  MList := TStringList.Create;
  Try
    MList.Text := DM.Qset_Mailtext.FieldByName('Containment').AsString;
    Try
      IndyMess.Recipients.EMailAddresses := E_Customer;
      IndyMess.From.Text                := E_User;
      IndyMess.Sender.Text              := E_Sender;
      IndyMess.Subject                  := E_Topic;
      IndyMess.Body                     := MList;

      IndyMess.MessageParts.Clear;
      If FileExists(E_Filename) Then
      Begin
        If E_Filename <> '' Then
        Begin
          IndyMess.MessageParts.Add();
          TIdAttachmentFile.Create(IndyMess.MessageParts,E_Filename);
        End;
      End;

      IndySMTP.Connect;
      IndySMTP.Send(IndyMess);
      IndySMTP.Disconnect;

      Result := True;
    Except
      On e:exception Do
      Begin
        GLD.ErrorMessage := 'Error while sending mail (' + E_Topic + '): ' + e.Message;
        Result := False;
      End;
    End;
  Finally
    MList.Free;
  End;
end;
Ob dir das jetzt weiterhilft, weiss ich nicht. Eine dritte Möglichkeit wäre, die beiden Attachementfiles jedes mal vorher zu löschen mit Delete:

Delphi-Quellcode:
Anhang.MessageParts.Delete(0);
Anhang.MessageParts.Delete(1);
Danach sollten da auch keine Items mehr existieren und du kannst dann im ncähsten Schleifendurchlauf mit Add wieder neue machen.

HolgerX 16. Feb 2017 04:22

AW: Attachment löschen
 
Hmm..

Was ich in seinen Codeschnipsel vermisse ist ein einfaches

Delphi-Quellcode:
MailMessage.MessageParts.Clear;


bevor er die neuen Anhänge erstellt...

rokli 16. Feb 2017 06:20

AW: Attachment löschen
 
Moin Slipstream,

das mit dem Delete werd ich nochmal testen (und den Rest Deines Codes natürlich auch)!

@HolgerX: Der
Delphi-Quellcode:
.CLEAR
funktioniert nun auch! Ich hatte den Clear auch versucht, aber wohl an der falschen Stelle, nämlich nicht auf
Delphi-Quellcode:
 MailMessage.MessageParts.Clear
, sondern auf meiner Definition
Delphi-Quellcode:
Anhang.Clear
, was natürlich falsch war.

Vielen Dank Euch Beiden!

Gruß

rokli 16. Feb 2017 06:28

AW: Attachment löschen
 
So, hier nochmal das komplette Testmailprogramm:

Delphi-Quellcode:
   try
      MailSmtp.Username            := edtMailUser.Text;      // name@domain
      MailSmtp.Password            := edtMailPwd.Text;      // pwd von name@domain

      MailSmtp.Host               := edtMailServer.Text;
      MailSmtp.Port               := StrToInt(edtMailPort.Text);

      MailMessage.Priority                     := mpNormal;
      MailMessage.From.Address               := edtMailFromAdr.Text;   // Absender-Mail-Adresse
      MailMessage.Recipients.EMailAddresses   := edtRecipients.Text;
      MailMessage.Subject                      := edtSubject.Text;
      MailMessage.Body.Add(edtBody.Text);

      MailMessage.MessageParts.Clear;   // <<== die Lösung allen Übels!

      if edtAttach.Text <> '' then
         Anhang   := TidAttachmentFile.Create(MailMessage.MessageParts, edtAttach.Text);
      if edtAttach2.Text <> '' then
         Anhang   := TidAttachmentFile.Create(MailMessage.MessageParts, edtAttach2.Text);

      MailSmtp.Connect;
      MailSmtp.Send(MailMessage);

      MailSmtp.Disconnect(true);
   except
      on E : Exception do
      begin
         Showmessage('Fehler: ' + E.Message);
      end;
   end;
Gruß

hoika 16. Feb 2017 06:54

AW: Attachment löschen
 
Hallo,
was ich noch anmerken will
MailMessage.Destroy

benutzt man eigentlich nicht.

Richtig wäre
MailMessage.Free

Aber durch das Clear hast du ja eh schon eine andere Lösung.


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