AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Attachment löschen

Ein Thema von rokli · begonnen am 15. Feb 2017 · letzter Beitrag vom 16. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2   
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#1

Attachment löschen

  Alt 15. Feb 2017, 16:13
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):

Auf die einzelnen Attachments kannst du mit

(*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ß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Attachment löschen

  Alt 15. Feb 2017, 16:20
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.
Michael Justin
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Attachment löschen

  Alt 15. Feb 2017, 16:33
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ß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Attachment löschen

  Alt 15. Feb 2017, 16:45
Hi Michael,

ich bins nochmal: In der "richtigen" Anwendung geht es nun auch!
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Attachment löschen

  Alt 15. Feb 2017, 16:50
Das ist fein
Michael Justin
  Mit Zitat antworten Zitat
Slipstream
(Gast)

n/a Beiträge
 
#6

AW: Attachment löschen

  Alt 15. Feb 2017, 19:24
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.

Geändert von Slipstream (16. Feb 2017 um 05:45 Uhr) Grund: Fehler in Code korrigiert
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#7

AW: Attachment löschen

  Alt 16. Feb 2017, 05:22
Hmm..

Was ich in seinen Codeschnipsel vermisse ist ein einfaches

MailMessage.MessageParts.Clear;

bevor er die neuen Anhänge erstellt...
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Attachment löschen

  Alt 16. Feb 2017, 07:20
Moin Slipstream,

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

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

Vielen Dank Euch Beiden!

Gruß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
294 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Attachment löschen

  Alt 16. Feb 2017, 07:28
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ß
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Attachment löschen

  Alt 16. Feb 2017, 07:54
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.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
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