Issue #3607367: Notify account-less recipients via a Recipient value object and Email audiences
Follow-up to #3607272 (split out per the squash-merge).
Notifications resolved to Drupal accounts only, so a workflow could never reach an external party without a local user. This adds a Recipient value object so an assignment resolves either an account or an account-less contact, plus two notification-only Email audiences.
Recipient(abstract) +AccountRecipient(wraps an account, reads its mail/langcode/contact fields) +ContactRecipient(account-less address).recipients()returnsRecipient[]keyed by a stable key (u:<uid>/c:<channel>:<value>) so duplicates dedupe.- Account-based assignments wrap accounts via the shared
AssignmentBase::accountsToRecipients()helper (no duplicated recipient shape). - New
Email/Email by variableaudiences resolve fixed or variable-held addresses toContactRecipient; they mint no candidates, so aNotificationOnlyAssignmentInterfacemarker hides them from the task assignment editor while keeping them available as a notification audience (Notify node). - Event, mail channel and To/Cc/Bcc dispositions all key by recipient key and read the address via
contact(\"mail\"). - Config schema for the two Email plugins.
A follow-up (#3607392) will replace the interim marker with an AudienceInterface / AssignmentInterface split.