Sample code for 30+ languages & platforms
PowerShell

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

PowerShell
Add-Type -Path "C:\chilkat\ChilkatDotNet47-x64\ChilkatDotNet47.dll"

$success = $false

# 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-Object Chilkat.Mime

$success = $mime.LoadMimeFile($emlPath)
if ($success -eq $false) {
    $($mime.LastErrorText)
    exit
}

$("---- MIME structure ----")
$($mime.GetStructure("text"))
$("------------------------")

$email = New-Object Chilkat.Email
$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.
$("Email was Signed: " + $email.ReceivedSigned)
$("Email was Encrypted: " + $email.ReceivedEncrypted)
if ($email.ReceivedSigned -eq $true) {
    $("Signature(s) valid = " + $email.SignaturesValid)
}

if ($email.ReceivedEncrypted -eq $true) {
    $("Decrypted successfully = " + $email.Decrypted)
}

$i = 0
$numAttach = $email.NumAttachments
$("Number of attachments = " + $numAttach)

while ($i -lt $numAttach) {
    $("---- Attachment " + $i)

    # Examine the filename (if any)
    $("filename: " + $email.GetAttachmentFilename($i))
    # Examine the content-ID (if any)
    $("Content-ID: " + $email.GetAttachmentContentID($i))
    # Examine the content-type
    $("Content-Type: " + $email.GetAttachmentContentType($i))
    # Examine the content-disposition
    $("Content-Disposition" + $email.GetAttachmentHeader($i,"content-disposition"))
    # Examine the attachment size:
    $("Size (in bytes) of the attachment: " + $email.GetAttachmentSize($i))

    $i = $i + 1
}

$("--")

# 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
$("Number of related items = " + $numRelated)
$i = 0
while ($i -lt $numRelated) {
    $("---- Related Item " + $i)

    # Examine the filename (if any)
    $("filename: " + $email.GetRelatedFilename($i))
    # Examine the content-ID (if any)
    $("Content-ID: " + $email.GetRelatedContentID($i))
    # Examine the content-type
    $("Content-Type: " + $email.GetRelatedContentType($i))
    # Examine the content-location (if any)
    $("Content-Location" + $email.GetRelatedContentLocation($i))

    $i = $i + 1
}

# The email could also have attached messages.
# An attached message is another email that was attached to this email.
$em = New-Object Chilkat.Email
$numAttachedMessages = $email.NumAttachedMessages
$("Number of attached messages = " + $numAttachedMessages)
$i = 0
while ($i -lt $numAttachedMessages) {
    $("---- Attached message " + $i)

    # Examine the attached email
    $email.GetAttachedEmail($i,$em)
    $("from: " + $em.From)
    $("subject: " + $em.Subject)
    $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
$("Number of reports = " + $numReports)
$i = 0
while ($i -lt $numReports) {
    $("---- Report " + $i)
    # Get the raw report data...
    $($email.GetReport($i))
    $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() -eq $true) {

    $("--- Delivery Status Information:")
    $("Status: " + $email.GetDeliveryStatusInfo("Status"))
    $("Action: " + $email.GetDeliveryStatusInfo("Action"))
    $("Reporting-MTA: " + $email.GetDeliveryStatusInfo("Reporting-MTA"))

    $jsonDsnInfo = New-Object Chilkat.JsonObject
    $email.GetDsnInfo($jsonDsnInfo)
    $jsonDsnInfo.EmitCompact = $false
    $($jsonDsnInfo.Emit())
}