Sample code for 30+ languages & platforms
Objective-C

Copy Email from one IMAP Account to Another

See more IMAP Examples

Demonstrates how to copy the email in a mailbox from one account to another.

Chilkat Objective-C Downloads

Objective-C
#import <CkoImap.h>
#import <CkoMessageSet.h>
#import <CkoFileAccess.h>
#import <NSString.h>
#import <CkoStringBuilder.h>

BOOL success = NO;

CkoImap *imapSrc = [[CkoImap alloc] init];

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

//  Connect to our source IMAP server.
imapSrc.Ssl = YES;
imapSrc.Port = [NSNumber numberWithInt:993];
success = [imapSrc Connect: @"MY-IMAP-DOMAIN"];
if (success != YES) {
    NSLog(@"%@",imapSrc.LastErrorText);
    return;
}

//  Login to the source IMAP server
success = [imapSrc Login: @"MY-IMAP-LOGIN" password: @"MY-IMAP-PASSWORD"];
if (success != YES) {
    NSLog(@"%@",imapSrc.LastErrorText);
    return;
}

CkoImap *imapDest = [[CkoImap alloc] init];

//  Connect to our destination IMAP server.
imapDest.Ssl = YES;
imapDest.Port = [NSNumber numberWithInt:993];
success = [imapDest Connect: @"MY-IMAP-DOMAIN2"];
if (success != YES) {
    NSLog(@"%@",imapDest.LastErrorText);
    return;
}

//  Login to the destination IMAP server
success = [imapDest Login: @"MY-IMAP-LOGIN2" password: @"MY-IMAP-PASSWORD2"];
if (success != YES) {
    NSLog(@"%@",imapDest.LastErrorText);
    return;
}

//  Select a source IMAP mailbox on the source IMAP server
success = [imapSrc SelectMailbox: @"Inbox"];
if (success != YES) {
    NSLog(@"%@",imapSrc.LastErrorText);
    return;
}

BOOL fetchUids = YES;

//  Get the set of UIDs for all emails on the source server.
CkoMessageSet *mset = [imapSrc Search: @"ALL" bUid: fetchUids];
if (imapSrc.LastMethodSuccess != YES) {
    NSLog(@"%@",imapSrc.LastErrorText);
    return;
}

//  Load the complete set of UIDs that were previously copied.
//  We dont' want to copy any of these to the destination.
CkoFileAccess *fac = [[CkoFileAccess alloc] init];
CkoMessageSet *msetAlreadyCopied = [[CkoMessageSet alloc] init];
NSString *strMsgSet = [fac ReadEntireTextFile: @"qa_cache/saAlreadyLoaded.txt" charset: @"utf-8"];
if (fac.LastMethodSuccess == YES) {
    [msetAlreadyCopied FromCompactString: strMsgSet];
}

int numUids = [mset.Count intValue];
CkoStringBuilder *sbFlags = [[CkoStringBuilder alloc] init];

int i = 0;
while (i < numUids) {

    //  If this UID was not already copied...
    int uid = [mset GetId: [NSNumber numberWithInt: i]];
    if (![msetAlreadyCopied ContainsId: uid]) {

        NSLog(@"%@%d%@",@"copying ",uid,@"...");

        //  Get the flags.
        NSString *flags = [imapSrc FetchFlags: uid bUid: YES];
        if (imapSrc.LastMethodSuccess == NO) {
            NSLog(@"%@",imapSrc.LastErrorText);
            return;
        }

        [sbFlags SetString: flags];

        //  Get the MIME of this email from the source.
        NSString *mimeStr = [imapSrc FetchSingleAsMime: uid bUid: YES];
        if (imapSrc.LastMethodSuccess == NO) {
            NSLog(@"%@",imapSrc.LastErrorText);
            return;
        }

        BOOL seen = [sbFlags Contains: @"\\Seen" caseSensitive: NO];
        BOOL flagged = [sbFlags Contains: @"\\Flagged" caseSensitive: NO];
        BOOL answered = [sbFlags Contains: @"\\Answered" caseSensitive: NO];
        BOOL draft = [sbFlags Contains: @"\\Draft" caseSensitive: NO];

        success = [imapDest AppendMimeWithFlags: @"Inbox" mimeText: mimeStr seen: seen flagged: flagged answered: answered draft: draft];
        if (success != YES) {
            NSLog(@"%@",imapDest.LastErrorText);
            return;
        }

        //  Update msetAlreadyCopied with the uid just copied.
        [msetAlreadyCopied InsertId: uid];

        //  Save at every iteration just in case there's a failure..
        strMsgSet = [msetAlreadyCopied ToCompactString];
        [fac WriteEntireTextFile: @"qa_cache/saAlreadyLoaded.txt" fileData: strMsgSet charset: @"utf-8" includePreamble: NO];
    }

    i = i + 1;
}

//  Disconnect from the IMAP servers.
success = [imapSrc Disconnect];
success = [imapDest Disconnect];