vendor/symfony/mime/Address.php line 25

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Mime;
  11. use Egulias\EmailValidator\EmailValidator;
  12. use Egulias\EmailValidator\Validation\MessageIDValidation;
  13. use Egulias\EmailValidator\Validation\RFCValidation;
  14. use Symfony\Component\Mime\Encoder\IdnAddressEncoder;
  15. use Symfony\Component\Mime\Exception\InvalidArgumentException;
  16. use Symfony\Component\Mime\Exception\LogicException;
  17. use Symfony\Component\Mime\Exception\RfcComplianceException;
  18. /**
  19.  * @author Fabien Potencier <fabien@symfony.com>
  20.  */
  21. final class Address
  22. {
  23.     /**
  24.      * A regex that matches a structure like 'Name <email@address.com>'.
  25.      * It matches anything between the first < and last > as email address.
  26.      * This allows to use a single string to construct an Address, which can be convenient to use in
  27.      * config, and allows to have more readable config.
  28.      * This does not try to cover all edge cases for address.
  29.      */
  30.     private const FROM_STRING_PATTERN '~(?<displayName>[^<]*)<(?<addrSpec>.*)>[^>]*~';
  31.     private static EmailValidator $validator;
  32.     private static IdnAddressEncoder $encoder;
  33.     private string $address;
  34.     private string $name;
  35.     public function __construct(string $addressstring $name '')
  36.     {
  37.         if (!class_exists(EmailValidator::class)) {
  38.             throw new LogicException(sprintf('The "%s" class cannot be used as it needs "%s"; try running "composer require egulias/email-validator".'__CLASS__EmailValidator::class));
  39.         }
  40.         self::$validator ??= new EmailValidator();
  41.         $this->address trim($address);
  42.         $this->name trim(str_replace(["\n""\r"], ''$name));
  43.         if (!self::$validator->isValid($this->addressclass_exists(MessageIDValidation::class) ? new MessageIDValidation() : new RFCValidation())) {
  44.             throw new RfcComplianceException(sprintf('Email "%s" does not comply with addr-spec of RFC 2822.'$address));
  45.         }
  46.     }
  47.     public function getAddress(): string
  48.     {
  49.         return $this->address;
  50.     }
  51.     public function getName(): string
  52.     {
  53.         return $this->name;
  54.     }
  55.     public function getEncodedAddress(): string
  56.     {
  57.         self::$encoder ??= new IdnAddressEncoder();
  58.         return self::$encoder->encodeString($this->address);
  59.     }
  60.     public function toString(): string
  61.     {
  62.         return ($n $this->getEncodedName()) ? $n.' <'.$this->getEncodedAddress().'>' $this->getEncodedAddress();
  63.     }
  64.     public function getEncodedName(): string
  65.     {
  66.         if ('' === $this->getName()) {
  67.             return '';
  68.         }
  69.         return sprintf('"%s"'preg_replace('/"/u''\"'$this->getName()));
  70.     }
  71.     public static function create(self|string $address): self
  72.     {
  73.         if ($address instanceof self) {
  74.             return $address;
  75.         }
  76.         if (!str_contains($address'<')) {
  77.             return new self($address);
  78.         }
  79.         if (!preg_match(self::FROM_STRING_PATTERN$address$matches)) {
  80.             throw new InvalidArgumentException(sprintf('Could not parse "%s" to a "%s" instance.'$addressself::class));
  81.         }
  82.         return new self($matches['addrSpec'], trim($matches['displayName'], ' \'"'));
  83.     }
  84.     /**
  85.      * @param array<Address|string> $addresses
  86.      *
  87.      * @return Address[]
  88.      */
  89.     public static function createArray(array $addresses): array
  90.     {
  91.         $addrs = [];
  92.         foreach ($addresses as $address) {
  93.             $addrs[] = self::create($address);
  94.         }
  95.         return $addrs;
  96.     }
  97. }