Sample code for 30+ languages & platforms
Objective-C

Search IMAP Mailbox for Email Matching Criteria

Searching an IMAP mailbox for messages that match search criteria.

Chilkat Objective-C Downloads

Objective-C
#import <CkoImap.h>
#import <NSString.h>
#import <CkoMessageSet.h>
#import <CkoEmailBundle.h>
#import <CkoEmail.h>

BOOL success = NO;

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

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

//  Connect to an IMAP server.
//  Use TLS
imap.Ssl = YES;
imap.Port = [NSNumber numberWithInt:993];
success = [imap Connect: @"imap.example.com"];
if (success == NO) {
    NSLog(@"%@",imap.LastErrorText);
    return;
}

//  Login
success = [imap Login: @"myLogin" password: @"myPassword"];
if (success == NO) {
    NSLog(@"%@",imap.LastErrorText);
    return;
}

//  Select an IMAP mailbox
success = [imap SelectMailbox: @"Inbox"];
if (success == NO) {
    NSLog(@"%@",imap.LastErrorText);
    return;
}

//  We can choose to fetch UIDs or sequence numbers.
BOOL fetchUids = YES;

//  Here are examples of different search criteria:

//  Return all messages.
NSString *allMsgs = @"ALL";

//  Search for already-answered emails.
NSString *answered = @"ANSWERED";

//  Search for messages on a specific date.
//  The date string is DD-Month-YYYY where Month is
//  Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, or Dec.
NSString *onDate = @"SENTON 05-Mar-2007";

//  Search for messages between two dates.  SENTBEFORE
//  finds emails sent before a date, and SENTSINCE finds
//  email sent on or after a date.  The "AND" operation
//  is implied by joining criteria, separated by spaces.
NSString *betweenDates = @"SENTSINCE 01-Mar-2007 SENTBEFORE 05-Mar-2007";

//  Another example of AND: find all unanswered emails
//  sent after 04-Mar-2007 with "Problem" in the subject:
NSString *complexSearch1 = @"UNANSWERED SENTSINCE 04-Mar-2007 Subject \"Problem\"";

//  Find messages with a specific string in the body:
NSString *bodySearch = @"BODY \"problem solved\"";

//  Using OR.  The syntax is OR <criteria1> <criteria2>. 
//  The "OR" comes first, followed by each criteria.
//  For example, to match all emails with "Help" or "Question" in the subject.
//  You'll notice that literal strings may be quoted or unquoted.
//  If a literal contains SPACE characters, quote it:
NSString *orSearch = @"OR SUBJECT Help SUBJECT Question";

//  ----------------------------------------------
//  Strings are case-insensitive when searching....
//  ----------------------------------------------

//  Find all emails sent from yahoo.com addresses:
NSString *fromSearch = @"FROM yahoo.com";
//  Find all emails sent from anyone with "John" in their name:
NSString *johnSearch = @"FROM John";

//  Find emails with the RECENT flag set:
NSString *recentSearch = @"RECENT";

//  Find emails that don't have the recent flag set:
NSString *notRecentSearch = @"NOT RECENT";
//  This is synonymous with "OLD":
NSString *oldSearch = @"OLD";

//  Find all emails marked for deletion:
NSString *markedForDeleteSearch = @"DELETED";

//  Find all emails having a specified header field with a value
//  containing a substring:
NSString *headerSearch = @"HEADER DomainKey-Signature paypal.com";

//  Find any emails having a specific header field.  If the 
//  2nd argument to the "HEADER" criteria is an empty string,
//  any email having the header field is returned regardless
//  of the header field's content.
//  Find any emails with a DomainKey-Signature field:
NSString *headerExistsSearch = @"HEADER DomainKey-Signature \"\"";

//  Find NEW emails: these are emails that have the RECENT flag
//  set, but not the SEEN flag:
NSString *newSearch = @"NEW";

//  Find emails larger than a certain number of bytes:
NSString *sizeLargerSearch = @"LARGER 500000";

//  Find emails marked as seen or not already seen:
NSString *seenSearch = @"SEEN";
NSString *notSeenSearch = @"NOT SEEN";

//  Find emails having a given substring in the TO header field:
NSString *toSearch = @"TO support@chilkatsoft.com";
//  A more long-winded way to do the same thing:
NSString *toSearch2 = @"HEADER TO support@chilkatsoft.com";

//  Find emails smaller than a size in bytes:
NSString *smallerSearch = @"SMALLER 30000";

//  Find emails that have a substring anywhere in the header
//  or body:
NSString *fullSubstringSearch = @"TEXT \"Zip Component\"";

//  Pass any of the above strings here to test a search:
CkoMessageSet *messageSet = [[CkoMessageSet alloc] init];
success = [imap QueryMbx: orSearch bUid: fetchUids msgSet: messageSet];
if (success == NO) {
    NSLog(@"%@",imap.LastErrorText);
    return;
}

//  Fetch the email headers into a bundle object:
CkoEmailBundle *bundle = [[CkoEmailBundle alloc] init];
BOOL headersOnly = YES;
success = [imap FetchMsgSet: headersOnly msgSet: messageSet bundle: bundle];
if (success == NO) {
    NSLog(@"%@",imap.LastErrorText);
    return;
}

//  Display the Subject and From of each email.
CkoEmail *email = [[CkoEmail alloc] init];
int i = 0;
while (i < [bundle.MessageCount intValue]) {
    [bundle EmailAt: [NSNumber numberWithInt: i] email: email];

    NSLog(@"%@",[email GetHeaderField: @"Date"]);
    NSLog(@"%@",email.Subject);
    NSLog(@"%@",email.From);
    NSLog(@"%@",@"--");

    i = i + 1;
}

//  Disconnect from the IMAP server.
success = [imap Disconnect];