A quick and dirty method I've used is to add a fixed length ascii field before each message. The field contains the message length in bytes. Then concat the messages with length field into a single file. To traverse, use read to get the message length, then read to grab the entire message or seek to the next one. The format is fairly trivial to code as long as your file will be used readonly. Note that it may not be portable to a different OS.
1148
Return-Path: <user@foo.com>
Received: from someone@wherever.com
To: me@email.com
Subject: file format
Date: Tue, 14 Jul 2009 16:00:18 -0400
email message body bla bla bla
etc ...
etc ...
etc ...
729
Return-Path: <user@foo.com>
Received: ...
Date: Tue, 14 Jul 2009 16:00:18 -0400
another email bla bla bla
etc ...