Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Indy 10: RTF Mail sauber zusammenbasteln und als HTML senden (https://www.delphipraxis.net/56451-indy-10-rtf-mail-sauber-zusammenbasteln-und-als-html-senden.html)

emsländer 5. Nov 2005 21:15


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:
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;
Bis hier waren es nur Vorbereitungen. Nun kommts zur eigentlichen Mail:
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