1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Mime\Header;
13
14use Symfony\Component\Mime\Address;
15use Symfony\Component\Mime\Exception\RfcComplianceException;
16
17/**
18 * A Mailbox list MIME Header for something like From, To, Cc, and Bcc (one or more named addresses).
19 *
20 * @author Chris Corbyn
21 */
22final class MailboxListHeader extends AbstractHeader
23{
24    private $addresses = [];
25
26    /**
27     * @param Address[] $addresses
28     */
29    public function __construct(string $name, array $addresses)
30    {
31        parent::__construct($name);
32
33        $this->setAddresses($addresses);
34    }
35
36    /**
37     * @param Address[] $body
38     *
39     * @throws RfcComplianceException
40     */
41    public function setBody($body)
42    {
43        $this->setAddresses($body);
44    }
45
46    /**
47     * @throws RfcComplianceException
48     *
49     * @return Address[]
50     */
51    public function getBody(): array
52    {
53        return $this->getAddresses();
54    }
55
56    /**
57     * Sets a list of addresses to be shown in this Header.
58     *
59     * @param Address[] $addresses
60     *
61     * @throws RfcComplianceException
62     */
63    public function setAddresses(array $addresses)
64    {
65        $this->addresses = [];
66        $this->addAddresses($addresses);
67    }
68
69    /**
70     * Sets a list of addresses to be shown in this Header.
71     *
72     * @param Address[] $addresses
73     *
74     * @throws RfcComplianceException
75     */
76    public function addAddresses(array $addresses)
77    {
78        foreach ($addresses as $address) {
79            $this->addAddress($address);
80        }
81    }
82
83    /**
84     * @throws RfcComplianceException
85     */
86    public function addAddress(Address $address)
87    {
88        $this->addresses[] = $address;
89    }
90
91    /**
92     * @return Address[]
93     */
94    public function getAddresses(): array
95    {
96        return $this->addresses;
97    }
98
99    /**
100     * Gets the full mailbox list of this Header as an array of valid RFC 2822 strings.
101     *
102     * @throws RfcComplianceException
103     *
104     * @return string[]
105     */
106    public function getAddressStrings(): array
107    {
108        $strings = [];
109        foreach ($this->addresses as $address) {
110            $str = $address->getEncodedAddress();
111            if ($name = $address->getName()) {
112                $str = $this->createPhrase($this, $name, $this->getCharset(), !$strings).' <'.$str.'>';
113            }
114            $strings[] = $str;
115        }
116
117        return $strings;
118    }
119
120    public function getBodyAsString(): string
121    {
122        return implode(', ', $this->getAddressStrings());
123    }
124
125    /**
126     * Redefine the encoding requirements for addresses.
127     *
128     * All "specials" must be encoded as the full header value will not be quoted
129     *
130     * @see RFC 2822 3.2.1
131     */
132    protected function tokenNeedsEncoding(string $token): bool
133    {
134        return preg_match('/[()<>\[\]:;@\,."]/', $token) || parent::tokenNeedsEncoding($token);
135    }
136}
137