Path: blob/master/src/applications/metamta/adapter/PhabricatorMailAdapter.php
12256 views
<?php12abstract class PhabricatorMailAdapter3extends Phobject {45private $key;6private $priority;7private $media;8private $options = array();910private $supportsInbound = true;11private $supportsOutbound = true;12private $mediaMap;1314final public function getAdapterType() {15return $this->getPhobjectClassConstant('ADAPTERTYPE');16}1718final public static function getAllAdapters() {19return id(new PhutilClassMapQuery())20->setAncestorClass(__CLASS__)21->setUniqueMethod('getAdapterType')22->execute();23}2425abstract public function getSupportedMessageTypes();26abstract public function sendMessage(PhabricatorMailExternalMessage $message);2728/**29* Return true if this adapter supports setting a "Message-ID" when sending30* email.31*32* This is an ugly implementation detail because mail threading is a horrible33* mess, implemented differently by every client in existence.34*/35public function supportsMessageIDHeader() {36return false;37}3839final public function supportsMessageType($message_type) {40if ($this->mediaMap === null) {41$media_map = $this->getSupportedMessageTypes();42$media_map = array_fuse($media_map);4344if ($this->media) {45$config_map = $this->media;46$config_map = array_fuse($config_map);4748$media_map = array_intersect_key($media_map, $config_map);49}5051$this->mediaMap = $media_map;52}5354return isset($this->mediaMap[$message_type]);55}5657final public function setMedia(array $media) {58$native_map = $this->getSupportedMessageTypes();59$native_map = array_fuse($native_map);6061foreach ($media as $medium) {62if (!isset($native_map[$medium])) {63throw new Exception(64pht(65'Adapter ("%s") is configured for medium "%s", but this is not '.66'a supported delivery medium. Supported media are: %s.',67get_class($this),68$medium,69implode(', ', $native_map)));70}71}7273$this->media = $media;74$this->mediaMap = null;75return $this;76}7778final public function getMedia() {79return $this->media;80}8182final public function setKey($key) {83$this->key = $key;84return $this;85}8687final public function getKey() {88return $this->key;89}9091final public function setPriority($priority) {92$this->priority = $priority;93return $this;94}9596final public function getPriority() {97return $this->priority;98}99100final public function setSupportsInbound($supports_inbound) {101$this->supportsInbound = $supports_inbound;102return $this;103}104105final public function getSupportsInbound() {106return $this->supportsInbound;107}108109final public function setSupportsOutbound($supports_outbound) {110$this->supportsOutbound = $supports_outbound;111return $this;112}113114final public function getSupportsOutbound() {115return $this->supportsOutbound;116}117118final public function getOption($key) {119if (!array_key_exists($key, $this->options)) {120throw new Exception(121pht(122'Mailer ("%s") is attempting to access unknown option ("%s").',123get_class($this),124$key));125}126127return $this->options[$key];128}129130final public function setOptions(array $options) {131$this->validateOptions($options);132$this->options = $options;133return $this;134}135136abstract protected function validateOptions(array $options);137138abstract public function newDefaultOptions();139140final protected function guessIfHostSupportsMessageID($config, $host) {141// See T13265. Mailers like "SMTP" and "sendmail" usually allow us to142// set the "Message-ID" header to a value we choose, but we may not be143// able to if the mailer is being used as API glue and the outbound144// pathway ends up routing to a service with an SMTP API that selects145// its own "Message-ID" header, like Amazon SES.146147// If users configured a behavior explicitly, use that behavior.148if ($config !== null) {149return $config;150}151152// If the server we're connecting to is part of a service that we know153// does not support "Message-ID", guess that we don't support "Message-ID".154if ($host !== null) {155$host_blocklist = array(156'/\.amazonaws\.com\z/',157'/\.postmarkapp\.com\z/',158'/\.sendgrid\.net\z/',159);160161$host = phutil_utf8_strtolower($host);162foreach ($host_blocklist as $regexp) {163if (preg_match($regexp, $host)) {164return false;165}166}167}168169return true;170}171172173}174175176