| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642 |
- <?php
- /*
- * This file is part of SwiftMailer.
- * (c) 2004-2009 Chris Corbyn
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default email message class.
- *
- * @author Chris Corbyn
- */
- class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart
- {
- const PRIORITY_HIGHEST = 1;
- const PRIORITY_HIGH = 2;
- const PRIORITY_NORMAL = 3;
- const PRIORITY_LOW = 4;
- const PRIORITY_LOWEST = 5;
- /**
- * Create a new SimpleMessage with $headers, $encoder and $cache.
- *
- * @param string $charset
- */
- public function __construct(Swift_Mime_SimpleHeaderSet $headers, Swift_Mime_ContentEncoder $encoder, Swift_KeyCache $cache, Swift_IdGenerator $idGenerator, $charset = null)
- {
- parent::__construct($headers, $encoder, $cache, $idGenerator, $charset);
- $this->getHeaders()->defineOrdering([
- 'Return-Path',
- 'Received',
- 'DKIM-Signature',
- 'DomainKey-Signature',
- 'Sender',
- 'Message-ID',
- 'Date',
- 'Subject',
- 'From',
- 'Reply-To',
- 'To',
- 'Cc',
- 'Bcc',
- 'MIME-Version',
- 'Content-Type',
- 'Content-Transfer-Encoding',
- ]);
- $this->getHeaders()->setAlwaysDisplayed(['Date', 'Message-ID', 'From']);
- $this->getHeaders()->addTextHeader('MIME-Version', '1.0');
- $this->setDate(new DateTimeImmutable());
- $this->setId($this->getId());
- $this->getHeaders()->addMailboxHeader('From');
- }
- /**
- * Always returns {@link LEVEL_TOP} for a message instance.
- *
- * @return int
- */
- public function getNestingLevel()
- {
- return self::LEVEL_TOP;
- }
- /**
- * Set the subject of this message.
- *
- * @param string $subject
- *
- * @return $this
- */
- public function setSubject($subject)
- {
- if (!$this->setHeaderFieldModel('Subject', $subject)) {
- $this->getHeaders()->addTextHeader('Subject', $subject);
- }
- return $this;
- }
- /**
- * Get the subject of this message.
- *
- * @return string
- */
- public function getSubject()
- {
- return $this->getHeaderFieldModel('Subject');
- }
- /**
- * Set the date at which this message was created.
- *
- * @return $this
- */
- public function setDate(DateTimeInterface $dateTime)
- {
- if (!$this->setHeaderFieldModel('Date', $dateTime)) {
- $this->getHeaders()->addDateHeader('Date', $dateTime);
- }
- return $this;
- }
- /**
- * Get the date at which this message was created.
- *
- * @return DateTimeInterface
- */
- public function getDate()
- {
- return $this->getHeaderFieldModel('Date');
- }
- /**
- * Set the return-path (the bounce address) of this message.
- *
- * @param string $address
- *
- * @return $this
- */
- public function setReturnPath($address)
- {
- if (!$this->setHeaderFieldModel('Return-Path', $address)) {
- $this->getHeaders()->addPathHeader('Return-Path', $address);
- }
- return $this;
- }
- /**
- * Get the return-path (bounce address) of this message.
- *
- * @return string
- */
- public function getReturnPath()
- {
- return $this->getHeaderFieldModel('Return-Path');
- }
- /**
- * Set the sender of this message.
- *
- * This does not override the From field, but it has a higher significance.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function setSender($address, $name = null)
- {
- if (!\is_array($address) && isset($name)) {
- $address = [$address => $name];
- }
- if (!$this->setHeaderFieldModel('Sender', (array) $address)) {
- $this->getHeaders()->addMailboxHeader('Sender', (array) $address);
- }
- return $this;
- }
- /**
- * Get the sender of this message.
- *
- * @return string
- */
- public function getSender()
- {
- return $this->getHeaderFieldModel('Sender');
- }
- /**
- * Add a From: address to this message.
- *
- * If $name is passed this name will be associated with the address.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function addFrom($address, $name = null)
- {
- $current = $this->getFrom();
- $current[$address] = $name;
- return $this->setFrom($current);
- }
- /**
- * Set the from address of this message.
- *
- * You may pass an array of addresses if this message is from multiple people.
- *
- * If $name is passed and the first parameter is a string, this name will be
- * associated with the address.
- *
- * @param string|array $addresses
- * @param string $name optional
- *
- * @return $this
- */
- public function setFrom($addresses, $name = null)
- {
- if (!\is_array($addresses) && isset($name)) {
- $addresses = [$addresses => $name];
- }
- if (!$this->setHeaderFieldModel('From', (array) $addresses)) {
- $this->getHeaders()->addMailboxHeader('From', (array) $addresses);
- }
- return $this;
- }
- /**
- * Get the from address of this message.
- *
- * @return mixed
- */
- public function getFrom()
- {
- return $this->getHeaderFieldModel('From');
- }
- /**
- * Add a Reply-To: address to this message.
- *
- * If $name is passed this name will be associated with the address.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function addReplyTo($address, $name = null)
- {
- $current = $this->getReplyTo();
- $current[$address] = $name;
- return $this->setReplyTo($current);
- }
- /**
- * Set the reply-to address of this message.
- *
- * You may pass an array of addresses if replies will go to multiple people.
- *
- * If $name is passed and the first parameter is a string, this name will be
- * associated with the address.
- *
- * @param mixed $addresses
- * @param string $name optional
- *
- * @return $this
- */
- public function setReplyTo($addresses, $name = null)
- {
- if (!\is_array($addresses) && isset($name)) {
- $addresses = [$addresses => $name];
- }
- if (!$this->setHeaderFieldModel('Reply-To', (array) $addresses)) {
- $this->getHeaders()->addMailboxHeader('Reply-To', (array) $addresses);
- }
- return $this;
- }
- /**
- * Get the reply-to address of this message.
- *
- * @return string
- */
- public function getReplyTo()
- {
- return $this->getHeaderFieldModel('Reply-To');
- }
- /**
- * Add a To: address to this message.
- *
- * If $name is passed this name will be associated with the address.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function addTo($address, $name = null)
- {
- $current = $this->getTo();
- $current[$address] = $name;
- return $this->setTo($current);
- }
- /**
- * Set the to addresses of this message.
- *
- * If multiple recipients will receive the message an array should be used.
- * Example: array('receiver@domain.org', 'other@domain.org' => 'A name')
- *
- * If $name is passed and the first parameter is a string, this name will be
- * associated with the address.
- *
- * @param mixed $addresses
- * @param string $name optional
- *
- * @return $this
- */
- public function setTo($addresses, $name = null)
- {
- if (!\is_array($addresses) && isset($name)) {
- $addresses = [$addresses => $name];
- }
- if (!$this->setHeaderFieldModel('To', (array) $addresses)) {
- $this->getHeaders()->addMailboxHeader('To', (array) $addresses);
- }
- return $this;
- }
- /**
- * Get the To addresses of this message.
- *
- * @return array
- */
- public function getTo()
- {
- return $this->getHeaderFieldModel('To');
- }
- /**
- * Add a Cc: address to this message.
- *
- * If $name is passed this name will be associated with the address.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function addCc($address, $name = null)
- {
- $current = $this->getCc();
- $current[$address] = $name;
- return $this->setCc($current);
- }
- /**
- * Set the Cc addresses of this message.
- *
- * If $name is passed and the first parameter is a string, this name will be
- * associated with the address.
- *
- * @param mixed $addresses
- * @param string $name optional
- *
- * @return $this
- */
- public function setCc($addresses, $name = null)
- {
- if (!\is_array($addresses) && isset($name)) {
- $addresses = [$addresses => $name];
- }
- if (!$this->setHeaderFieldModel('Cc', (array) $addresses)) {
- $this->getHeaders()->addMailboxHeader('Cc', (array) $addresses);
- }
- return $this;
- }
- /**
- * Get the Cc address of this message.
- *
- * @return array
- */
- public function getCc()
- {
- return $this->getHeaderFieldModel('Cc');
- }
- /**
- * Add a Bcc: address to this message.
- *
- * If $name is passed this name will be associated with the address.
- *
- * @param string $address
- * @param string $name optional
- *
- * @return $this
- */
- public function addBcc($address, $name = null)
- {
- $current = $this->getBcc();
- $current[$address] = $name;
- return $this->setBcc($current);
- }
- /**
- * Set the Bcc addresses of this message.
- *
- * If $name is passed and the first parameter is a string, this name will be
- * associated with the address.
- *
- * @param mixed $addresses
- * @param string $name optional
- *
- * @return $this
- */
- public function setBcc($addresses, $name = null)
- {
- if (!\is_array($addresses) && isset($name)) {
- $addresses = [$addresses => $name];
- }
- if (!$this->setHeaderFieldModel('Bcc', (array) $addresses)) {
- $this->getHeaders()->addMailboxHeader('Bcc', (array) $addresses);
- }
- return $this;
- }
- /**
- * Get the Bcc addresses of this message.
- *
- * @return array
- */
- public function getBcc()
- {
- return $this->getHeaderFieldModel('Bcc');
- }
- /**
- * Set the priority of this message.
- *
- * The value is an integer where 1 is the highest priority and 5 is the lowest.
- *
- * @param int $priority
- *
- * @return $this
- */
- public function setPriority($priority)
- {
- $priorityMap = [
- self::PRIORITY_HIGHEST => 'Highest',
- self::PRIORITY_HIGH => 'High',
- self::PRIORITY_NORMAL => 'Normal',
- self::PRIORITY_LOW => 'Low',
- self::PRIORITY_LOWEST => 'Lowest',
- ];
- $pMapKeys = array_keys($priorityMap);
- if ($priority > max($pMapKeys)) {
- $priority = max($pMapKeys);
- } elseif ($priority < min($pMapKeys)) {
- $priority = min($pMapKeys);
- }
- if (!$this->setHeaderFieldModel('X-Priority',
- sprintf('%d (%s)', $priority, $priorityMap[$priority]))) {
- $this->getHeaders()->addTextHeader('X-Priority',
- sprintf('%d (%s)', $priority, $priorityMap[$priority]));
- }
- return $this;
- }
- /**
- * Get the priority of this message.
- *
- * The returned value is an integer where 1 is the highest priority and 5
- * is the lowest.
- *
- * @return int
- */
- public function getPriority()
- {
- list($priority) = sscanf($this->getHeaderFieldModel('X-Priority'),
- '%[1-5]'
- );
- return $priority ?? 3;
- }
- /**
- * Ask for a delivery receipt from the recipient to be sent to $addresses.
- *
- * @param array $addresses
- *
- * @return $this
- */
- public function setReadReceiptTo($addresses)
- {
- if (!$this->setHeaderFieldModel('Disposition-Notification-To', $addresses)) {
- $this->getHeaders()
- ->addMailboxHeader('Disposition-Notification-To', $addresses);
- }
- return $this;
- }
- /**
- * Get the addresses to which a read-receipt will be sent.
- *
- * @return string
- */
- public function getReadReceiptTo()
- {
- return $this->getHeaderFieldModel('Disposition-Notification-To');
- }
- /**
- * Attach a {@link Swift_Mime_SimpleMimeEntity} such as an Attachment or MimePart.
- *
- * @return $this
- */
- public function attach(Swift_Mime_SimpleMimeEntity $entity)
- {
- $this->setChildren(array_merge($this->getChildren(), [$entity]));
- return $this;
- }
- /**
- * Remove an already attached entity.
- *
- * @return $this
- */
- public function detach(Swift_Mime_SimpleMimeEntity $entity)
- {
- $newChildren = [];
- foreach ($this->getChildren() as $child) {
- if ($entity !== $child) {
- $newChildren[] = $child;
- }
- }
- $this->setChildren($newChildren);
- return $this;
- }
- /**
- * Attach a {@link Swift_Mime_SimpleMimeEntity} and return it's CID source.
- *
- * This method should be used when embedding images or other data in a message.
- *
- * @return string
- */
- public function embed(Swift_Mime_SimpleMimeEntity $entity)
- {
- $this->attach($entity);
- return 'cid:'.$entity->getId();
- }
- /**
- * Get this message as a complete string.
- *
- * @return string
- */
- public function toString()
- {
- if (\count($children = $this->getChildren()) > 0 && '' != $this->getBody()) {
- $this->setChildren(array_merge([$this->becomeMimePart()], $children));
- $string = parent::toString();
- $this->setChildren($children);
- } else {
- $string = parent::toString();
- }
- return $string;
- }
- /**
- * Returns a string representation of this object.
- *
- * @see toString()
- *
- * @return string
- */
- public function __toString()
- {
- return $this->toString();
- }
- /**
- * Write this message to a {@link Swift_InputByteStream}.
- */
- public function toByteStream(Swift_InputByteStream $is)
- {
- if (\count($children = $this->getChildren()) > 0 && '' != $this->getBody()) {
- $this->setChildren(array_merge([$this->becomeMimePart()], $children));
- parent::toByteStream($is);
- $this->setChildren($children);
- } else {
- parent::toByteStream($is);
- }
- }
- /** @see Swift_Mime_SimpleMimeEntity::getIdField() */
- protected function getIdField()
- {
- return 'Message-ID';
- }
- /** Turn the body of this message into a child of itself if needed */
- protected function becomeMimePart()
- {
- $part = new parent($this->getHeaders()->newInstance(), $this->getEncoder(),
- $this->getCache(), $this->getIdGenerator(), $this->userCharset
- );
- $part->setContentType($this->userContentType);
- $part->setBody($this->getBody());
- $part->setFormat($this->userFormat);
- $part->setDelSp($this->userDelSp);
- $part->setNestingLevel($this->getTopNestingLevel());
- return $part;
- }
- /** Get the highest nesting level nested inside this message */
- private function getTopNestingLevel()
- {
- $highestLevel = $this->getNestingLevel();
- foreach ($this->getChildren() as $child) {
- $childLevel = $child->getNestingLevel();
- if ($highestLevel < $childLevel) {
- $highestLevel = $childLevel;
- }
- }
- return $highestLevel;
- }
- }
|