IMAP.MRK file format

I managed to dig up some information on the IMAP.MRK file, for anyone brave enough to want to modify it pragmatically. The format is actually fairly simple, one header followed by zero or more message records.

If a MSG file has no corresponding record, MDaemon will update the IMAP.MRK file the next time an IMAP client or WorldClient user touches the folder, and the message will be treated as UNSEEN and UNREAD

The header is defined as follows:

struct IMAPMrkHeader
{
unsigned HeaderVersion;
unsigned UIDValidity;
unsigned UIDNext;
unsigned LastWriteCounter;
unsigned Filler0;
unsigned Filler1;
unsigned Filler2;
unsigned Filler3;
unsigned CRLF;
};

Each MSG file will have one record, which is defined as follows:

struct IMAPMrkMessage {
char Filename[MAX_IMAP_FILENAME];
unsigned char Flags;
unsigned UID;
unsigned Size;
time_t Date;
};

#define FLAG_SEEN 32
#define FLAG_ANSWERED 16
#define FLAG_FLAGGED 8
#define FLAG_DELETED 4
#define FLAG_DRAFT 2
#define FLAG_RECENT 1
#define MAX_IMAP_FILENAME 23
#define IMAP_RECORD_SIZE 36

So what do all those fields mean?

  • HeaderVersion is a tag to identify what file format the IMAP.MRK is using. The current value is 1. UIDValidity is the IMAP UID Validity for the folder. UIDNext is the UID that will be used for the next message added to the folder.
  • LastWriteCounter is a value that changes whenever something has changed in the file. This was added when IDLE support was added to the IMAP server, so that there’s a quick way to check for changes (by comparing this one value rather than doing a compare of the entire file’s contents).When changing records in the file, lock the IMAP folder, increment the LastWriteCounter, change the records, then unlock the folder.
  • UIDNext is the next UID to be assigned. To add records, lock the IMAP folder, increment the LastWriteCounter, and for each record you’re adding, use the current UIDNext value as its UID and then increment UIDNext.

So how do you lock a folder?

  • Lock an IMAP folder by creating a file “IMAP-foldername-email.lck”, where foldername is a “filename-safe” version of the folder name (” and ‘/’ characters replaced with ‘_’) and email is the owner’s email address (use “public” for public folders). If the lock file already exists, something is currently operating on the IMAP.MRK so you should wait until it is unlocked before you lock it and continue.

Hope this helps someone.

messages.idx file format

WorldClient maintains a file called “messages.idx” in the $MAILDIR$\WC\ directory which contains the information WorldClient needs to generate the indexes. This is done for performance reasons, with the goal being that WorldClient only needs to read each MSG file once.

The messages.idx file works in conjunction with the IMAP.MRK file, which contains IMAP flags such as (UNREAD, REPLIED, DELETED), whereas flags like “New” and “Forwarded” aren’t known to IMAP, but were implemented in WorldClient, and so are stored in WorldClient’s own index.

Although messages.idx is self-maintaining (meaning that WorldClient automatically adds and deletes entries without user intervention), if deleted, messages.idx will be recreated as WorldClient needs it, with an obvious performance hit as MSG files are parsed.

You may want to delete messages.idx to force a rebuild if, for example, you change whether WorldClient uses the “Sent” or “Received” dates and want to update messages already received with the new dates

It is a text file with one message record per line, with the fields delimited by a \001 character. There are 8 fields in the 5.x/6.0 format:

Folder name
IMAP UID Validity
IMAP UID
To
From
Subject
Date (time_t value)
WorldClient flags (bitmask)

The WorldClient flags bitmask values are

1=New
2=Forwarded
4=High Priority
8=Has attachments
16=Needs read confirmation