DelayedEnvelope.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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\Mailer;
  11. use Symfony\Component\Mailer\Exception\LogicException;
  12. use Symfony\Component\Mime\Address;
  13. use Symfony\Component\Mime\Header\Headers;
  14. use Symfony\Component\Mime\Message;
  15. /**
  16. * @author Fabien Potencier <fabien@symfony.com>
  17. *
  18. * @internal
  19. */
  20. final class DelayedEnvelope extends Envelope
  21. {
  22. private bool $senderSet = false;
  23. private bool $recipientsSet = false;
  24. public function __construct(
  25. private Message $message,
  26. ) {
  27. }
  28. public function setSender(Address $sender): void
  29. {
  30. parent::setSender($sender);
  31. $this->senderSet = true;
  32. }
  33. public function getSender(): Address
  34. {
  35. if (!$this->senderSet) {
  36. parent::setSender(self::getSenderFromHeaders($this->message->getHeaders()));
  37. }
  38. return parent::getSender();
  39. }
  40. public function setRecipients(array $recipients): void
  41. {
  42. parent::setRecipients($recipients);
  43. $this->recipientsSet = (bool) parent::getRecipients();
  44. }
  45. /**
  46. * @return Address[]
  47. */
  48. public function getRecipients(): array
  49. {
  50. if ($this->recipientsSet) {
  51. return parent::getRecipients();
  52. }
  53. return self::getRecipientsFromHeaders($this->message->getHeaders());
  54. }
  55. private static function getRecipientsFromHeaders(Headers $headers): array
  56. {
  57. $recipients = [];
  58. foreach (['to', 'cc', 'bcc'] as $name) {
  59. foreach ($headers->all($name) as $header) {
  60. foreach ($header->getAddresses() as $address) {
  61. $recipients[] = $address;
  62. }
  63. }
  64. }
  65. return $recipients;
  66. }
  67. private static function getSenderFromHeaders(Headers $headers): Address
  68. {
  69. if ($sender = $headers->get('Sender')) {
  70. return $sender->getAddress();
  71. }
  72. if ($return = $headers->get('Return-Path')) {
  73. return $return->getAddress();
  74. }
  75. if ($from = $headers->get('From')) {
  76. return $from->getAddresses()[0];
  77. }
  78. throw new LogicException('Unable to determine the sender of the message.');
  79. }
  80. }