Sample code for 30+ languages & platforms
Lianja

Iterate MIME Parts of an Email

See more Email Object Examples

Demonstrates how to iterate over the MIME sub-parts of an email, and retrieve the content of each MIME sub-part body.

Note: This example requires some new features added to Chilkat v9.5.0.95.

Chilkat Lianja Downloads

Lianja
llSuccess = .F.

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

// See the following Chilkat post to Quickly Understand Email MIME

loEmail = createobject("CkEmail")

llSuccess = loEmail.LoadEml("qa_data/eml/sample.eml")
if (llSuccess = .F.) then
    ? "Failed to load .eml"
    release loEmail
    return
endif

loSbContentType = createobject("CkStringBuilder")
llCaseSensitive = .F.

// Get the total number of non-multipart MIME sub-parts.
// (This is a simple way of iterating over all the MIME leaf parts regardless of the MIME tree structure)
llInlineOnly = .F.
llExcludeAttachments = .F.
lcSearchSpec = "*/*"

lnNumParts = loEmail.GetNumPartsOfType(lcSearchSpec,llInlineOnly,llExcludeAttachments)
i = 0
do while i < lnNumParts
    // What is the Content-Type of this MIME part?
    loSbContentType.Append(loEmail.GetNthContentType(i,lcSearchSpec,llInlineOnly,llExcludeAttachments))
    if (loSbContentType.StartsWith("text/",llCaseSensitive) = .T.) then
        // Get the text body of this MIME part.
        lcTextBody = loEmail.GetNthTextPartOfType(i,lcSearchSpec,llInlineOnly,llExcludeAttachments)
        ? "Got text body for " + loSbContentType.GetAsString()
    else
        if (loSbContentType.ContentsEqual("message/rfc822",llCaseSensitive) = .T.) then
            // If the Content-Type is message/rfc822, then the MIME body for this part contains a full embedded MIME messages.
            // Your application could load it into a Chilkat email object and recursively process...
            loAttachedEmail = createobject("CkEmail")
            loBdMime = createobject("CkBinData")
            loEmail.GetNthBinaryPartOfTypeBd(i,lcSearchSpec,llInlineOnly,llExcludeAttachments,loBdMime)
            loAttachedEmail.SetFromMimeBd(loBdMime)
            // Now your app can recursively process the attachedEmail...
        else
            // Get the bytes of this MIME body part.
            loBd = createobject("CkBinData")
            loEmail.GetNthBinaryPartOfTypeBd(i,lcSearchSpec,llInlineOnly,llExcludeAttachments,loBd)
            ? "Got binary body for " + loSbContentType.GetAsString() + " numBytes = " + str(loBd.NumBytes)
        endif

    endif

    loSbContentType.Clear()
    i = i + 1
enddo


release loEmail
release loSbContentType
release loAttachedEmail
release loBdMime
release loBd