Workaround for: Message rejected due to DMARC policy for yahoo.com
You are correct in your update that:


This is a Drupal problem, in that the script must change how it sends emails.
What Drupal uses in the "from" field should actually be in the "reply-to" field.
This can be fixed using a hook. (Specifically, hook_mail_alter().)


If you don't want to write any code, I suggest you use the Contact Reply To module by rfay.

Alternatively, I wrote a more general-use module that I described here.

I use my solution on all of my sites and have not had any trouble yet.

Some of the other suggestions are incorrect, in that hook_mail() does not catch every email, and therefore is not appropriate, and you cannot use some of the other smtp solutions, because the "from" email address is not consistent (ie., it is provided by site visitors).