29 $this->headers = $headers ? clone $headers :
new Headers();
35 $this->headers = clone $this->headers;
37 if (
null !== $this->body) {
38 $this->body = clone $this->body;
62 $this->headers = $headers;
69 return $this->headers;
74 $headers = clone $this->headers;
76 if (!$headers->has(
'From')) {
77 if (!$headers->has(
'Sender')) {
78 throw new LogicException(
'An email must have a "From" or a "Sender" header.');
80 $headers->addMailboxListHeader(
'From', [$headers->get(
'Sender')->getAddress()]);
83 $headers->addTextHeader(
'MIME-Version',
'1.0');
85 if (!$headers->has(
'Date')) {
86 $headers->addDateHeader(
'Date',
new \DateTimeImmutable());
90 if (!$headers->has(
'Sender') && \count($froms = $headers->get(
'From')->getAddresses()) > 1) {
91 $headers->addMailboxHeader(
'Sender', $froms[0]);
94 if (!$headers->has(
'Message-ID')) {
99 $headers->remove(
'Bcc');
106 if (
null === $body = $this->
getBody()) {
115 if (
null === $body = $this->
getBody()) {
120 yield from $body->toIterable();
125 if (!$this->headers->has(
'To') && !$this->headers->has(
'Cc') && !$this->headers->has(
'Bcc')) {
126 throw new LogicException(
'An email must have a "To", "Cc", or "Bcc" header.');
129 if (!$this->headers->has(
'From') && !$this->headers->has(
'Sender')) {
130 throw new LogicException(
'An email must have a "From" or a "Sender" header.');
133 parent::ensureValidity();
138 if ($this->headers->has(
'Sender')) {
139 $sender = $this->headers->get(
'Sender')->getAddress();
140 } elseif ($this->headers->has(
'From')) {
141 $sender = $this->headers->get(
'From')->getAddresses()[0];
143 throw new LogicException(
'An email must have a "From" or a "Sender" header.');
146 return bin2hex(random_bytes(16)).strstr($sender->getAddress(),
'@');
151 return [$this->headers, $this->body];
156 [$this->headers, $this->body] = $data;