Sample code for 30+ languages & platforms
Delphi ActiveX

Iterate MIME Parts of an Email

See more Email Object Examples

Demonstrates how to iterate over the MIME sub-parts of an email, and retrieve the content of each MIME sub-part body.

Note: This example requires some new features added to Chilkat v9.5.0.95.

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;
email: TChilkatEmail;
sbContentType: TChilkatStringBuilder;
caseSensitive: Integer;
inlineOnly: Integer;
excludeAttachments: Integer;
searchSpec: WideString;
numParts: Integer;
i: Integer;
textBody: WideString;
attachedEmail: TChilkatEmail;
bdMime: TChilkatBinData;
bd: TChilkatBinData;

begin
success := 0;

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

// See the following Chilkat post to Quickly Understand Email MIME

email := TChilkatEmail.Create(Self);

success := email.LoadEml('qa_data/eml/sample.eml');
if (success = 0) then
  begin
    Memo1.Lines.Add('Failed to load .eml');
    Exit;
  end;

sbContentType := TChilkatStringBuilder.Create(Self);
caseSensitive := 0;

// Get the total number of non-multipart MIME sub-parts.
// (This is a simple way of iterating over all the MIME leaf parts regardless of the MIME tree structure)
inlineOnly := 0;
excludeAttachments := 0;
searchSpec := '*/*';

numParts := email.GetNumPartsOfType(searchSpec,inlineOnly,excludeAttachments);
i := 0;
while i < numParts do
  begin
    // What is the Content-Type of this MIME part?
    sbContentType.Append(email.GetNthContentType(i,searchSpec,inlineOnly,excludeAttachments));
    if (sbContentType.StartsWith('text/',caseSensitive) = 1) then
      begin
        // Get the text body of this MIME part.
        textBody := email.GetNthTextPartOfType(i,searchSpec,inlineOnly,excludeAttachments);
        Memo1.Lines.Add('Got text body for ' + sbContentType.GetAsString());
      end
    else
      begin
        if (sbContentType.ContentsEqual('message/rfc822',caseSensitive) = 1) then
          begin
            // If the Content-Type is message/rfc822, then the MIME body for this part contains a full embedded MIME messages.
            // Your application could load it into a Chilkat email object and recursively process...
            attachedEmail := TChilkatEmail.Create(Self);
            bdMime := TChilkatBinData.Create(Self);
            email.GetNthBinaryPartOfTypeBd(i,searchSpec,inlineOnly,excludeAttachments,bdMime.ControlInterface);
            attachedEmail.SetFromMimeBd(bdMime.ControlInterface);
            // Now your app can recursively process the attachedEmail...
          end
        else
          begin
            // Get the bytes of this MIME body part.
            bd := TChilkatBinData.Create(Self);
            email.GetNthBinaryPartOfTypeBd(i,searchSpec,inlineOnly,excludeAttachments,bd.ControlInterface);
            Memo1.Lines.Add('Got binary body for ' + sbContentType.GetAsString() + ' numBytes = ' + IntToStr(bd.NumBytes));
          end;
      end;
    sbContentType.Clear();
    i := i + 1;
  end;
end;