Al momento non ho tempo per scriverti il codice ma ti illustro brevemente come può funzionare una cosa del genere.
Ti serve una tabella per i messaggi che contenga l'ID del messaggio, l'oggetto, il testo, ID del mandante ed ID del ricevente e la cartella dove viene salvato (inbox/outbox), oltre ad un campo che può essere 0 o 1 e che servirà per capire se il messaggio è stato letto oppure no.
Quando A compone un messaggio verso B, oltre ad effettuare tutti i dovuti controlli, salvi il messaggio nell'inbox di A e nell'outbox di B. Nel primo caso il campo che determina se un messaggio è stato letto avrà valore 0, nel secondo valore 1 (A conosce il messaggio che ha mandato!). Inoltre invii una e-mail a B con tutti i dati relativi al messaggio.
Quando B legge il messaggio di A, imposti la variabile che determina se il messaggio è stato letto oppure no ad 1.
Per la risposta userai lo stesso principio dell'invio.
Probabilmente ti starai chiedendo perché c'è un campo che determina se un messaggio deve finire in inbox o in outbox, senza fare direttamente una cartella per tutti e poi capire dinamicamente se vanno visualizzati in posta ricevuta o posta inviata. Te lo spiego subito: tempo fa ho fatto un sistema di MP per un mio CMS senza quel campo, e mi sono reso conto che quando cancellavo un messaggio dall'outbox di A spariva anche nell'inbox di B, perché lo cancellavo dal database! In questa maniera invece A elimina solo la copia del messaggio nel suo outbox e B continua a tenersi la sua.
Questa è un'idea abbastanza astratta su come potresti fare la cosa, che poi immagino sia il sistema usato anche dai CMS famosi. Ovviamente si può migliorare moltissimo, ad esempio aggiungendo anche un'altra cartella (il cestino) e tutte quelle boiate che non servono a niente ma che fanno sembrare il portale tremendamente figo
