Sample code for 30+ languages & platforms
PHP Requires Chilkat v11.0.0+

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

Chilkat2 PHP
<?php

use Chilkat2\Email;
use Chilkat2\JsonObject;
use Chilkat2\Mime;

// 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 = new Mime();

try {
    $mime->LoadMimeFile($emlPath);
} catch (\Chilkat2\Exception $e) {
    echo $e->getMessage(), "\n";
    exit;
}

echo "---- MIME structure ----\n";
echo $mime->GetStructure('text'), "\n";
echo "------------------------\n";

$email = new Email();
$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.
echo 'Email was Signed: ', ($email->ReceivedSigned ? 'true' : 'false'), "\n";
echo 'Email was Encrypted: ', ($email->ReceivedEncrypted ? 'true' : 'false'), "\n";
if ($email->ReceivedSigned) {
    echo 'Signature(s) valid = ', ($email->SignaturesValid ? 'true' : 'false'), "\n";
}

if ($email->ReceivedEncrypted) {
    echo 'Decrypted successfully = ', ($email->Decrypted ? 'true' : 'false'), "\n";
}

$i = 0;
$numAttach = $email->NumAttachments;
echo 'Number of attachments = ', $numAttach, "\n";

while ($i < $numAttach) {
    echo '---- Attachment ', $i, "\n";

    // Examine the filename (if any)
    echo 'filename: ', $email->GetAttachmentFilename($i), "\n";
    // Examine the content-ID (if any)
    echo 'Content-ID: ', $email->GetAttachmentContentID($i), "\n";
    // Examine the content-type
    echo 'Content-Type: ', $email->GetAttachmentContentType($i), "\n";
    // Examine the content-disposition
    echo 'Content-Disposition', $email->GetAttachmentHeader($i, 'content-disposition'), "\n";
    // Examine the attachment size:
    echo 'Size (in bytes) of the attachment: ', $email->GetAttachmentSize($i), "\n";

    $i = $i + 1;
}

echo "--\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->NumRelatedItems;
echo 'Number of related items = ', $numRelated, "\n";
$i = 0;
while ($i < $numRelated) {
    echo '---- Related Item ', $i, "\n";

    // Examine the filename (if any)
    echo 'filename: ', $email->GetRelatedFilename($i), "\n";
    // Examine the content-ID (if any)
    echo 'Content-ID: ', $email->GetRelatedContentID($i), "\n";
    // Examine the content-type
    echo 'Content-Type: ', $email->GetRelatedContentType($i), "\n";
    // Examine the content-location (if any)
    echo 'Content-Location', $email->GetRelatedContentLocation($i), "\n";

    $i = $i + 1;
}

// The email could also have attached messages.
// An attached message is another email that was attached to this email.
$em = new Email();
$numAttachedMessages = $email->NumAttachedMessages;
echo 'Number of attached messages = ', $numAttachedMessages, "\n";
$i = 0;
while ($i < $numAttachedMessages) {
    echo '---- Attached message ', $i, "\n";

    // Examine the attached email
    $email->GetAttachedEmail($i, $em);
    echo 'from: ', $em->From, "\n";
    echo 'subject: ', $em->Subject, "\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->NumReports;
echo 'Number of reports = ', $numReports, "\n";
$i = 0;
while ($i < $numReports) {
    echo '---- Report ', $i, "\n";
    // Get the raw report data...
    echo $email->GetReport($i), "\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()) {
    echo "--- Delivery Status Information:\n";
    echo 'Status: ', $email->GetDeliveryStatusInfo('Status'), "\n";
    echo 'Action: ', $email->GetDeliveryStatusInfo('Action'), "\n";
    echo 'Reporting-MTA: ', $email->GetDeliveryStatusInfo('Reporting-MTA'), "\n";

    $jsonDsnInfo = new JsonObject();
    $email->GetDsnInfo($jsonDsnInfo);
    $jsonDsnInfo->EmitCompact = false;
    echo $jsonDsnInfo->Emit(), "\n";
}