![]() |
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:
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.
// 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); Aus einem alten Post (28.03.2006): Zitat:
Delphi-Quellcode:
Und ein einfaches
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;
Delphi-Quellcode:
geht auch nicht.
Anhang.Free
oder Anhang.Destroy Vielleicht kann mir jemand von Euch aus dem Wald helfen? Gruß |
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.
|
AW: Attachment löschen
Hallo mjustin,
einfach, aber effizient - und man muss drauf kommen! Das funktioniert:
Delphi-Quellcode:
Das hilft jetzt aus der größten Not heraus, aber warum das so ist, bleibt mir ein Rätsel.
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; Trotzdem herzlichen dank und Gruß |
AW: Attachment löschen
Hi Michael,
ich bins nochmal: In der "richtigen" Anwendung geht es nun auch! |
AW: Attachment löschen
Das ist fein :)
|
AW: Attachment löschen
Zitat:
Delphi-Quellcode:
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:
Anhang.MessageParts.Items[0].FileName := 'C:\Stuff\MyPdf.pdf';
Anhang.MessageParts.Items[1].FileName := 'C:\Stuff\MyExcelsheet.xls';
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
Danach sollten da auch keine Items mehr existieren und du kannst dann im ncähsten Schleifendurchlauf mit Add wieder neue machen.
Anhang.MessageParts.Delete(0);
Anhang.MessageParts.Delete(1); |
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... |
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:
funktioniert nun auch! Ich hatte den Clear auch versucht, aber wohl an der falschen Stelle, nämlich nicht auf
.CLEAR
Delphi-Quellcode:
, sondern auf meiner Definition
MailMessage.MessageParts.Clear
Delphi-Quellcode:
, was natürlich falsch war.
Anhang.Clear
Vielen Dank Euch Beiden! Gruß |
AW: Attachment löschen
So, hier nochmal das komplette Testmailprogramm:
Delphi-Quellcode:
Gruß
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; |
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 19:38 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-2025 by Thomas Breitkreuz