Outlook Express (OE) Reader Class

Introduction

This article presents a Outlook Express (IE4) class reader that can
read through your OE files and retrieve such things as
folder names, message subjects and message bodies.

Copyright Notice

Copyright (C) 2000 Mladen Bonev
The author does not take any responsability of ANY damages caused of using this source!

Acknowledgements

Based on initial work by Tom Gallagher. Please
refer to the
More Detail Documentation Notes section
below in order to view
Mr. Gallagher’s documentation.

COE4Reader Class

Here’s a partial definition for the (COE4Reader) class.

class COE4Reader //Outlook Express 4 Reader Class
{
public:
  COE4Reader();
  ~COE4Reader();

 BOOL OpenFile(LPCSTR szFileName);
 void Close();

 inline const BOOL IsOpen() { return m_bOpened; }
 inline const BOOL IsClosed() { return m_bClosed; }
 inline const LPMAILBOX GetMailbox() { return m_pMailbox; }
 inline BOOL GetMailbox(LPMAILBOX lpMailbox);
 inline const int GetMessageCount() { return m_pMailbox->IdxHdr.nItems; }
 const LPMAILMSG GetMessageAt(int nIndex);
 BOOL GetMessageAt(int nIndex, LPMAILMSG lpMsg);
};

For more information, please refer to the comments in the attached source.

More Detail Documentation Notes

Because much of my code is based on Tom Gallagher’s previous work and as a
courtesy to him, I am presenting his documentation below “as is”.

Copright (c) 1998 Tom Gallagher (teg@cableinet.co.uk)

Based on initial work by Michael Santovec (michael_santovec@prodigy.net)
and Jeff Evans (evansj@shaw.wave.ca)

** Standard Disclaimers Apply ! **

** Use this information at your own risk etc etc **

Outlook is a trademark of Microsoft (probably) ! 🙂

Outlook File Format Decoder

This is not a very complete program but there should be enough info
here for people to create programs to browse their outlook messages
from other OS’s if required. Could also be used to import outlook
messages into other mail readers.

see outlook.c and outlook.h for detailed information on the file format.

I used RHIDE and DJGPP to build this program under Windows 98.

GCC under Linux was also used for testing.

Comments & improvements welcome

Below is a brief description of the file formats.

Notes:

DWORD is a 32 bit unsigned value
WORD is a 16 bit unsigned value
BYTE is an 8 bit unsigned value

The source assumes a 32 bit natural integer size.

This can be changed in common.h

A lot of the structure members are called pad or flags.
These are values which I am not too sure of their usage.
There is probably a lot of information in these files to do with
message deletion and compaction. I.e. when a message is deleted it
is only flagged (need to find this flag!!) and it is only
truly deleted when the mail box is compacted.

In the file outlook.c there is a macro called DBG

define DBG as follows to look at exactly what the parser is doing:-

#define DBG(s) s

I stole some code from WINE to convert a Win32 FILETIME structure into
a UNIX time_t.

Remember its single byte packing.

IDX File

The IDX file maintains various pointers into the actual message data file
(MBX) and stores some information that has been parsed from the message
data file. This information is stored in the IDX file so that it does
not have to be reparsed every time there fore speeding up access to the
mail folder.

{
 DWORD Magic;    JMF9 (IDX)
 DWORD Version;  A file format version number??
 DWORD nItems;   No. entries in this IDX file (no. msgs in MBX file)
 DWORD nBytes;   No. bytes in the IDX file
 DWORD Unk1;
 DWORD Unk2;
 BYTE  Pad[40];
 BYTE  Pad2[16];

 nItems * {
  DWORD Flags;
  DWORD Unk1;         Always zero ?
  DWORD EntryNum;     Index Number
  DWORD FilePos;      Position from the start of the file to this header
  DWORD nBytes;       Number of bytes in this index entry
  DWORD MBXOffset;    Offset of message data in the mbx file
  DWORD MBXSize;      Total Size of the message + header in MBX file
  BYTE  Pad5[6];
  WORD  Attach;       Flags to do with Attachments ??
  BYTE  Pad1[4];
  WORD  Pad2;
  DWORD MsgSize;      Total data length of message

  Total Number of bytes in the next attachment section in this file
  (nSeparators * sizeof(next structure) + some padding)

  DWORD nAttachBytes;

  BYTE  Pad3[48];

 Number of MIME or (UUENCODE) attachments + 1
 I called it separators to start with because its actually the number of
 boundary markers, but really the initial text in the message with
 attachments counts as an attachment so this could be renamed to the
 number of attachments.

 DWORD nSeparators;

 BYTE  Pad4[12];
 DWORD   Flag1;
 DWORD   Flag2;

 Offset to actual message data (skipping Internet headers)

 DWORD   Offset;
 DWORD   Pad[15];

 nSeparators * {

 The next few fields are offsets into the MBX file.

 To get an absolute file offset :-

 DataStart + MBXOffset + MBX_MSG_HDR_LEN

 Where MBX_MSG_HDR_LEN is 0x10 (a tiny header at the start
 of each mail message in the MBX file).

 DWORD Pad[7];

 Offset to the data for this part of a multi part MIME

 DWORD DataStart;

 Offset to the end of the data (points one char past the end)

 DWORD DataEnd;

 Start of Internet headers for this part of the multi part MIME
 or UUENCODED message for this section only.  (e.g the
 MIME Content type etc or the UUENCODE begin line).

 DWORD HeaderStart;

 I couldn't figure these two out (anyone else?!?)
 Maybe flags and an index value.  Perhaps the MIME type
 encoded in here as a binary value somehow?

 DWORD Pad1;
 DWORD Idx;

 Pointer to the start of the multi part boundary line
 For UUENCODED messges this is the same as header start because
 the start of the headers represents the boundary too.

 DWORD BoundaryOffset;

 These appear to be zero all the time

 DWORD Pad2[10];
}

1 * {
 The length of this structure + the total length of strings
 following this structure.

 DWORD DataSize;

 This DWORD is always zero perhaps its a 64 bit data size ??

 DWORD Pad6;

 Win32 FILETIME structures (size 8 bytes)

 FILETIME Received;
 FILETIME Sent;

 This is the priority as specified in the Internet headers

 WORD  Priority;
}

There is then 7 variable length strings in this order:-

 Subject
 Sender
 POPServer
 Username
 MailAccount
 POP3 Login Name
 Account Description

 7 * {
  WORD Length;
  Length * {
   BYTE Data;
  }
 }
}

MBX File

The MBX file stores the actual message data that comes from the POP3
server.

{
 DWORD Magic;            JMF6
 DWORD Version;          ? 03000101 ?
 DWORD nMsgs;            No. msgs including those marked for deletion
 DWORD LastUsedMsgNum;
 DWORD nBytes;           Size of the MBX file in bytes
 BYTE  Pad[64];

 nMsgs * {
  DWORD Magic;        0x7F007F00
  DWORD Idx;          Index in the MBX file
  DWORD TotalLen;     Total Length taken by this entry
  DWORD MsgLen;       Total length of all message data


  TotalLen * {

   The message data exactly as it comes from the POP3 server

   BYTE Data
  }
 }
}

Downloads

Download demo project – 16 Kb

Download source – 6 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read