Sample code for 30+ languages & platforms
PureBasic

Process New Email by Scanning for Senders

Scan email and save application-selected emails to EML files with unique filenames.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkImap.pb"
IncludeFile "CkEmailBundle.pb"
IncludeFile "CkMessageSet.pb"
IncludeFile "CkEmail.pb"

Procedure ChilkatExample()

    success.i = 0

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

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

    ; Connect to an IMAP server.
    ; Use TLS
    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

    ; Login
    success = CkImap::ckLogin(imap,"myLogin","myPassword")
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        ProcedureReturn
    EndIf

    ; Select an IMAP mailbox
    success = CkImap::ckSelectMailbox(imap,"Inbox")
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        ProcedureReturn
    EndIf

    ; We can choose to fetch UIDs or sequence numbers.
    fetchUids.i = 1

    ; Fetch messages from the mailbox using a search criteria.
    ; This example finds NEW emails: these are emails that have the RECENT flag set, but not the SEEN flag:
    messageSet.i = CkMessageSet::ckCreate()
    If messageSet.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkImap::ckQueryMbx(imap,"NEW",fetchUids,messageSet)
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        CkMessageSet::ckDispose(messageSet)
        ProcedureReturn
    EndIf

    ; This example will download headers, and then download
    ; the full email for those emails sent from a contact
    ; in our database.

    ; When downloading headers, each email object contains
    ; (obviously) the headers, but the body will be missing.
    ; Also, attachments will not be included.  However, it is
    ; possible to get information about the attachments
    ; as well as the complete size of the email.
    bundle.i = CkEmailBundle::ckCreate()
    If bundle.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    headersOnly.i = 1
    success = CkImap::ckFetchMsgSet(imap,headersOnly,messageSet,bundle)
    If success = 0
        Debug CkImap::ckLastErrorText(imap)
        CkImap::ckDispose(imap)
        CkMessageSet::ckDispose(messageSet)
        CkEmailBundle::ckDispose(bundle)
        ProcedureReturn
    EndIf

    ; Loop over the email objects...
    emailHeader.i = CkEmail::ckCreate()
    If emailHeader.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

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

    i.i = 0
    numEmails.i = CkEmailBundle::ckMessageCount(bundle)
    While i < numEmails
        CkEmailBundle::ckEmailAt(bundle,i,emailHeader)

        ; The sender's email address and name are available
        ; in the From, FromAddress, and FromName properties.
        ; If the sender is "Chilkat Support <support@chilkatsoft.com",
        ; then the From property will hold the entire string.
        ; the FromName property contains"Chilkat Support",
        ; and the FromAddress property contains "support@chilkatsoft.com"
        Debug CkEmail::ckFrom(emailHeader)
        Debug CkEmail::ckFromAddress(emailHeader)
        Debug CkEmail::ckFromName(emailHeader)

        ; Assume at this point your code checks to see if the sender
        ; is one in your contacts database.  If so, this is
        ; the code you would write to download the entire
        ; email and save it to a file.

        ; The ckx-imap-uid header field is added when
        ; headers are downloaded.  This makes it possible
        ; to get the UID from the email object.
        uidStr.s = CkEmail::ckGetHeaderField(emailHeader,"ckx-imap-uid")
        uid.i = Val(uidStr)

        success = CkImap::ckFetchEmail(imap,0,uid,1,fullEmail)
        If success = 0
            Debug CkImap::ckLastErrorText(imap)
            CkImap::ckDispose(imap)
            CkMessageSet::ckDispose(messageSet)
            CkEmailBundle::ckDispose(bundle)
            CkEmail::ckDispose(emailHeader)
            CkEmail::ckDispose(fullEmail)
            ProcedureReturn
        EndIf

        ; You can use the GenerateFilename method to
        ; generate a unique filename...
        filename.s = CkEmail::ckGenerateFilename(fullEmail)

        ; SaveEml saves the entire email, including attachments.
        success = CkEmail::ckSaveEml(fullEmail,filename)

        Debug "--"

        i = i + 1
    Wend

    ; Disconnect from the IMAP server.
    success = CkImap::ckDisconnect(imap)


    CkImap::ckDispose(imap)
    CkMessageSet::ckDispose(messageSet)
    CkEmailBundle::ckDispose(bundle)
    CkEmail::ckDispose(emailHeader)
    CkEmail::ckDispose(fullEmail)


    ProcedureReturn
EndProcedure