(DataFlex) MIME Body vs. Sub-Parts
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.
Use ChilkatAx-win32.pkg
Procedure Test
Handle hoMime
Variant vPart1
Handle hoPart1
Boolean iSuccess
Variant vPart2
Handle hoPart2
Integer n
Variant vPart
Handle hoPart
String sTemp1
// 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 ComGetPart Of hoMime 1 To vPart
If (IsComObject(vPart)) Begin
Get Create (RefClass(cComChilkatMime)) To hoPart
Set pvComObject Of hoPart To vPart
End
Showln "Decoded Body:"
Get ComGetBodyDecoded Of hoPart To sTemp1
Showln sTemp1
Showln "Encoded Body:"
Get ComGetBodyEncoded Of hoPart To sTemp1
Showln sTemp1
Send Destroy of hoPart
End_Procedure
|