I had a similar issue with designing a messaging system in my app -- both the sender and recipient are guaranteed to be either real users or virtual users (the system, etc). It solved a lot of problems to have each message inserted into the table twice -- once for the sender, once for the recipient.
What this lets you do:
* Have a consistent interface towards showing/hiding/deleting/etc emails without caring whether they're to you or from you.
* Saves from having to do additional code writing to allow the sender to delete the mail without borking it for the recipient. Instead of having two separate status columns and some logic to say
if (user == mail.sender)
mail.sender_status = "DELETED"
mail.recipient_status = "DELETED"
(and then write cleanup code if both people delete the message to actually remove it from the system), you get to just fire off mail.delete.
* Not really a factor for my application, but one ID per table row plus an index means find_all_mail_by_user_id executes *fast*.