![]() |
Indy 10: RTF Mail sauber zusammenbasteln und als HTML senden
In einem Projekt habe ich erkennen dürfen, das es nicht so einfach ist eine Mail sauber zusammenzufrickeln. Vor allem dann nicht, wenn die Mail mit Bildern ist und diese trotzdem nicht im Anhang erscheinen sollen (denn nur dann ist eine Mail sauber - in diesem Zusammenhang sei erwähnt, das ich erstaunt bin, das die meisten Mailer eine Mail nicht nach Standard zusammenbauen. Hier nun mal die Erklärung:
nach dem Header soll eine Mail so aussehen: (achtet dabei bitte genau auf die Boundaries!) ------------------------------------------------------------------------------------------ From: user@domain To: user@domain Subject: Test MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="haupt_boundary"; Content-Transfer-Encoding: 7bit --haupt_boundary Content-Type: multipart/related; boundary="related_boundary"; --related_boundary Content-Type: multipart/alternative; boundary="alternative_boundary"; --alternative_boundary Content-Type: text/plain Content-Transfer-Encoding: 7bit text --alternative_boundary Content-Type: text/html Content-Transfer-Encoding: 7bit html --alternative_boundary-- --related_boundary Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: bild1 bilddaten --related_boundary-- --haupt_boundary-- ----------------------------------------------------------------------------- in Delphi bildet man das durch "Parent Part" in der Komponente TIdMessage ab. Der Text der Mail kommt als HTML aus einer RichText Komponente, die durch die Funktion save_html (als HTML) auf Platte gespeichert wird. Danach wird das wieder in einen Stream eingelesen (hängt damit zusammen, das die Richtextkomponente ein Ereignis OnImagePrepareforSaving hat, welches durch den Aufruf Save_.. ausgelöst wird.(Für das Speichern als HTML müsst Ihr Euch da was eigenes bauen oder die WPTools besorgen. Dort greife ich mit einer kleinen Funktion ein und vergebe den Bilden sogenannte Content IDs (frei wählbar), die ich ein einem Array(ist ein unsichbares Grid => Anhangliste) speichere. Mailblatt ist meine Richtextkomponente.
Delphi-Quellcode:
Bis hier waren es nur Vorbereitungen. Nun kommts zur eigentlichen Mail:
function save_html : string;
var path, filename : String; begin ForceDirectories(HTMLFolder.Text); filename := HTMLFolder.Text + '\' + 'message.htm'; Anhangliste.ClearRows; Anhangliste.Addrow(1); Anhangliste.cells[0,0]:= filename; FHTMLImgNr := 0; try path := HTMLFolder.Text; mailblatt.SaveToFile(filename); // in diesem Moment wird mailing_PrepareImageforSaving aufgerufen finally // end; result := filename; end; procedure mailing_PrepareImageforSaving(RTFData: TWPRTFDataCollection; Writer: TWPCustomTextWriter; TextObject: TWPTextObj; var DontSave: Boolean); begin TextObject.Source := ''; if TextObject.ObjRef<>nil then begin TextObject.ObjRef.StreamName := ''; begin inc(FHTMLImgNr); TextObject.ObjRef.FileName := ExtractFileName( // we want relative filename only TextObject.ObjRef.SaveToFile( HTMLFolder.Text, Format( 'img%d', [FHTMLImgNr] ), '' )); Anhangliste.Addrow(1); .Anhangliste.cells[0,anhangliste.RowCount -1]:= TextObject.ObjRef.FileName; Anhangliste.cells[1,anhangliste.RowCount -1]:= inttostr(FHTMLImgNr)+ '2005'; end; end; end; EMail ist bei mir der Name für die TIdMessage-Komponente. SMTP für TIdSMTP
Delphi-Quellcode:
procedure btn_sendmailClick(Sender : TObject);
var Email: TIdMessage; dateiname : string; stmp : string; fs : TFilestream; sStream : TStringStream; i : integer; _items : integer; xtmp : string; smtp : TIdSMTP; _anzahl : integer; begin Email := TIdMessage.Create(nil); Email.Recipients.Clear; Email.Recipients.Add.Address := 'mail@delphipraxis.net'; // Hier also der Empfänger Email.CCList.Add.Address := 'mail@delphipraxis.net'; // Hier CC Email.BCCList.Add.Address := 'mail@delphipraxis.net'; // Hier BCC; Email.from.Text := 'Grüsse von der Delphipraxis'; Email.From.Name := 'Mailadmin der Delphipraxis'; Email.From.Address := 'from@delphipraxis.net'; Email.Subject := 'betreff'; email.Date := Now; dateiname := save_html; // Hier wird gespeichert, HTML erzeugt etc. fs := Tfilestream.Create(dateiname,fmOpenRead or fmShareDenyWrite); try fs.Position := 0; // File in den String-Stream schreiben sStream := TStringStream.Create(''); sStream.CopyFrom(fs,fs.size); // Daten in einem String speichern // An dieser Stelle werden die Bilddateinamen durch Content IDs ersetzt xtmp := stringreplace(sStream.DataString,'[img]img','<img src=[/img] '' then TIdAttachmentfile.Create(email.MessageParts, stmp); end; end; // initialisieren der SMTP Komponente smtp := TIdSMTP.Create; smtp.AuthType := atDefault; smtp.Host := '192.168.4.2'; // hier eigene IP eingeben smtp.Password := '....'; smtp.PipeLine := true; smtp.Port := 25; smtp.Username := '......'; smtp.UseTLS := utNoTLSSupport; AntiFreeze.active := true; try smtp.Connect; smtp.Send(Email); smtp.Disconnect; except smtp.Disconnect; end; AntiFreeze.active := false; freeandnil(smtp); freeandnil(email); end; So - viel Vergnügen Gruss EL |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 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