Sample code for 30+ languages & platforms
Swift

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

Swift

func chilkatTest() {
    var success: Bool = false

    // 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

    let email = CkoEmail()!

    success = email.loadEml(mimePath: "qa_data/eml/sample.eml")
    if success == false {
        print("Failed to load .eml")
        return
    }

    let sbContentType = CkoStringBuilder()!
    var caseSensitive: Bool = false

    // 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)
    var inlineOnly: Bool = false
    var excludeAttachments: Bool = false
    var searchSpec: String? = "*/*"

    var numParts: Int = email.getNumParts(ofType: searchSpec, inlineOnly: inlineOnly, excludeAttachments: excludeAttachments).intValue
    var i: Int = 0
    while i < numParts {
        // What is the Content-Type of this MIME part?
        sbContentType.append(value: email.getNthContentType(index: i, contentType: searchSpec, inlineOnly: inlineOnly, excludeAttachments: excludeAttachments))
        if sbContentType.starts(with: "text/", caseSensitive: caseSensitive) == true {
            // Get the text body of this MIME part.
            var textBody: String? = email.getNthTextPart(ofType: i, contentType: searchSpec, inlineOnly: inlineOnly, excludeAttachments: excludeAttachments)
            print("Got text body for \(sbContentType.getAsString()!)")
        }
        else {
            if sbContentType.contentsEqual(str: "message/rfc822", caseSensitive: caseSensitive) == true {
                // 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...
                let attachedEmail = CkoEmail()!
                let bdMime = CkoBinData()!
                email.getNthBinaryPart(ofTypeBd: i, contentType: searchSpec, inlineOnly: inlineOnly, excludeAttachments: excludeAttachments, bd: bdMime)
                attachedEmail.set(fromMimeBd: bdMime)
                // Now your app can recursively process the attachedEmail...
            }
            else {
                // Get the bytes of this MIME body part.
                let bd = CkoBinData()!
                email.getNthBinaryPart(ofTypeBd: i, contentType: searchSpec, inlineOnly: inlineOnly, excludeAttachments: excludeAttachments, bd: bd)
                print("Got binary body for \(sbContentType.getAsString()!) numBytes = \(bd.numBytes.intValue)")
            }

        }

        sbContentType.clear()
        i = i + 1
    }


}