Changeset View
Changeset View
Standalone View
Standalone View
src/applications/metamta/util/PhabricatorMailUtil.php
- This file was added.
| <?php | |||||
| final class PhabricatorMailUtil | |||||
| extends Phobject { | |||||
| /** | |||||
| * Normalize an email address for comparison or lookup. | |||||
| * | |||||
| * Phabricator can be configured to prepend a prefix to all reply addresses, | |||||
| * which can make forwarding rules easier to write. This method strips the | |||||
| * prefix if it is present, and normalizes casing and whitespace. | |||||
| * | |||||
| * @param PhutilEmailAddress Email address. | |||||
| * @return PhutilEmailAddress Normalized address. | |||||
| */ | |||||
| public static function normalizeAddress(PhutilEmailAddress $address) { | |||||
| $raw_address = $address->getAddress(); | |||||
| $raw_address = phutil_utf8_strtolower($raw_address); | |||||
| $raw_address = trim($raw_address); | |||||
| // If a mailbox prefix is configured and present, strip it off. | |||||
| $prefix_key = 'metamta.single-reply-handler-prefix'; | |||||
| $prefix = PhabricatorEnv::getEnvConfig($prefix_key); | |||||
| $len = strlen($prefix); | |||||
| if ($len) { | |||||
| $prefix = $prefix.'+'; | |||||
| $len = $len + 1; | |||||
| if (!strncasecmp($raw_address, $prefix, $len)) { | |||||
| $raw_address = substr($raw_address, $len); | |||||
| } | |||||
| } | |||||
| return id(clone $address) | |||||
| ->setAddress($raw_address); | |||||
| } | |||||
| /** | |||||
| * Determine if two inbound email addresses are effectively identical. | |||||
| * | |||||
| * This method strips and normalizes addresses so that equivalent variations | |||||
| * are correctly detected as identical. For example, these addresses are all | |||||
| * considered to match one another: | |||||
| * | |||||
| * "Abraham Lincoln" <alincoln@example.com> | |||||
| * alincoln@example.com | |||||
| * <ALincoln@example.com> | |||||
| * "Abraham" <phabricator+ALINCOLN@EXAMPLE.COM> # With configured prefix. | |||||
| * | |||||
| * @param PhutilEmailAddress Email address. | |||||
| * @param PhutilEmailAddress Another email address. | |||||
| * @return bool True if addresses are effectively the same address. | |||||
| */ | |||||
| public static function matchAddresses( | |||||
| PhutilEmailAddress $u, | |||||
| PhutilEmailAddress $v) { | |||||
| $u = self::normalizeAddress($u); | |||||
| $v = self::normalizeAddress($v); | |||||
| return ($u->getAddress() === $v->getAddress()); | |||||
| } | |||||
| } | |||||