COUNT(*) counts rows. COUNT(email) counts only rows with a populated email, while COUNT(DISTINCT email) counts different populated values. These numbers answer different questions. A report called contactable customers needs a definition of contactable before it needs a percentage.
NULL comparisons don't produce true or false in the usual way. Use IS NULL or IS NOT NULL to test for missing values. After a LEFT JOIN, count a key from the matched table when you want matches, because COUNT(*) also counts the preserved unmatched row. When dividing, decide how a zero denominator should appear. DIV0 returns zero for division by zero; NULLIF can leave the rate unknown instead.