Sample code for 30+ languages & platforms
Perl Requires Chilkat v9.5.0.95+

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.

Chilkat Perl Downloads

Chilkat2 Perl
use strict;
use warnings;
use Chilkat2;

# 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

my $email = Chilkat2::Email->new;

my $success = $email->LoadEml('qa_data/eml/sample.eml');
if (!$success) {
    print "Failed to load .eml\n";
    exit;
}

my $sbContentType = Chilkat2::StringBuilder->new;
my $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)
my $inlineOnly = 0;
my $excludeAttachments = 0;
my $searchSpec = '*/*';

my $numParts = $email->GetNumPartsOfType($searchSpec, $inlineOnly, $excludeAttachments);
my $i = 0;
while ($i < $numParts) {
    # What is the Content-Type of this MIME part?
    $sbContentType->Append($email->GetNthContentType($i, $searchSpec, $inlineOnly, $excludeAttachments));
    if ($sbContentType->StartsWith('text/', $caseSensitive)) {
        # Get the text body of this MIME part.
        my $textBody = $email->GetNthTextPartOfType($i, $searchSpec, $inlineOnly, $excludeAttachments);
        print 'Got text body for ', $sbContentType->GetAsString(), "\n";
    } else {
        if ($sbContentType->ContentsEqual('message/rfc822', $caseSensitive)) {
            # 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...
            my $attachedEmail = Chilkat2::Email->new;
            my $bdMime = Chilkat2::BinData->new;
            $email->GetNthBinaryPartOfTypeBd($i, $searchSpec, $inlineOnly, $excludeAttachments, $bdMime);
            $attachedEmail->SetFromMimeBd($bdMime);
            # Now your app can recursively process the attachedEmail...
        } else {
            # Get the bytes of this MIME body part.
            my $bd = Chilkat2::BinData->new;
            $email->GetNthBinaryPartOfTypeBd($i, $searchSpec, $inlineOnly, $excludeAttachments, $bd);
            print 'Got binary body for ', $sbContentType->GetAsString(), ' numBytes = ', $bd->NumBytes, "\n";
        }
    }

    $sbContentType->Clear();
    $i = $i + 1;
}