When generating mailing labels, CiviCRM users have the option of choosing the address to be used (e.g. you can select "Primary," "Home" or "Work") depending on where you want to reach your contacts.
CiviMail, however, does not provide this option. Instead, CiviMail automatically chooses the address for each contact - a process we can only control on a contact-by-contact basis by setting the "Bulk Mail" or "Primary" flags for each individual contact.
For many of us, the ability to only send to home or work email addresses has not been important because email addresses transcend location: we check our work email at home and our home email at work and have all made individual choices about which ones we are going to use regularly and which ones we selectively check.
However, there are use cases when choosing the right location is critical. At the Progressive Technology Project (PTP), one such use case arose in our work with the Vermont State Employees Association (VSEA). As a union, they have very strict rules about what kind of communication they can send to a worker's official work address and what kind of communication really needs to go the home address.
The inability to control this communication made it impossible to use CiviMail, despite having transferred every other aspect of their database to PowerBase (PTP's implementation of CiviCRM).
In response, PTP began investigating how to provide this functionality. Our first effort went into design an extension. We developed and rejected various designs:
At this point, we began investigating the core code more closely and realized that we could make the change in core with only minimal modifications to the code.
And thus this feature was born: https://issues.civicrm.org/jira/browse/CRM-15361
It's been assigned to a CiviCRM version far far into the future (4.7), however, we're currently using it with 4.4 and it should apply relatively easily to any version in between.
If people have suggestions on how to implement this feature in a better way, please let us know. And if you'd like to see this feature go into an earlier version of CiviCRM, please comment on the ticket.