Sample code for 30+ languages & platforms
DataFlex

MIME Body vs. Sub-Parts

See more MIME Examples

Explains the difference between sub-parts and body.

MIME documents (i.e. messages) can have a nested structure. The simplest MIME message contains a header followed by content (possibly encoded). The header is delimited from the content by two consecutive CRLF's.

A MIME message may be multipart. If so, then the Content-Type header field indicates "multipart" and the content the follows the header is itself a MIME message, which may also be multipart, etc. You can see how MIME messages effectively have a tree structure. The non-leaf nodes have Content-Types that are "multipart/" and the leaf nodes have non-multipart Content-Types.

The Chilkat MIME component/library uses two terms that need to be understood in order to effectively use the API. These are "body" and "sub-part". A multipart node has 1 or more sub-parts, but its body is empty. A leaf node (i.e. non-multipart node) has no sub-parts, but the body is (usually) non-empty.

This example creates a multipart MIME message and shows the results of getting the sub-parts and body of each node.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoMime
    Variant vPart1
    Handle hoPart1
    Variant vPart2
    Handle hoPart2
    Integer n
    Variant vPart
    Handle hoPart
    String sTemp1

    Move False To iSuccess

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

    Get Create (RefClass(cComChilkatMime)) To hoMime
    If (Not(IsComObjectCreated(hoMime))) Begin
        Send CreateComObject of hoMime
    End

    // Create a multipart/mixed MIME message with two sub-parts.
    // We'll use the Base64 encoding for the 2nd sub-part.
    Get Create (RefClass(cComChilkatMime)) To hoPart1
    If (Not(IsComObjectCreated(hoPart1))) Begin
        Send CreateComObject of hoPart1
    End
    Get ComSetBodyFromPlainText Of hoPart1 "This is part 1" To iSuccess

    Get Create (RefClass(cComChilkatMime)) To hoPart2
    If (Not(IsComObjectCreated(hoPart2))) Begin
        Send CreateComObject of hoPart2
    End
    Get ComSetBodyFromPlainText Of hoPart2 "This is part 2" To iSuccess
    Set ComEncoding Of hoPart2 To "base64"

    Get ComNewMultipartMixed Of hoMime To iSuccess
    Set ComUseMmDescription Of hoMime To False
    Get pvComObject of hoPart1 to vPart1
    Get ComAppendPart Of hoMime vPart1 To iSuccess
    Get pvComObject of hoPart2 to vPart2
    Get ComAppendPart Of hoMime vPart2 To iSuccess

    // Show the MIME message:
    Get ComGetMime Of hoMime To sTemp1
    Showln sTemp1

    // Here's the MIME:
    // Content-Type: multipart/mixed;
    // 	boundary="------------040605030407000302060008"
    // 
    // --------------040605030407000302060008
    // Content-Type: text/plain;
    // 	 charset="us-ascii"
    // Content-Transfer-Encoding: 7bit
    // 
    // This is part 1
    // --------------040605030407000302060008
    // Content-Type: text/plain;
    // 	 charset="us-ascii"
    // Content-Transfer-Encoding: base64
    // 
    // VGhpcyBpcyBwYXJ0IDI=
    // 
    // --------------040605030407000302060008--

    // If we examine the root node of the MIME message, 
    // we see that it has 2 sub-parts and the body is empty (as expected)
    Get ComNumParts Of hoMime To n
    Showln "Num Parts = " n
    Get ComGetBodyDecoded Of hoMime To sTemp1
    Showln "Body = " sTemp1

    // The GetEntireBody retrieves the entire content after
    // the header.  (Perhaps GetEntireBody should've been named
    // GetEntireContent to make it less confusing...)
    Showln "---- EntireBody:"
    Get ComGetEntireBody Of hoMime To sTemp1
    Showln sTemp1
    Showln "********"

    // Now examine the 2nd sub-part.  It has a body encoded
    // using base64.  Get the contents of the body in both
    // decoded and encoded forms:

    // index 0 is the 1st part, index 1 is the 2nd part.
    Get Create (RefClass(cComChilkatMime)) To hoPart
    If (Not(IsComObjectCreated(hoPart))) Begin
        Send CreateComObject of hoPart
    End
    Get pvComObject of hoPart to vPart
    Get ComPartAt Of hoMime 1 vPart To iSuccess

    Showln "Decoded Body:"
    Get ComGetBodyDecoded Of hoPart To sTemp1
    Showln sTemp1
    Showln "Encoded Body:"
    Get ComGetBodyEncoded Of hoPart To sTemp1
    Showln sTemp1


End_Procedure