Great article I found after searching for long time in Internet about impersonation and cross database accessing.
I got one simple solution perticularly for database mail.
Simply give execute permission on the sp "sp_send_dbmail" to the role "public" in the database "msdb".
Any call to this sp from other database/sp/function/.. with impersination (or without impersination I hope) will be take care.
You can get rid of the most annoying error "The EXECUTE permission was denied on the object 'sp_send_dbmail', database 'msdb', schema 'dbo'"