HomePhabricator

Build separate mail for each recipient, honoring recipient access levels

Description

Build separate mail for each recipient, honoring recipient access levels

Summary:
Ref T6367. Removes multiplexMail()!

We can't pass a single body into a function which splits it anymore: we need to split recipients first, then build bodies for each recipient list. This lets us build separate bodies for each recipient's individual translation/access levels.

The new logic does this:

  • First, split recipients into groups called "targets".
    • Each target corresponds to one actual mail we're going to build.
    • Each target has a viewer (whose translation / access levels will be used to generate the mail).
    • Each target has a to/cc list (the users who we'll ultimately send the mail to).
  • For each target, build a custom mail body based on the viewer's access levels and settings (language prefs not actually implemented).
  • Then, deliver the mail.

Test Plan:

  • Read new config help.

Then did a bunch of testing, primarily with bin/mail list-outbound and bin/mail show-outbound (to review generated mail), bin/phd debug taskmaster (to run daemons freely) and bin/worker execute --id <id> (to repeatedly test a specific piece of code after identifying an issue).

With one-mail-per-recipient on (default):

  • Sent mail to multiple users.
  • Verified mail showed up in mail list-outbound.
  • Examined mail with mail show-outbound.
  • Added a project that a subscriber could not see.
    • Verified it was not present in X-Phabricator-Projects.
    • Verified it was rendered as "Restricted Project" for the non-permissioned viewer.
  • Added a subscriber, then changed the object policy so they could not see it and sent mail.
    • Verified I received mail but the other user did not.
  • Enabled public replies and verified mail generated with public addresses.
  • Disabld public replies and verified mail generated with private addresses.

With one-mail-per-recipient off:

  • Verified that one mail is sent to all recipients.
  • Verified users who can not see the object are still filtered.
  • Verified that partially-visible projects are completely visible in the mail (this violates policies, as documented, as the best available compromise).
  • Enabled public replies and verified the mail generated with "Reply To".

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: carlsverre, epriestley

Maniphest Tasks: T6367

Differential Revision: https://secure.phabricator.com/D13131