"Sender" and "recipient" are workable synonyms. In fact they may be more clearly associated with the mail operations, while "to" and "from" have meanings in a broader range of contexts.
Namespaces are another solution. As is implicitly building a namespace into the name, as in "mailFrom" and "mailTo".
Embed the data in a larger structure (it would be a map in Clojure, or a struct in C or a class in Java). This is really a variation on the namespace idea, but it might also let you think about a more functional approach with the data externalized into a structure with carefully controlled state change (i.e. put your Clojure map in an atom, or return a new version from a pure function).
Any solution has more typing involved than just "to" and "from", but that could be okay as it sounds like the scope of these variables is not small. Your language is already telling you that these names are too readily overloaded.
Cheers,
Phil