Sample code for 30+ languages & platforms
Swift

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

Swift

func chilkatTest() {
    var success: Bool = false

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

    var emlPath: String? = "C:/AAWorkarea/beatrix/roesner.eml"

    let mime = CkoMime()!

    success = mime.loadFile(path: emlPath)
    if success == false {
        print("\(mime.lastErrorText!)")
        return
    }

    print("---- MIME structure ----")
    print("\(mime.getStructure(fmt: "text")!)")
    print("------------------------")

    let email = CkoEmail()!
    success = email.loadEml(mimePath: emlPath)

    // 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.
    print("Email was Signed: \(email.receivedSigned)")
    print("Email was Encrypted: \(email.receivedEncrypted)")
    if email.receivedSigned == true {
        print("Signature(s) valid = \(email.signaturesValid)")
    }

    if email.receivedEncrypted == true {
        print("Decrypted successfully = \(email.decrypted)")
    }

    var i: Int = 0
    var numAttach: Int = email.numAttachments.intValue
    print("Number of attachments = \(numAttach)")

    while i < numAttach {
        print("---- Attachment \(i)")

        // Examine the filename (if any)
        print("filename: \(email.getAttachmentFilename(index: i)!)")
        // Examine the content-ID (if any)
        print("Content-ID: \(email.getAttachmentContentID(index: i)!)")
        // Examine the content-type
        print("Content-Type: \(email.getAttachmentContentType(index: i)!)")
        // Examine the content-disposition
        print("Content-Disposition\(email.getAttachmentHeader(index: i, fieldName: "content-disposition")!)")
        // Examine the attachment size:
        print("Size (in bytes) of the attachment: \(email.getAttachmentSize(index: i).intValue)")

        i = i + 1
    }

    print("--")

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

    var numRelated: Int = email.numRelatedItems.intValue
    print("Number of related items = \(numRelated)")
    i = 0
    while i < numRelated {
        print("---- Related Item \(i)")

        // Examine the filename (if any)
        print("filename: \(email.getRelatedFilename(index: i)!)")
        // Examine the content-ID (if any)
        print("Content-ID: \(email.getRelatedContentID(index: i)!)")
        // Examine the content-type
        print("Content-Type: \(email.getRelatedContentType(index: i)!)")
        // Examine the content-location (if any)
        print("Content-Location\(email.getRelatedContentLocation(index: i)!)")

        i = i + 1
    }

    // The email could also have attached messages.
    // An attached message is another email that was attached to this email.
    let em = CkoEmail()!
    var numAttachedMessages: Int = email.numAttachedMessages.intValue
    print("Number of attached messages = \(numAttachedMessages)")
    i = 0
    while i < numAttachedMessages {
        print("---- Attached message \(i)")

        // Examine the attached email
        email.getAttached(index: i, email: em)
        print("from: \(em.from!)")
        print("subject: \(em.subject!)")
        i = i + 1
    }

    // An email could also be a multipart/report email. 
    // This is a DSN (Delivery Status Notification)
    // The NumReports property indicates how many "reports" exist.
    var numReports: Int = email.numReports.intValue
    print("Number of reports = \(numReports)")
    i = 0
    while i < numReports {
        print("---- Report \(i)")
        // Get the raw report data...
        print("\(email.getReport(index: i)!)")
        i = i + 1
    }

    // If the email is a multipart/report, then the information
    // from the message/delivery-status part of the email can be retrieved:
    if email.isMultipartReport() == true {

        print("--- Delivery Status Information:")
        print("Status: \(email.getDeliveryStatusInfo(fieldName: "Status")!)")
        print("Action: \(email.getDeliveryStatusInfo(fieldName: "Action")!)")
        print("Reporting-MTA: \(email.getDeliveryStatusInfo(fieldName: "Reporting-MTA")!)")

        let jsonDsnInfo = CkoJsonObject()!
        email.getDsnInfo(json: jsonDsnInfo)
        jsonDsnInfo.emitCompact = false
        print("\(jsonDsnInfo.emit()!)")
    }


}