Sample code for 30+ languages & platforms
Perl

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 Perl Downloads

Perl
use chilkat();

$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 = chilkat::CkMime->new();

$success = $mime->LoadMimeFile($emlPath);
if ($success == 0) {
    print $mime->lastErrorText() . "\r\n";
    exit;
}

print "---- MIME structure ----" . "\r\n";
print $mime->getStructure("text") . "\r\n";
print "------------------------" . "\r\n";

$email = chilkat::CkEmail->new();
$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.
print "Email was Signed: " . $email->get_ReceivedSigned() . "\r\n";
print "Email was Encrypted: " . $email->get_ReceivedEncrypted() . "\r\n";
if ($email->get_ReceivedSigned() == 1) {
    print "Signature(s) valid = " . $email->get_SignaturesValid() . "\r\n";
}

if ($email->get_ReceivedEncrypted() == 1) {
    print "Decrypted successfully = " . $email->get_Decrypted() . "\r\n";
}

$i = 0;
$numAttach = $email->get_NumAttachments();
print "Number of attachments = " . $numAttach . "\r\n";

while ($i < $numAttach) {
    print "---- Attachment " . $i . "\r\n";

    # Examine the filename (if any)
    print "filename: " . $email->getAttachmentFilename($i) . "\r\n";
    # Examine the content-ID (if any)
    print "Content-ID: " . $email->getAttachmentContentID($i) . "\r\n";
    # Examine the content-type
    print "Content-Type: " . $email->getAttachmentContentType($i) . "\r\n";
    # Examine the content-disposition
    print "Content-Disposition" . $email->getAttachmentHeader($i,"content-disposition") . "\r\n";
    # Examine the attachment size:
    print "Size (in bytes) of the attachment: " . $email->GetAttachmentSize($i) . "\r\n";

    $i = $i + 1;
}

print "--" . "\r\n";

# 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->get_NumRelatedItems();
print "Number of related items = " . $numRelated . "\r\n";
$i = 0;
while ($i < $numRelated) {
    print "---- Related Item " . $i . "\r\n";

    # Examine the filename (if any)
    print "filename: " . $email->getRelatedFilename($i) . "\r\n";
    # Examine the content-ID (if any)
    print "Content-ID: " . $email->getRelatedContentID($i) . "\r\n";
    # Examine the content-type
    print "Content-Type: " . $email->getRelatedContentType($i) . "\r\n";
    # Examine the content-location (if any)
    print "Content-Location" . $email->getRelatedContentLocation($i) . "\r\n";

    $i = $i + 1;
}

# The email could also have attached messages.
# An attached message is another email that was attached to this email.
$em = chilkat::CkEmail->new();
$numAttachedMessages = $email->get_NumAttachedMessages();
print "Number of attached messages = " . $numAttachedMessages . "\r\n";
$i = 0;
while ($i < $numAttachedMessages) {
    print "---- Attached message " . $i . "\r\n";

    # Examine the attached email
    $email->GetAttachedEmail($i,$em);
    print "from: " . $em->ck_from() . "\r\n";
    print "subject: " . $em->subject() . "\r\n";
    $i = $i + 1;
}

# 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->get_NumReports();
print "Number of reports = " . $numReports . "\r\n";
$i = 0;
while ($i < $numReports) {
    print "---- Report " . $i . "\r\n";
    # Get the raw report data...
    print $email->getReport($i) . "\r\n";
    $i = $i + 1;
}

# 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) {

    print "--- Delivery Status Information:" . "\r\n";
    print "Status: " . $email->getDeliveryStatusInfo("Status") . "\r\n";
    print "Action: " . $email->getDeliveryStatusInfo("Action") . "\r\n";
    print "Reporting-MTA: " . $email->getDeliveryStatusInfo("Reporting-MTA") . "\r\n";

    $jsonDsnInfo = chilkat::CkJsonObject->new();
    $email->GetDsnInfo($jsonDsnInfo);
    $jsonDsnInfo->put_EmitCompact(0);
    print $jsonDsnInfo->emit() . "\r\n";
}