Mails mit Anhang in Delphi über Indy Smtp versenden

Um Mails in Delphi zu versenden, kann man die Indy-Komponenten verwenden. Diese beinhalten TIdSMTP und TIdMessage, welche wir hierzu verwenden werden.
Als Anhang (Attachment) wollen wir eine CSV-Datei generieren, welche wir aber nur on-the-fly im Speicher erstellen und gleich direkt an die Mail anhängen. Somit ersparen wir uns das Erstellen einer (temporären) Datei.

Zu Beginn geben wir eine TIdSMTP-Komponente auf unsere Form (IdSmtp1). Diese müssen wir entsprechend dem verwendeten Mail-Server konfigurieren. Die meisten Eigenschaften sind selbsterklärend, benötigt der Mail-Server aber speziellere Einstellungen, kann es etwas schwieriger werden bis es funktioniert.

2 Tipps haben uns hier geholfen:

  • um den Datenverkehr mit dem Mailserver mitzulesen, gebt eine TIdLogfile-Komponente auf die Form und wählt diese in der Eigenschaft „Intercept“ aus. Dann gibt man der TIdLogfile noch an, in welcher Datei der Datenverkehr mitgelogt werden soll und stellt „Active“ auf „true“.
  • Um SSL zu benutzen, kann es nötig sein, folgende dll´s zu installieren: http://docwiki.embarcadero.com/RADStudio/Tokyo/de/OpenSSL#32-Bit-_und_64-Bit-Windows

Folgende Funktion sendet eine Mail mit Anhang:

procedure TForm1.sendMail(FromAddress: String; ToAddress: String; Subject: String; Body: String; csvData: TStrings; filename: String);
var MemStrm : TMemoryStream;
    att: TIdAttachment;
    msg: TIdMessage;
begin
    msg := TIdMessage.Create(nil);

    MemStrm := TMemoryStream.Create;
    csvData.SaveToStream(MemStrm);
    MemStrm.Position := 0;

    att := TIdAttachmentMemory.Create(msg.MessageParts, MemStrm);
    att.ContentType := 'text/csv';
    att.FileName := filename;

    msg.ContentType := 'multipart/mixed';
    msg.From.Address := FromAddress;
    msg.Recipients.Clear;
    msg.Recipients.Add.Address := toAddress;
    msg.Subject := Subject;
    msg.Body.Text := Body;

    try
        IdSmtp1.Connect;
        IdSmtp1.Send(msg);
    finally
        IdSmtp1.Disconnect;
    end;
end;

Die Funktion kann dann folgendermaßen verwendet werden:

var csvData: TStrings;
begin
    csvData := TStringList.create;
    csvData.add('col1;col2;col3');
    csvData.add('1;2;3');

    self.sendMail('[email protected]',
                  '[email protected]', 
                  'your csv file',
                  'Hello, ' + chr(10) + chr(13) + 'attached the actual list.',
                  csvData, 
                  'the_list_' + formatdatetime('YYYY_mm_dd', date) + '__' + formatdatetime('hh_nn', time) + '.csv');
end;

 

Schreibe einen Kommentar