Code:
if player:HasItem(itemid) == true then
Unit:GossipCreateMenu(100, player, 0)
Unit:GossipMenuAddItem(0, "?", 1, 0)
Unit:GossipSendMenu(player)
else
player:SendBroadcastMessage("You do not have the donation key")
end
That would take care of the item requirement problem.
If you use Gua Engine you could probably use the Execute or Query command to insert mail into the appropriate table, while removing the selected item from the player. This would probably require using a codebox.
Another thing you could look into is using Bind on Account items in some way or another(I'm not sure if there working though)