Sample code for 30+ languages & platforms
Delphi ActiveX

Load .eml and Examine the Structure, Attachments, and Related Items

See more Email Object Examples

Demonstrates how to load examine the MIME structure of a .eml, and also examine the attachment and related item filenames, attached messages, and multipart/report and DSN information.

Chilkat Delphi ActiveX Downloads

Delphi ActiveX
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Chilkat_TLB;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
emlPath: WideString;
mime: TChilkatMime;
email: TChilkatEmail;
i: Integer;
numAttach: Integer;
numRelated: Integer;
em: TChilkatEmail;
numAttachedMessages: Integer;
numReports: Integer;
jsonDsnInfo: TChilkatJsonObject;

begin
success := 0;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

emlPath := 'C:/AAWorkarea/beatrix/roesner.eml';

mime := TChilkatMime.Create(Self);

success := mime.LoadMimeFile(emlPath);
if (success = 0) then
  begin
    Memo1.Lines.Add(mime.LastErrorText);
    Exit;
  end;

Memo1.Lines.Add('---- MIME structure ----');
Memo1.Lines.Add(mime.GetStructure('text'));
Memo1.Lines.Add('------------------------');

email := TChilkatEmail.Create(Self);
success := email.LoadEml(emlPath);

// Was this a signed and/or encrypted email?
// If so, then loading the .eml automatically unwraps
// (i.e. verifies signatures and decrypts) and the resultant
// email is what existed prior to signing/encrypting.
Memo1.Lines.Add('Email was Signed: ' + IntToStr(Ord(email.ReceivedSigned)));
Memo1.Lines.Add('Email was Encrypted: ' + IntToStr(Ord(email.ReceivedEncrypted)));
if (email.ReceivedSigned = 1) then
  begin
    Memo1.Lines.Add('Signature(s) valid = ' + IntToStr(Ord(email.SignaturesValid)));
  end;
if (email.ReceivedEncrypted = 1) then
  begin
    Memo1.Lines.Add('Decrypted successfully = ' + IntToStr(Ord(email.Decrypted)));
  end;

i := 0;
numAttach := email.NumAttachments;
Memo1.Lines.Add('Number of attachments = ' + IntToStr(numAttach));

while i < numAttach do
  begin
    Memo1.Lines.Add('---- Attachment ' + IntToStr(i));

    // Examine the filename (if any)
    Memo1.Lines.Add('filename: ' + email.GetAttachmentFilename(i));
    // Examine the content-ID (if any)
    Memo1.Lines.Add('Content-ID: ' + email.GetAttachmentContentID(i));
    // Examine the content-type
    Memo1.Lines.Add('Content-Type: ' + email.GetAttachmentContentType(i));
    // Examine the content-disposition
    Memo1.Lines.Add('Content-Disposition' + email.GetAttachmentHeader(i,'content-disposition'));
    // Examine the attachment size:
    Memo1.Lines.Add('Size (in bytes) of the attachment: ' + IntToStr(email.GetAttachmentSize(i)));

    i := i + 1;
  end;

Memo1.Lines.Add('--');

// Now for the related items.

// Note: A MIME sub-part can potentially be both a related item AND an attachment.
// The typical case is when the item is contained under the multipart/related enclosure and 
// the item also has a "Content-Disposition" header indicating "attachment".
// The location within multipart/related makes it a "related item", yet the Content-Disposition can also make it semantically an attachment.
// Related items and attachments are not necessarily mutually exclusive.

numRelated := email.NumRelatedItems;
Memo1.Lines.Add('Number of related items = ' + IntToStr(numRelated));
i := 0;
while i < numRelated do
  begin
    Memo1.Lines.Add('---- Related Item ' + IntToStr(i));

    // Examine the filename (if any)
    Memo1.Lines.Add('filename: ' + email.GetRelatedFilename(i));
    // Examine the content-ID (if any)
    Memo1.Lines.Add('Content-ID: ' + email.GetRelatedContentID(i));
    // Examine the content-type
    Memo1.Lines.Add('Content-Type: ' + email.GetRelatedContentType(i));
    // Examine the content-location (if any)
    Memo1.Lines.Add('Content-Location' + email.GetRelatedContentLocation(i));

    i := i + 1;
  end;

// The email could also have attached messages.
// An attached message is another email that was attached to this email.
em := TChilkatEmail.Create(Self);
numAttachedMessages := email.NumAttachedMessages;
Memo1.Lines.Add('Number of attached messages = ' + IntToStr(numAttachedMessages));
i := 0;
while i < numAttachedMessages do
  begin
    Memo1.Lines.Add('---- Attached message ' + IntToStr(i));

    // Examine the attached email
    email.GetAttachedEmail(i,em.ControlInterface);
    Memo1.Lines.Add('from: ' + em.From);
    Memo1.Lines.Add('subject: ' + em.Subject);
    i := i + 1;
  end;

// An email could also be a multipart/report email. 
// This is a DSN (Delivery Status Notification)
// The NumReports property indicates how many "reports" exist.
numReports := email.NumReports;
Memo1.Lines.Add('Number of reports = ' + IntToStr(numReports));
i := 0;
while i < numReports do
  begin
    Memo1.Lines.Add('---- Report ' + IntToStr(i));
    // Get the raw report data...
    Memo1.Lines.Add(email.GetReport(i));
    i := i + 1;
  end;

// If the email is a multipart/report, then the information
// from the message/delivery-status part of the email can be retrieved:
if (email.IsMultipartReport() = 1) then
  begin

    Memo1.Lines.Add('--- Delivery Status Information:');
    Memo1.Lines.Add('Status: ' + email.GetDeliveryStatusInfo('Status'));
    Memo1.Lines.Add('Action: ' + email.GetDeliveryStatusInfo('Action'));
    Memo1.Lines.Add('Reporting-MTA: ' + email.GetDeliveryStatusInfo('Reporting-MTA'));

    jsonDsnInfo := TChilkatJsonObject.Create(Self);
    email.GetDsnInfo(jsonDsnInfo.ControlInterface);
    jsonDsnInfo.EmitCompact := 0;
    Memo1.Lines.Add(jsonDsnInfo.Emit());
  end;
end;