| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 | <?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 Message class for building emails. * * @author     Chris Corbyn */class Swift_Message extends Swift_Mime_SimpleMessage{    /**     * @var Swift_Signers_HeaderSigner[]     */    private $headerSigners = array();    /**     * @var Swift_Signers_BodySigner[]     */    private $bodySigners = array();    /**     * @var array     */    private $savedMessage = array();    /**     * Create a new Message.     *     * Details may be optionally passed into the constructor.     *     * @param string $subject     * @param string $body     * @param string $contentType     * @param string $charset     */    public function __construct($subject = null, $body = null, $contentType = null, $charset = null)    {        call_user_func_array(            array($this, 'Swift_Mime_SimpleMessage::__construct'),            Swift_DependencyContainer::getInstance()                ->createDependenciesFor('mime.message')            );        if (!isset($charset)) {            $charset = Swift_DependencyContainer::getInstance()                ->lookup('properties.charset');        }        $this->setSubject($subject);        $this->setBody($body);        $this->setCharset($charset);        if ($contentType) {            $this->setContentType($contentType);        }    }    /**     * Create a new Message.     *     * @param string $subject     * @param string $body     * @param string $contentType     * @param string $charset     *     * @return Swift_Message     */    public static function newInstance($subject = null, $body = null, $contentType = null, $charset = null)    {        return new self($subject, $body, $contentType, $charset);    }    /**     * Add a MimePart to this Message.     *     * @param string|Swift_OutputByteStream $body     * @param string                        $contentType     * @param string                        $charset     *     * @return Swift_Mime_SimpleMessage     */    public function addPart($body, $contentType = null, $charset = null)    {        return $this->attach(Swift_MimePart::newInstance(            $body, $contentType, $charset            ));    }    /**     * Attach a new signature handler to the message.     *     * @param Swift_Signer $signer     * @return Swift_Message     */    public function attachSigner(Swift_Signer $signer)    {        if ($signer instanceof Swift_Signers_HeaderSigner) {            $this->headerSigners[] = $signer;        } elseif ($signer instanceof Swift_Signers_BodySigner) {            $this->bodySigners[] = $signer;        }        return $this;    }    /**     * Attach a new signature handler to the message.     *     * @param Swift_Signer $signer     * @return Swift_Message     */    public function detachSigner(Swift_Signer $signer)    {        if ($signer instanceof Swift_Signers_HeaderSigner) {            foreach ($this->headerSigners as $k => $headerSigner) {                if ($headerSigner === $signer) {                    unset($this->headerSigners[$k]);                    return $this;                }            }        } elseif ($signer instanceof Swift_Signers_BodySigner) {            foreach ($this->bodySigners as $k => $bodySigner) {                if ($bodySigner === $signer) {                    unset($this->bodySigners[$k]);                    return $this;                }            }        }        return $this;    }    /**     * Get this message as a complete string.     *     * @return string     */    public function toString()    {        if (empty($this->headerSigners) && empty($this->bodySigners)) {            return parent::toString();        }        $this->saveMessage();        $this->doSign();        $string = parent::toString();        $this->restoreMessage();        return $string;    }    /**     * Write this message to a {@link Swift_InputByteStream}.     *     * @param Swift_InputByteStream $is     */    public function toByteStream(Swift_InputByteStream $is)    {        if (empty($this->headerSigners) && empty($this->bodySigners)) {            parent::toByteStream($is);            return;        }        $this->saveMessage();        $this->doSign();        parent::toByteStream($is);        $this->restoreMessage();    }    public function __wakeup()    {        Swift_DependencyContainer::getInstance()->createDependenciesFor('mime.message');    }    /**     * loops through signers and apply the signatures     */    protected function doSign()    {        foreach ($this->bodySigners as $signer) {            $altered = $signer->getAlteredHeaders();            $this->saveHeaders($altered);            $signer->signMessage($this);        }        foreach ($this->headerSigners as $signer) {            $altered = $signer->getAlteredHeaders();            $this->saveHeaders($altered);            $signer->reset();            $signer->setHeaders($this->getHeaders());            $signer->startBody();            $this->_bodyToByteStream($signer);            $signer->endBody();            $signer->addSignature($this->getHeaders());        }    }    /**     * save the message before any signature is applied     */    protected function saveMessage()    {        $this->savedMessage = array('headers'=> array());        $this->savedMessage['body'] = $this->getBody();        $this->savedMessage['children'] = $this->getChildren();        if (count($this->savedMessage['children']) > 0 && $this->getBody() != '') {            $this->setChildren(array_merge(array($this->_becomeMimePart()), $this->savedMessage['children']));            $this->setBody('');        }    }    /**     * save the original headers     * @param array $altered     */    protected function saveHeaders(array $altered)    {        foreach ($altered as $head) {            $lc = strtolower($head);            if (!isset($this->savedMessage['headers'][$lc])) {                $this->savedMessage['headers'][$lc] = $this->getHeaders()->getAll($head);            }        }    }    /**     * Remove or restore altered headers     */    protected function restoreHeaders()    {        foreach ($this->savedMessage['headers'] as $name => $savedValue) {            $headers = $this->getHeaders()->getAll($name);            foreach ($headers as $key => $value) {                if (!isset($savedValue[$key])) {                    $this->getHeaders()->remove($name, $key);                }            }        }    }    /**     * Restore message body     */    protected function restoreMessage()    {        $this->setBody($this->savedMessage['body']);        $this->setChildren($this->savedMessage['children']);        $this->restoreHeaders();        $this->savedMessage = array();    }}
 |