Tech-Ecke / Delphi Inhalt / IdMsgSend Komponente eMail

 

     IdMsgSend Komponente eMail

 

   Vorab

Die Indy-Komponentensammlung bietet zahlreiche Komponenten rund ums Internet, von HTTP über FTP bis hin zu POP3 und SMTP. Die hier gezeigten Codeschnipsel wurden für die Version 10.0.52 erstellt, sollten aber auch für andere Versionen gültig sein. Bei neueren Delphi-Versionen ist diese Komponentensammlung bereits enthalten, bei älteren Versionen kann man das Paket aber auch kostenlos im Internet bei indyproject downladen. Wie externe Komponenten eingebunden werden steht hier.

   eMail versenden über IdMessage + IdSMTP

     

Zunächst müssen die beiden Komponenten IdMessage und IdSMTP auf die Form gezogen werden.
Wenn SSL-Verschlüsselung erforderlich ist, dann auch IdSSLIOHandlerSocketOpenSSL. Diese muss dann bei der IdSMTP im Objektinspektor unter IOHandler angegeben werden.

Mit dem Server verbinden

  IdSMTP1.AuthType := atDefault;    // simpler Login ohne Authentifizierung
IdSMTP1.Host := 'smtp.1und1.com';
IdSMTP1.Port := 25;    // ohne SSL -> Port in aller Regel 25
// IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587

IdSMTP1.Username := 'hans.mustermann@online.de';    // Benutzername
IdSMTP1.Password := 'xyz';    // Passwort
// Verbinden mit Server
try
   IdSMTP1.Connect;
except
   on E: Exception do
      begin
         Application.MessageBox (PChar(E.Message),'Verbindungsfehler!',MB_OK);
         IdSMTP1.Disconnect;
         exit;
      end;
end;
.
.
.
 

eMail Daten aufnehmen und absenden

  .
.
.
IdMessage1.Body.Assign(Memo1.Lines);   // der eigentliche eMail -Text aus einem TMemo
IdMessage1.Priority := TIdMessagePriority(2);   // Priorität
IdMessage1.Recipients.EMailAddresses := 'hans.mustermann@online.de';   // Empfängeradresse
IdMessage1.ReplyTo.EMailAddresses := 'hans.mustermann@online.de';   // Anwortadresse
IdMessage1.From.Text := 'hans.mustermann@online.de';   // Absenderadresse
IdMessage1.ContentType := 'text/plain';   // nur bei reinem Text!
IdMessage1.Subject := 'Hier steht der Betreff';
try
   IdSMTP1.Send(IdMessage1);
except
   on E: Exception do
      begin
         Application.MessageBox (PChar(E.Message),'Verbindungsfehler!',MB_OK);
         IdSMTP1.Disconnect;
      exit;
end;

IdMsgSend.MessageParts.Clear; // Anhänge, falls vorhanden wieder freigeben
IdSMTP1.Disconnect; // vom SMTP-Server trennen
 

   eMail-Anhänge

möchte man einen Anhang mit der eMail versenden, so muss beim sammeln der eMail-Daten folgende Zeile hinzugefügt werden: 

  TIdAttachmentFile.Create(IdMessage1.MessageParts, 'C:\Test1.bmp');  // benötigt IdAttachmentFile in uses !!!
TIdAttachmentFile.Create(IdMessage1.MessageParts, 'C:\Test2.bmp');  // usw.
 

Damit der Anhang jedoch nicht als Binärcode in Text ankommt, muss der ContentType auf "multipart/*" gesetzt werden!

  IdMessage1.ContentType := 'multipart/*';   //  mit Anhang!
 

   Progressbar

Für eine Fortschrittsanzeige nutzt man die zwei Ereignisse vom IdSMTP OnWork und OnWorkEnd  um eine ProgressBar zu füttern. Bevor man dies jedoch tut, muss man zuvor den ProgressBar.Max ermitteln, dieser entspricht dem Datenvolumen der kompletten eMail. Am einfachsten bekommt man dies, indem man die eMail vor dem senden als temporär als Filestream erzeugt. Das könnte dann wie folgt aussehen:


1) ProgressBar.Max ermitteln

Nachdem alle Daten, auch die Anhänge der IdMessage zugeordnet wurden!

var PufferStream: TFileStream;

  PufferStream := TFileStream.Create('C:\TmpStream', fmCreate);
try IdMsgSend.SaveToStream(PufferStream) finally end;
ProgressBar1.Max := PufferStream.Size;
PufferStream.Free;
DeleteFile('C:\TmpStream');
 

2) OnWork

Bei OnWork wird der aktuelle Fortschritt des Down bzw. Uploads als Integer übergeben

   ProgressBar1.Position := AWorkCount;
 Application.ProcessMessages;
 

3) OnWorkEnd

Bei OnWorkEnd wird die Prgressbar wieder auf null gesetzt

   ProgressBar1.Position := 0;
 

   AntiFreeze

Wenn eine Indy-Komponenten aktiv im Internet ist, also wenn man z.B. über den FTP-Client Daten herunter- oder hochläd, dann "gefriert" das Fenster der Anwendung Anwendung ein und lässt sich nicht mehr bewegen oder aktualisieren, was sich bei Verwendung einer Progressbar denkbar ungünstig verhalten würde. Um diesen, wohl oft unerwünschten Effekt zu unterdrücken dient die Komponente AntiFreeze. Die Komponenten wird einfach auf die Form gezogen und im Objektinspektor die Eigenschaft OnlyWhenIdle auf False gesetzt, und gut is.

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 07.01.2012]