Sample code for 30+ languages & platforms
Tcl

How to Download Messages in MessageSet One at a Time

See more IMAP Examples

If a message set contains a huge number of emails, it's NOT a good idea to try to download all at once into an email bundle using a method such as FetchBundle. It's better to iterate over the messages in the set to download one by one.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set imap [new_CkImap]

# Connect using TLS.
CkImap_put_Ssl $imap 1
CkImap_put_Port $imap 993
set success [CkImap_Connect $imap "imap.example.com"]
if {$success == 0} then {
    puts [CkImap_lastErrorText $imap]
    delete_CkImap $imap
    exit
}

# Authenticate
set success [CkImap_Login $imap "email_account_login" "email_account_password"]
if {$success == 0} then {
    puts [CkImap_lastErrorText $imap]
    delete_CkImap $imap
    exit
}

# Select an IMAP mailbox
set success [CkImap_SelectMailbox $imap "Inbox"]
if {$success == 0} then {
    puts [CkImap_lastErrorText $imap]
    delete_CkImap $imap
    exit
}

# Search for messages and return a set of matching messages.
# (This example will simply search for ALL messages.)
set fetchUids 1

set messageSet [new_CkMessageSet]

set success [CkImap_QueryMbx $imap "ALL" $fetchUids $messageSet]
if {$success == 0} then {
    puts [CkImap_lastErrorText $imap]
    delete_CkImap $imap
    delete_CkMessageSet $messageSet
    exit
}

puts "Number of messages = [CkMessageSet_get_Count $messageSet]"

set email [new_CkEmail]

set i 0
while {$i < [CkMessageSet_get_Count $messageSet]} {
    set success [CkImap_FetchEmail $imap 0 [CkMessageSet_GetId $messageSet $i] $fetchUids $email]
    if {$success == 0} then {
        puts [CkImap_lastErrorText $imap]
        delete_CkImap $imap
        delete_CkMessageSet $messageSet
        delete_CkEmail $email
        exit
    }

    puts [CkEmail_from $email]; [CkEmail_subject $email]

    set i [expr $i + 1]
}

puts "OK"

delete_CkImap $imap
delete_CkMessageSet $messageSet
delete_CkEmail $email