Path: blob/master/src/applications/metamta/util/PhabricatorMailUtil.php
12256 views
<?php12final class PhabricatorMailUtil3extends Phobject {45/**6* Normalize an email address for comparison or lookup.7*8* Phabricator can be configured to prepend a prefix to all reply addresses,9* which can make forwarding rules easier to write. This method strips the10* prefix if it is present, and normalizes casing and whitespace.11*12* @param PhutilEmailAddress Email address.13* @return PhutilEmailAddress Normalized address.14*/15public static function normalizeAddress(PhutilEmailAddress $address) {16$raw_address = $address->getAddress();17$raw_address = phutil_utf8_strtolower($raw_address);18$raw_address = trim($raw_address);1920// If a mailbox prefix is configured and present, strip it off.21$prefix_key = 'metamta.single-reply-handler-prefix';22$prefix = PhabricatorEnv::getEnvConfig($prefix_key);2324if (phutil_nonempty_string($prefix)) {25$prefix = $prefix.'+';26$len = strlen($prefix);2728if (!strncasecmp($raw_address, $prefix, $len)) {29$raw_address = substr($raw_address, $len);30}31}3233return id(clone $address)34->setAddress($raw_address);35}3637/**38* Determine if two inbound email addresses are effectively identical.39*40* This method strips and normalizes addresses so that equivalent variations41* are correctly detected as identical. For example, these addresses are all42* considered to match one another:43*44* "Abraham Lincoln" <[email protected]>45* [email protected]46* <[email protected]>47* "Abraham" <[email protected]> # With configured prefix.48*49* @param PhutilEmailAddress Email address.50* @param PhutilEmailAddress Another email address.51* @return bool True if addresses are effectively the same address.52*/53public static function matchAddresses(54PhutilEmailAddress $u,55PhutilEmailAddress $v) {5657$u = self::normalizeAddress($u);58$v = self::normalizeAddress($v);5960return ($u->getAddress() === $v->getAddress());61}6263public static function isReservedAddress(PhutilEmailAddress $address) {64$address = self::normalizeAddress($address);65$local = $address->getLocalPart();6667$reserved = array(68'admin',69'administrator',70'hostmaster',71'list',72'list-request',73'majordomo',74'postmaster',75'root',76'ssl-admin',77'ssladmin',78'ssladministrator',79'sslwebmaster',80'sysadmin',81'uucp',82'webmaster',8384'noreply',85'no-reply',86);8788$reserved = array_fuse($reserved);8990if (isset($reserved[$local])) {91return true;92}9394$default_address = id(new PhabricatorMailEmailEngine())95->newDefaultEmailAddress();96if (self::matchAddresses($address, $default_address)) {97return true;98}99100$void_address = id(new PhabricatorMailEmailEngine())101->newVoidEmailAddress();102if (self::matchAddresses($address, $void_address)) {103return true;104}105106return false;107}108109public static function isUserAddress(PhutilEmailAddress $address) {110$user_email = id(new PhabricatorUserEmail())->loadOneWhere(111'address = %s',112$address->getAddress());113114return (bool)$user_email;115}116117}118119120