AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Indy 10: RTF Mail sauber zusammenbasteln und als HTML senden
Tutorial durchsuchen
Ansicht
Themen-Optionen

Indy 10: RTF Mail sauber zusammenbasteln und als HTML senden

Ein Tutorial von emsländer · begonnen am 5. Nov 2005
Antwort Antwort
Benutzerbild von emsländer
emsländer
Registriert seit: 21. Aug 2004
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


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
 
Antwort Antwort


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 09:28 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