Delphi ActiveX
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
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;