Perl Requires Chilkat v11.0.0+
Chilkat2 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
use strict;
use warnings;
use Chilkat2;
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
my $emlPath = 'C:/AAWorkarea/beatrix/roesner.eml';
my $mime = Chilkat2::Mime->new;
my $success = $mime->LoadMimeFile($emlPath);
if (!$success) {
print $mime->LastErrorText, "\n";
exit;
}
print "---- MIME structure ----\n";
print $mime->GetStructure('text'), "\n";
print "------------------------\n";
my $email = Chilkat2::Email->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->ReceivedSigned ? 1 : 0), "\n";
print 'Email was Encrypted: ', ($email->ReceivedEncrypted ? 1 : 0), "\n";
if ($email->ReceivedSigned) {
print 'Signature(s) valid = ', ($email->SignaturesValid ? 1 : 0), "\n";
}
if ($email->ReceivedEncrypted) {
print 'Decrypted successfully = ', ($email->Decrypted ? 1 : 0), "\n";
}
my $i = 0;
my $numAttach = $email->NumAttachments;
print 'Number of attachments = ', $numAttach, "\n";
while ($i < $numAttach) {
print '---- Attachment ', $i, "\n";
# Examine the filename (if any)
print 'filename: ', $email->GetAttachmentFilename($i), "\n";
# Examine the content-ID (if any)
print 'Content-ID: ', $email->GetAttachmentContentID($i), "\n";
# Examine the content-type
print 'Content-Type: ', $email->GetAttachmentContentType($i), "\n";
# Examine the content-disposition
print 'Content-Disposition', $email->GetAttachmentHeader($i, 'content-disposition'), "\n";
# Examine the attachment size:
print 'Size (in bytes) of the attachment: ', $email->GetAttachmentSize($i), "\n";
$i = $i + 1;
}
print "--\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.
my $numRelated = $email->NumRelatedItems;
print 'Number of related items = ', $numRelated, "\n";
$i = 0;
while ($i < $numRelated) {
print '---- Related Item ', $i, "\n";
# Examine the filename (if any)
print 'filename: ', $email->GetRelatedFilename($i), "\n";
# Examine the content-ID (if any)
print 'Content-ID: ', $email->GetRelatedContentID($i), "\n";
# Examine the content-type
print 'Content-Type: ', $email->GetRelatedContentType($i), "\n";
# Examine the content-location (if any)
print '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.
my $em = Chilkat2::Email->new;
my $numAttachedMessages = $email->NumAttachedMessages;
print 'Number of attached messages = ', $numAttachedMessages, "\n";
$i = 0;
while ($i < $numAttachedMessages) {
print '---- Attached message ', $i, "\n";
# Examine the attached email
$email->GetAttachedEmail($i, $em);
print 'from: ', $em->From, "\n";
print '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.
my $numReports = $email->NumReports;
print 'Number of reports = ', $numReports, "\n";
$i = 0;
while ($i < $numReports) {
print '---- Report ', $i, "\n";
# Get the raw report data...
print $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()) {
print "--- Delivery Status Information:\n";
print 'Status: ', $email->GetDeliveryStatusInfo('Status'), "\n";
print 'Action: ', $email->GetDeliveryStatusInfo('Action'), "\n";
print 'Reporting-MTA: ', $email->GetDeliveryStatusInfo('Reporting-MTA'), "\n";
my $jsonDsnInfo = Chilkat2::JsonObject->new;
$email->GetDsnInfo($jsonDsnInfo);
$jsonDsnInfo->EmitCompact(0);
print $jsonDsnInfo->Emit(), "\n";
}