Goal: Convert one or more mailboxes from an offline/unmounted Exchange EDB file to one or more PST files.
| Challenge | Solution | |-----------|----------| | EDB format proprietary | Use existing open-source parsers (ESE – Extensible Storage Engine is documented, but mailbox layout is Exchange-specific) | | Large attachments | Stream directly from EDB to PST without loading into RAM | | Deleted/dangling items | Recover only logically deleted items if flagged (option) | | Corrupted pages | Implement retry logic, skip damaged pages | | Password-protected EDB | Not common; if encrypted, require key | | Public folders | Treat as separate “mailbox” container | | Performance | Use multi-threading per mailbox, async I/O | 6. Library/Tool Options Instead of building from scratch, consider integrating:
| Option | Description | |--------|-------------| | | High-level API to load EDB and export to PST (commercial) | | LibEDB + LibPST | Open source C/C++ libraries; wrap via P/Invoke or C++/CLI | | Exchange Server MAPI | Requires mounted database and MAPI session | | Veeam or similar extractor | Not for embedding | | Managed ESE (Microsoft.Isam.Esent.Interop) | Gives low-level EDB access but not mailbox structure; you must reconstruct MAPI schema |
public void ConvertEdbToPst(string edbPath, string targetPstPath, string mailboxName) using (EdbDatabase db = EdbDatabase.OpenReadOnly(edbPath)) Mailbox mailbox = db.GetMailbox(mailboxName); using (PstDocument pst = new PstDocument(targetPstPath)) pst.CreateFile(PstFileVersion.Outlook2007); var rootFolder = pst.RootFolder.AddSubFolder(mailbox.Name); foreach (Folder folder in mailbox.GetAllFolders()) var pstFolder = rootFolder.AddSubFolder(folder.DisplayName); foreach (Message msg in folder.GetMessages()) var pstMsg = pstFolder.AddMessage(); pstMsg.Subject = msg.Subject; pstMsg.Body = msg.Body; pstMsg.SentOn = msg.DeliveryTime; pstMsg.SenderEmail = msg.From; pstMsg.Save();