Sample code for 30+ languages & platforms
Lua Requires Chilkat v11.0.0+

Move Selected Emails to another Mailbox Folder

See more IMAP Examples

Downloads emails one by one in a selected mailbox, decides which emails are to be moved, and then moves the set of messages to another mailbox folder.

Chilkat Lua Downloads

Lua

    -- In the following call to loadlib, change the path (./chilkat.dll) to the relative or absolute directory where the chilkat.dll, chilkat.so, or chilkat.dylib is located.
    chilkat = assert(package.loadlib("./chilkat.dll", "luaopen_chilkat"))()
    print(chilkat._VERSION)

    local success = false

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

    local imap = chilkat.newImap{}

    --  Connect to an IMAP server.
    --  Use TLS
    imap:setSsl(true)
    imap:setPort(993)
    success = imap:Connect("imap.example.com")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Login
    success = imap:Login("myLogin","myPassword")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Select an IMAP mailbox
    success = imap:SelectMailbox("Inbox")
    if success == false then
        print(imap:LastErrorText())

    end

    --  Normally, when an email is downloaded, its "Seen" flag is automatically set.
    --  We don't want our program to be interfering with the "Seen" flags.
    --  To do this, set the PeekMode to true.
    imap:setPeekMode(true)

    --  After selecting the mailbox, the NumMessages property
    --  will contain the number of emails in the mailbox.
    --  When sequence numbers (not UIDs) are used to reference emails,
    --  they range from 1 to N, where N is the number of messages in the mailbox.
    --  This example will download the headers by sequence numbers.
    local numEmails = imap:NumMessages()

    local mset = chilkat.newMessageSet{}

    --  Indicate that mset contains sequence numbers, not UIDs.
    mset:setHasUids(false)

    --  Fetch each email and decide for each if it is to be moved
    --  to a particular other mailbox.  If so, we'll add the sequence number to
    --  the mset, and then move all emails in the mset to the other mailbox.
    local email = chilkat.newEmail{}
    local i = 0
    while i < numEmails do
        --  Fetch the email by sequence number.
        success = imap:FetchEmail(false,i + 1,false,email)
        if success == false then
            print(imap:LastErrorText())

        end

        --  If it is decided to move the email, add the sequence number to mset, like this:
        mset:InsertId(i + 1)

    end

    --  If there are emails in mset to be moved, then do it..
    if mset:Count() > 0 then
        local destFolder = "Inbox/SomeOtherFolder"
        --  Assuming your IMAP server supports the feature that allows for messages to be moved to another folder...
        success = imap:MoveMessages(mset,destFolder)
        if success == false then
            print(imap:LastErrorText())

        end

    end

    --  Disconnect from the IMAP server.
    success = imap:Disconnect()