Sample code for 30+ languages & platforms
AutoIt

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

AutoIt
Local $bSuccess = False

; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.

Local $sEmlPath = "C:/AAWorkarea/beatrix/roesner.eml"

$oMime = ObjCreate("Chilkat.Mime")

$bSuccess = $oMime.LoadMimeFile($sEmlPath)
If ($bSuccess = False) Then
    ConsoleWrite($oMime.LastErrorText & @CRLF)
    Exit
EndIf

ConsoleWrite("---- MIME structure ----" & @CRLF)
ConsoleWrite($oMime.GetStructure("text") & @CRLF)
ConsoleWrite("------------------------" & @CRLF)

$oEmail = ObjCreate("Chilkat.Email")
$bSuccess = $oEmail.LoadEml($sEmlPath)

; 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.
ConsoleWrite("Email was Signed: " & $oEmail.ReceivedSigned & @CRLF)
ConsoleWrite("Email was Encrypted: " & $oEmail.ReceivedEncrypted & @CRLF)
If ($oEmail.ReceivedSigned = True) Then
    ConsoleWrite("Signature(s) valid = " & $oEmail.SignaturesValid & @CRLF)
EndIf

If ($oEmail.ReceivedEncrypted = True) Then
    ConsoleWrite("Decrypted successfully = " & $oEmail.Decrypted & @CRLF)
EndIf

Local $i = 0
Local $iNumAttach = $oEmail.NumAttachments
ConsoleWrite("Number of attachments = " & $iNumAttach & @CRLF)

While $i < $iNumAttach
    ConsoleWrite("---- Attachment " & $i & @CRLF)

    ; Examine the filename (if any)
    ConsoleWrite("filename: " & $oEmail.GetAttachmentFilename($i) & @CRLF)
    ; Examine the content-ID (if any)
    ConsoleWrite("Content-ID: " & $oEmail.GetAttachmentContentID($i) & @CRLF)
    ; Examine the content-type
    ConsoleWrite("Content-Type: " & $oEmail.GetAttachmentContentType($i) & @CRLF)
    ; Examine the content-disposition
    ConsoleWrite("Content-Disposition" & $oEmail.GetAttachmentHeader($i,"content-disposition") & @CRLF)
    ; Examine the attachment size:
    ConsoleWrite("Size (in bytes) of the attachment: " & $oEmail.GetAttachmentSize($i) & @CRLF)

    $i = $i + 1
Wend
ConsoleWrite("--" & @CRLF)

; 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.

Local $iNumRelated = $oEmail.NumRelatedItems
ConsoleWrite("Number of related items = " & $iNumRelated & @CRLF)
$i = 0
While $i < $iNumRelated
    ConsoleWrite("---- Related Item " & $i & @CRLF)

    ; Examine the filename (if any)
    ConsoleWrite("filename: " & $oEmail.GetRelatedFilename($i) & @CRLF)
    ; Examine the content-ID (if any)
    ConsoleWrite("Content-ID: " & $oEmail.GetRelatedContentID($i) & @CRLF)
    ; Examine the content-type
    ConsoleWrite("Content-Type: " & $oEmail.GetRelatedContentType($i) & @CRLF)
    ; Examine the content-location (if any)
    ConsoleWrite("Content-Location" & $oEmail.GetRelatedContentLocation($i) & @CRLF)

    $i = $i + 1
Wend

; The email could also have attached messages.
; An attached message is another email that was attached to this email.
$oEm = ObjCreate("Chilkat.Email")
Local $iNumAttachedMessages = $oEmail.NumAttachedMessages
ConsoleWrite("Number of attached messages = " & $iNumAttachedMessages & @CRLF)
$i = 0
While $i < $iNumAttachedMessages
    ConsoleWrite("---- Attached message " & $i & @CRLF)

    ; Examine the attached email
    $oEmail.GetAttachedEmail($i,$oEm)
    ConsoleWrite("from: " & $oEm.From & @CRLF)
    ConsoleWrite("subject: " & $oEm.Subject & @CRLF)
    $i = $i + 1
Wend

; An email could also be a multipart/report email. 
; This is a DSN (Delivery Status Notification)
; The NumReports property indicates how many "reports" exist.
Local $iNumReports = $oEmail.NumReports
ConsoleWrite("Number of reports = " & $iNumReports & @CRLF)
$i = 0
While $i < $iNumReports
    ConsoleWrite("---- Report " & $i & @CRLF)
    ; Get the raw report data...
    ConsoleWrite($oEmail.GetReport($i) & @CRLF)
    $i = $i + 1
Wend

; If the email is a multipart/report, then the information
; from the message/delivery-status part of the email can be retrieved:
If ($oEmail.IsMultipartReport() = True) Then

    ConsoleWrite("--- Delivery Status Information:" & @CRLF)
    ConsoleWrite("Status: " & $oEmail.GetDeliveryStatusInfo("Status") & @CRLF)
    ConsoleWrite("Action: " & $oEmail.GetDeliveryStatusInfo("Action") & @CRLF)
    ConsoleWrite("Reporting-MTA: " & $oEmail.GetDeliveryStatusInfo("Reporting-MTA") & @CRLF)

    $oJsonDsnInfo = ObjCreate("Chilkat.JsonObject")
    $oEmail.GetDsnInfo($oJsonDsnInfo)
    $oJsonDsnInfo.EmitCompact = False
    ConsoleWrite($oJsonDsnInfo.Emit() & @CRLF)
EndIf