{"record":{"id":"894658a79fba9f24","repo":"phacility/phabricator","slug":"err-unknown-sender-894658","errorCode":"err:unknown-sender","errorMessage":"This email was sent from an email address (\"%s\") that is not associated with a registered user account. To interact via email, add this address to your account.","messagePattern":"This email was sent from an email address \\(\"(.+?)\"\\) that is not associated with a registered user account\\. To interact via email, add this address to your account\\.","errorType":"exception","errorClass":"PhabricatorMetaMTAReceivedMailProcessingException","httpStatus":null,"severity":"warning","filePath":"src/applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php","lineNumber":262,"sourceCode":"          // However, if the recipient list included a reserved recipient, we\n          // don't bounce the mail with an error.\n\n          // The intent here is that if a user does a \"Reply All\" and includes\n          // \"From: noreply@phabricator\" in the receipient list, we just want\n          // to drop the mail rather than send them an unhelpful bounce message.\n\n          throw new PhabricatorMetaMTAReceivedMailProcessingException(\n            MetaMTAReceivedMailStatus::STATUS_RESERVED,\n            pht(\n              'No application handled this mail. This mail was sent to a '.\n              'reserved recipient (\"%s\") so bounces are suppressed.',\n              (string)$reserved_recipient));\n        } else if (!$sender) {\n          // NOTE: Currently, we'll always drop this mail (since it's headed to\n          // an unverified recipient). See T12237. These details are still\n          // useful because they'll appear in the mail logs and Mail web UI.\n\n          throw new PhabricatorMetaMTAReceivedMailProcessingException(\n            MetaMTAReceivedMailStatus::STATUS_UNKNOWN_SENDER,\n            pht(\n              'This email was sent from an email address (\"%s\") that is not '.\n              'associated with a registered user account. To interact via '.\n              'email, add this address to your account.',\n              (string)$this->newFromAddress()));\n        } else {\n          throw new PhabricatorMetaMTAReceivedMailProcessingException(\n            MetaMTAReceivedMailStatus::STATUS_NO_RECEIVERS,\n            pht(\n              'This mail can not be processed because no application '.\n              'knows how to handle it. Check that the address you sent it to '.\n              'is correct.'));\n        }\n      }\n    } catch (PhabricatorMetaMTAReceivedMailProcessingException $ex) {\n      switch ($ex->getStatusCode()) {\n        case MetaMTAReceivedMailStatus::STATUS_DUPLICATE:","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php#L244-L280","documentation":"Thrown from PhabricatorMetaMTAReceivedMail when no application accepted the mail and the From address cannot be resolved to any Phabricator account (the $sender lookup produced null). Phabricator only processes inbound mail from known, registered users; the status STATUS_UNKNOWN_SENDER is recorded and (per the T12237 note) the mail is effectively dropped rather than bounced to an unverified external address.","triggerScenarios":"executeSend finishes receiver processing with $any_accepted false; the earlier sender determination (matching newFromAddress() against PhabricatorUserEmail records) found no user, so $sender is null. Concrete: mailing from an address that is not attached to any account, attached but unverified/disabled secondary email, or a typo'd From.","commonSituations":"Developer replies from a personal mailbox that is not their account email; user changed jobs/mailboxes and the new address was never added; address exists on the account but never verified; third-party systems (Jira, form mailers) sending to a Phabricator application address.","solutions":["Add and verify the sending address to your Phabricator account (Settings > Email Addresses), then resend the mail.","If you intended to act as another user, send from that user's registered address instead — Phabricator will not impersonate.","Admins: check MetaMTA > Received Mail for the STATUS_UNKNOWN_SENDER row to confirm which From address failed, then guide that user.","For automation, create a real (bot) account with its own verified address and send from that."],"exampleFix":"// before: From: personal-mailbox@example.com (not on any account)\n// -> sender lookup null -> err:unknown-sender\n\n// after: verify the address on the account, then:\n// From: dev@example.com (verified on account 'alincoln') -> sender resolves","handlingStrategy":"validation","validationCode":"// Pre-flight the From address against registered, verified account emails:\n$email = id(new PhabricatorUserEmail())->loadOneWhere(\n  'address = %s AND isVerified = 1 AND status = %s',\n  $from_address,\n  PhabricatorUserEmail::STATUS_VERIFIED);\nif (!$email) {\n  // unknown sender: add/verify this address on an account before sending\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register and verify every mailbox you will reply from under Settings > Email Addresses before relying on email workflows.","Give automation its own bot account with a dedicated verified address.","Monitor STATUS_UNKNOWN_SENDER in received-mail logs to catch drift when users change mailboxes."],"tags":["metamta","email","sender-resolution","account-email","inbound-mail"],"backgroundTag":"unrecognized-mail-sender","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}