Path: blob/master/src/applications/metamta/controller/PhabricatorMetaMTAPostmarkReceiveController.php
12262 views
<?php12final class PhabricatorMetaMTAPostmarkReceiveController3extends PhabricatorMetaMTAController {45public function shouldRequireLogin() {6return false;7}89/**10* @phutil-external-symbol class PhabricatorStartup11*/12public function handleRequest(AphrontRequest $request) {13// Don't process requests if we don't have a configured Postmark adapter.14$mailers = PhabricatorMetaMTAMail::newMailers(15array(16'inbound' => true,17'types' => array(18PhabricatorMailPostmarkAdapter::ADAPTERTYPE,19),20));21if (!$mailers) {22return new Aphront404Response();23}2425$remote_address = $request->getRemoteAddress();26$any_remote_match = false;27foreach ($mailers as $mailer) {28$inbound_addresses = $mailer->getOption('inbound-addresses');29$cidr_list = PhutilCIDRList::newList($inbound_addresses);30if ($cidr_list->containsAddress($remote_address)) {31$any_remote_match = true;32break;33}34}3536if (!$any_remote_match) {37return new Aphront400Response();38}3940$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();41$raw_input = PhabricatorStartup::getRawInput();4243try {44$data = phutil_json_decode($raw_input);45} catch (Exception $ex) {46return new Aphront400Response();47}4849$raw_headers = array();50$header_items = idx($data, 'Headers', array());51foreach ($header_items as $header_item) {52$name = idx($header_item, 'Name');53$value = idx($header_item, 'Value');54$raw_headers[$name] = $value;55}5657$headers = array(58'to' => idx($data, 'To'),59'from' => idx($data, 'From'),60'cc' => idx($data, 'Cc'),61'subject' => idx($data, 'Subject'),62) + $raw_headers;636465$received = id(new PhabricatorMetaMTAReceivedMail())66->setHeaders($headers)67->setBodies(68array(69'text' => idx($data, 'TextBody'),70'html' => idx($data, 'HtmlBody'),71));7273$file_phids = array();74$attachments = idx($data, 'Attachments', array());75foreach ($attachments as $attachment) {76$file_data = idx($attachment, 'Content');77$file_data = base64_decode($file_data);7879try {80$file = PhabricatorFile::newFromFileData(81$file_data,82array(83'name' => idx($attachment, 'Name'),84'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,85));86$file_phids[] = $file->getPHID();87} catch (Exception $ex) {88phlog($ex);89}90}91$received->setAttachments($file_phids);9293try {94$received->save();95$received->processReceivedMail();96} catch (Exception $ex) {97phlog($ex);98}99100return id(new AphrontWebpageResponse())101->setContent(pht("Got it! Thanks, Postmark!\n"));102}103104}105106107