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