Sample code for 30+ languages & platforms
PureBasic

List and Inspect IMAP Mailboxes

See more IMAP Examples

Demonstrates the Chilkat Mailboxes class, a read-only result collection populated by Imap.MbxList. This example connects to an IMAP server, lists all mailboxes into a Mailboxes object, then loops from 0 to Count - 1 and inspects each mailbox: its name (GetName), whether it is selectable (IsSelectable) or marked (IsMarked), whether it may have child mailboxes (HasInferiors), a specific flag (HasFlag), and all of its flags both as a string (GetFlags) and individually (GetNumFlags with GetNthFlag). Finally it looks up a mailbox by name with GetMailboxIndex.

Background: Mailboxes is how an application renders an IMAP folder tree. Because it is read-only, you never construct it directly — you receive it from MbxList and read its entries by index. Mailbox names come back as normal Unicode text (Chilkat handles the modified UTF-7 / IMAP UTF-8 encoding at the protocol level), so a name from GetName can be passed straight to methods like SelectMailbox. Note that HasInferiors is often true: it means children exist or may be created, which is not the same as \HasChildren.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkMailboxes.pb"
IncludeFile "CkImap.pb"

Procedure ChilkatExample()

    success.i = 0

    ;  Demonstrates using Chilkat.Imap to populate a Mailboxes object (via MbxList), then looping
    ;  over the collection to inspect each mailbox's name and attributes.  Mailboxes is a read-only
    ;  result collection -- applications inspect the entries but do not add, remove, or modify them.

    imap.i = CkImap::ckCreate()
    If imap.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkImap::setCkSsl(imap, 1)
    CkImap::setCkPort(imap, 993)

    success = CkImap::ckConnect(imap,"imap.example.com")
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        ProcedureReturn
    EndIf

    success = CkImap::ckLogin(imap,"user@example.com","myPassword")
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        ProcedureReturn
    EndIf

    ;  Populate a Mailboxes object with the full list of mailboxes.  The first argument requests
    ;  all mailboxes (not subscribed-only) and "*" matches any name.
    subscribedOnly.i = 0
    mailboxes.i = CkMailboxes::ckCreate()
    If mailboxes.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkImap::ckMbxList(imap,subscribedOnly,"","*",mailboxes)
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        CkMailboxes::ckDispose(mailboxes)
        ProcedureReturn
    EndIf

    ;  Loop over each mailbox in the returned collection.
    n.i = CkMailboxes::ckCount(mailboxes)
    Debug "Number of mailboxes: " + Str(n)

    i.i
    For i = 0 To n - 1
        name.s = CkMailboxes::ckGetName(mailboxes,i)
        Debug "Mailbox: " + name

        ;  Whether the mailbox can be selected or examined for message access.
        If CkMailboxes::ckIsSelectable(mailboxes,i)
            Debug "  Selectable: yes"
        Else
            Debug "  Selectable: no"
        EndIf

        ;  Whether the server marked the mailbox as possibly having new messages.
        If CkMailboxes::ckIsMarked(mailboxes,i)
            Debug "  Marked: yes"
        EndIf

        ;  Whether the mailbox has, or may contain, child mailboxes.
        If CkMailboxes::ckHasInferiors(mailboxes,i)
            Debug "  May have child mailboxes"
        EndIf

        ;  Check for a specific flag by name.  Include the leading backslash for a system flag;
        ;  in CkScript a literal backslash in a string is written as "\\".
        If CkMailboxes::ckHasFlag(mailboxes,i,"\HasChildren")
            Debug "  Has child mailboxes"
        EndIf

        ;  Get all of the mailbox's flags as a comma-separated string.
        flags.s = CkMailboxes::ckGetFlags(mailboxes,i)
        Debug "  Flags: " + flags

        ;  Iterate the flags individually.
        numFlags.i = CkMailboxes::ckGetNumFlags(mailboxes,i)
        j.i
        For j = 0 To numFlags - 1
            flag.s = CkMailboxes::ckGetNthFlag(mailboxes,i,j)
            Debug "    Flag " + Str(j) + ": " + flag
        Next
    Next

    ;  Look up a mailbox by name.  Returns -1 if no mailbox with that name is present.
    sentIndex.i = CkMailboxes::ckGetMailboxIndex(mailboxes,"Sent")
    If sentIndex >= 0
        Debug "The Sent mailbox is at index " + Str(sentIndex)
    EndIf

    success = CkImap::ckDisconnect(imap)
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        CkMailboxes::ckDispose(mailboxes)
        ProcedureReturn
    EndIf



    CkImap::ckDispose(imap)
    CkMailboxes::ckDispose(mailboxes)


    ProcedureReturn
EndProcedure