• Zend Framework学习之Zend_Mail


    Zend_Mail组件提供了通用化的功能来创建和发送文本。
    Zend_Mail通过PHP内建的mail()函数或者直接通过SMTP连接来发送邮件。
    一个简单的邮件由收件人、主题、邮件内容以及发件人等内容组成。
    步骤如下
    1.创建对象
    2.设置邮件内容
    3.发送

    案例:

    <?php
    require_once "Zend/Mail.php";
    $my_mail = new Zend_Mail();                         //创建一个对象
    $my_mail->addTo("jiqing9006@126.com","jim");        //添加一个收件人
    $my_mail->setSubject("Just a test");                //设置主题
    $my_mail->setBodyText("Hello Jim!");                //为邮件设置正文内容
    $my_mail->setFrom("706507884@qq.com","jiqing");     //为邮件设置发件人
    echo "邮件设置完毕";
    echo "<p>";
    echo "邮件收件人为:";
    $result = $my_mail->getHeaders();
    echo $result['To'][0];
    echo "<p>";
    echo "邮件主题为:";
    echo $my_mail->getSubject();
    echo "<p>";
    echo "邮件内容为:";
    $result = $my_mail->getBodyText();
    echo $result->getContent();
    echo "<p>";
    echo "邮件发件人为:";
    echo $my_mail->getFrom();
    echo "<p>";
    $my_mail->send();

    结果:

    邮件设置完毕

    邮件收件人为:jim

    邮件主题为:Just a test

    邮件内容为:Hello Jim!

    邮件发件人为:706507884@qq.com


    Fatal error: Uncaught exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. mail() [<a href='function.mail'>function.mail</a>]: Failed to connect to mailserver at &quot;localhost&quot; port 25, verify your &quot;SMTP&quot; and &quot;smtp_port&quot; setting in php.ini or use ini_set()' in C:\zend\library\Zend\Mail\Transport\Sendmail.php:137 Stack trace: #0 C:\zend\library\Zend\Mail\Transport\Abstract.php(348): Zend_Mail_Transport_Sendmail->_sendMail() #1 C:\zend\library\Zend\Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail)) #2 D:\xampp\htdocs\test.php(24): Zend_Mail->send() #3 {main} thrown in C:\zend\library\Zend\Mail\Transport\Sendmail.php on line 137


    点评:
    这里执行不能成功,是因为没有配置好Mail服务器。

    源码分析:

    <?php
    /**
     * Zend Framework
     *
     * LICENSE
     *
     * This source file is subject to the new BSD license that is bundled
     * with this package in the file LICENSE.txt.
     * It is also available through the world-wide-web at this URL:
     * http://framework.zend.com/license/new-bsd
     * If you did not receive a copy of the license and are unable to
     * obtain it through the world-wide-web, please send an email
     * to license@zend.com so we can send you a copy immediately.
     *
     * @category   Zend
     * @package    Zend_Mail
     * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
     * @license    http://framework.zend.com/license/new-bsd     New BSD License
     * @version    $Id: Mail.php 24593 2012-01-05 20:35:02Z matthew $
     */
    
    
    /**
     * @see Zend_Mail_Transport_Abstract
     */
    require_once 'Zend/Mail/Transport/Abstract.php';
    
    /**
     * @see Zend_Mime
     */
    require_once 'Zend/Mime.php';
    
    /**
     * @see Zend_Mime_Message
     */
    require_once 'Zend/Mime/Message.php';
    
    /**
     * @see Zend_Mime_Part
     */
    require_once 'Zend/Mime/Part.php';
    
    
    /**
     * Class for sending an email.
     *
     * @category   Zend
     * @package    Zend_Mail
     * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
     * @license    http://framework.zend.com/license/new-bsd     New BSD License
     */
    class Zend_Mail extends Zend_Mime_Message
    {
        /**#@+
         * @access protected
         */
    
        /**
         * @var Zend_Mail_Transport_Abstract
         * @static
         */
        protected static $_defaultTransport = null;
    
        /**
         * @var array
         * @static
         */
        protected static $_defaultFrom;
    
        /**
         * @var array
         * @static
         */
        protected static $_defaultReplyTo;
    
        /**
         * Mail character set
         * @var string
         */
        protected $_charset = 'iso-8859-1';
    
        /**
         * Mail headers
         * @var array
         */
        protected $_headers = array();
    
        /**
         * Encoding of Mail headers
         * @var string
         */
        protected $_headerEncoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE;
    
        /**
         * From: address
         * @var string
         */
        protected $_from = null;
    
        /**
         * To: addresses
         * @var array
         */
        protected $_to = array();
    
        /**
         * Array of all recipients
         * @var array
         */
        protected $_recipients = array();
    
        /**
         * Reply-To header
         * @var string
         */
        protected $_replyTo = null;
    
        /**
         * Return-Path header
         * @var string
         */
        protected $_returnPath = null;
    
        /**
         * Subject: header
         * @var string
         */
        protected $_subject = null;
    
        /**
         * Date: header
         * @var string
         */
        protected $_date = null;
    
        /**
         * Message-ID: header
         * @var string
         */
        protected $_messageId = null;
    
        /**
         * text/plain MIME part
         * @var false|Zend_Mime_Part
         */
        protected $_bodyText = false;
    
        /**
         * text/html MIME part
         * @var false|Zend_Mime_Part
         */
        protected $_bodyHtml = false;
    
        /**
         * MIME boundary string
         * @var string
         */
        protected $_mimeBoundary = null;
    
        /**
         * Content type of the message
         * @var string
         */
        protected $_type = null;
    
        /**#@-*/
    
        /**
         * Flag: whether or not email has attachments
         * @var boolean
         */
        public $hasAttachments = false;
    
    
        /**
         * Sets the default mail transport for all following uses of
         * Zend_Mail::send();
         *
         * @todo Allow passing a string to indicate the transport to load
         * @todo Allow passing in optional options for the transport to load
         * @param  Zend_Mail_Transport_Abstract $transport
         */
        public static function setDefaultTransport(Zend_Mail_Transport_Abstract $transport)
        {
            self::$_defaultTransport = $transport;
        }
    
        /**
         * Gets the default mail transport for all following uses of
         * unittests
         *
         * @todo Allow passing a string to indicate the transport to load
         * @todo Allow passing in optional options for the transport to load
         */
        public static function getDefaultTransport()
        {
            return self::$_defaultTransport;
        }
    
        /**
         * Clear the default transport property
         */
        public static function clearDefaultTransport()
        {
            self::$_defaultTransport = null;
        }
    
        /**
         * Public constructor
         *
         * @param  string $charset
         * @return void
         */
        public function __construct($charset = null)
        {
            if ($charset != null) {
                $this->_charset = $charset;
            }
        }
    
        /**
         * Return charset string
         *
         * @return string
         */
        public function getCharset()
        {
            return $this->_charset;
        }
    
        /**
         * Set content type
         *
         * Should only be used for manually setting multipart content types.
         *
         * @param  string $type Content type
         * @return Zend_Mail Implements fluent interface
         * @throws Zend_Mail_Exception for types not supported by Zend_Mime
         */
        public function setType($type)
        {
            $allowed = array(
                Zend_Mime::MULTIPART_ALTERNATIVE,
                Zend_Mime::MULTIPART_MIXED,
                Zend_Mime::MULTIPART_RELATED,
            );
            if (!in_array($type, $allowed)) {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Invalid content type "' . $type . '"');
            }
    
            $this->_type = $type;
            return $this;
        }
    
        /**
         * Get content type of the message
         *
         * @return string
         */
        public function getType()
        {
            return $this->_type;
        }
    
        /**
         * Set an arbitrary mime boundary for the message
         *
         * If not set, Zend_Mime will generate one.
         *
         * @param  string    $boundary
         * @return Zend_Mail Provides fluent interface
         */
        public function setMimeBoundary($boundary)
        {
            $this->_mimeBoundary = $boundary;
    
            return $this;
        }
    
        /**
         * Return the boundary string used for the message
         *
         * @return string
         */
        public function getMimeBoundary()
        {
            return $this->_mimeBoundary;
        }
    
        /**
         * Return encoding of mail headers
         *
         * @deprecated use {@link getHeaderEncoding()} instead
         * @return string
         */
        public function getEncodingOfHeaders()
        {
            return $this->getHeaderEncoding();
        }
    
        /**
         * Return the encoding of mail headers
         *
         * Either Zend_Mime::ENCODING_QUOTEDPRINTABLE or Zend_Mime::ENCODING_BASE64
         *
         * @return string
         */
        public function getHeaderEncoding()
        {
            return $this->_headerEncoding;
        }
    
        /**
         * Set the encoding of mail headers
         *
         * @deprecated Use {@link setHeaderEncoding()} instead.
         * @param  string $encoding
         * @return Zend_Mail
         */
        public function setEncodingOfHeaders($encoding)
        {
            return $this->setHeaderEncoding($encoding);
        }
    
        /**
         * Set the encoding of mail headers
         *
         * @param  string $encoding Zend_Mime::ENCODING_QUOTEDPRINTABLE or Zend_Mime::ENCODING_BASE64
         * @return Zend_Mail Provides fluent interface
         */
        public function setHeaderEncoding($encoding)
        {
            $allowed = array(
                Zend_Mime::ENCODING_BASE64,
                Zend_Mime::ENCODING_QUOTEDPRINTABLE
            );
            if (!in_array($encoding, $allowed)) {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Invalid encoding "' . $encoding . '"');
            }
            $this->_headerEncoding = $encoding;
    
            return $this;
        }
    
        /**
         * Sets the text body for the message.
         *
         * @param  string $txt
         * @param  string $charset
         * @param  string $encoding
         * @return Zend_Mail Provides fluent interface
        */
        public function setBodyText($txt, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
        {
            if ($charset === null) {
                $charset = $this->_charset;
            }
    
            $mp = new Zend_Mime_Part($txt);
            $mp->encoding = $encoding;
            $mp->type = Zend_Mime::TYPE_TEXT;
            $mp->disposition = Zend_Mime::DISPOSITION_INLINE;
            $mp->charset = $charset;
    
            $this->_bodyText = $mp;
    
            return $this;
        }
    
        /**
         * Return text body Zend_Mime_Part or string
         *
         * @param  bool textOnly Whether to return just the body text content or the MIME part; defaults to false, the MIME part
         * @return false|Zend_Mime_Part|string
         */
        public function getBodyText($textOnly = false)
        {
            if ($textOnly && $this->_bodyText) {
                $body = $this->_bodyText;
                return $body->getContent();
            }
    
            return $this->_bodyText;
        }
    
        /**
         * Sets the HTML body for the message
         *
         * @param  string    $html
         * @param  string    $charset
         * @param  string    $encoding
         * @return Zend_Mail Provides fluent interface
         */
        public function setBodyHtml($html, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
        {
            if ($charset === null) {
                $charset = $this->_charset;
            }
    
            $mp = new Zend_Mime_Part($html);
            $mp->encoding = $encoding;
            $mp->type = Zend_Mime::TYPE_HTML;
            $mp->disposition = Zend_Mime::DISPOSITION_INLINE;
            $mp->charset = $charset;
    
            $this->_bodyHtml = $mp;
    
            return $this;
        }
    
        /**
         * Return Zend_Mime_Part representing body HTML
         *
         * @param  bool $htmlOnly Whether to return the body HTML only, or the MIME part; defaults to false, the MIME part
         * @return false|Zend_Mime_Part|string
         */
        public function getBodyHtml($htmlOnly = false)
        {
            if ($htmlOnly && $this->_bodyHtml) {
                $body = $this->_bodyHtml;
                return $body->getContent();
            }
    
            return $this->_bodyHtml;
        }
    
        /**
         * Adds an existing attachment to the mail message
         *
         * @param  Zend_Mime_Part $attachment
         * @return Zend_Mail Provides fluent interface
         */
        public function addAttachment(Zend_Mime_Part $attachment)
        {
            $this->addPart($attachment);
            $this->hasAttachments = true;
    
            return $this;
        }
    
        /**
         * Creates a Zend_Mime_Part attachment
         *
         * Attachment is automatically added to the mail object after creation. The
         * attachment object is returned to allow for further manipulation.
         *
         * @param  string         $body
         * @param  string         $mimeType
         * @param  string         $disposition
         * @param  string         $encoding
         * @param  string         $filename OPTIONAL A filename for the attachment
         * @return Zend_Mime_Part Newly created Zend_Mime_Part object (to allow
         * advanced settings)
         */
        public function createAttachment($body,
                                         $mimeType    = Zend_Mime::TYPE_OCTETSTREAM,
                                         $disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
                                         $encoding    = Zend_Mime::ENCODING_BASE64,
                                         $filename    = null)
        {
    
            $mp = new Zend_Mime_Part($body);
            $mp->encoding = $encoding;
            $mp->type = $mimeType;
            $mp->disposition = $disposition;
            $mp->filename = $filename;
    
            $this->addAttachment($mp);
    
            return $mp;
        }
    
        /**
         * Return a count of message parts
         *
         * @return integer
         */
        public function getPartCount()
        {
            return count($this->_parts);
        }
    
        /**
         * Encode header fields
         *
         * Encodes header content according to RFC1522 if it contains non-printable
         * characters.
         *
         * @param  string $value
         * @return string
         */
        protected function _encodeHeader($value)
        {
            if (Zend_Mime::isPrintable($value) === false) {
                if ($this->getHeaderEncoding() === Zend_Mime::ENCODING_QUOTEDPRINTABLE) {
                    $value = Zend_Mime::encodeQuotedPrintableHeader($value, $this->getCharset(), Zend_Mime::LINELENGTH, Zend_Mime::LINEEND);
                } else {
                    $value = Zend_Mime::encodeBase64Header($value, $this->getCharset(), Zend_Mime::LINELENGTH, Zend_Mime::LINEEND);
                }
            }
    
            return $value;
        }
    
        /**
         * Add a header to the message
         *
         * Adds a header to this message. If append is true and the header already
         * exists, raises a flag indicating that the header should be appended.
         *
         * @param string  $headerName
         * @param string  $value
         * @param bool $append
         */
        protected function _storeHeader($headerName, $value, $append = false)
        {
            if (isset($this->_headers[$headerName])) {
                $this->_headers[$headerName][] = $value;
            } else {
                $this->_headers[$headerName] = array($value);
            }
    
            if ($append) {
                $this->_headers[$headerName]['append'] = true;
            }
    
        }
    
        /**
         * Clear header from the message
         *
         * @param string $headerName
         * @deprecated use public method directly
         */
        protected function _clearHeader($headerName)
        {
            $this->clearHeader($headerName);
        }
    
        /**
         * Helper function for adding a recipient and the corresponding header
         *
         * @param string $headerName
         * @param string $email
         * @param string $name
         */
        protected function _addRecipientAndHeader($headerName, $email, $name)
        {
            $email = $this->_filterEmail($email);
            $name  = $this->_filterName($name);
            // prevent duplicates
            $this->_recipients[$email] = 1;
            $this->_storeHeader($headerName, $this->_formatAddress($email, $name), true);
        }
    
        /**
         * Adds To-header and recipient, $email can be an array, or a single string address
         *
         * @param  string|array $email
         * @param  string $name
         * @return Zend_Mail Provides fluent interface
         */
        public function addTo($email, $name='')
        {
            if (!is_array($email)) {
                $email = array($name => $email);
            }
    
            foreach ($email as $n => $recipient) {
                $this->_addRecipientAndHeader('To', $recipient, is_int($n) ? '' : $n);
                $this->_to[] = $recipient;
            }
    
            return $this;
        }
    
        /**
         * Adds Cc-header and recipient, $email can be an array, or a single string address
         *
         * @param  string|array    $email
         * @param  string    $name
         * @return Zend_Mail Provides fluent interface
         */
        public function addCc($email, $name='')
        {
            if (!is_array($email)) {
                $email = array($name => $email);
            }
    
            foreach ($email as $n => $recipient) {
                $this->_addRecipientAndHeader('Cc', $recipient, is_int($n) ? '' : $n);
            }
    
            return $this;
        }
    
        /**
         * Adds Bcc recipient, $email can be an array, or a single string address
         *
         * @param  string|array    $email
         * @return Zend_Mail Provides fluent interface
         */
        public function addBcc($email)
        {
            if (!is_array($email)) {
                $email = array($email);
            }
    
            foreach ($email as $recipient) {
                $this->_addRecipientAndHeader('Bcc', $recipient, '');
            }
    
            return $this;
        }
    
        /**
         * Return list of recipient email addresses
         *
         * @return array (of strings)
         */
        public function getRecipients()
        {
            return array_keys($this->_recipients);
        }
    
        /**
         * Clear header from the message
         *
         * @param string $headerName
         * @return Zend_Mail Provides fluent inter
         */
        public function clearHeader($headerName)
        {
            if (isset($this->_headers[$headerName])){
                unset($this->_headers[$headerName]);
            }
            return $this;
        }
    
        /**
         * Clears list of recipient email addresses
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearRecipients()
        {
            $this->_recipients = array();
            $this->_to = array();
    
            $this->clearHeader('To');
            $this->clearHeader('Cc');
            $this->clearHeader('Bcc');
    
            return $this;
        }
    
        /**
         * Sets From-header and sender of the message
         *
         * @param  string    $email
         * @param  string    $name
         * @return Zend_Mail Provides fluent interface
         * @throws Zend_Mail_Exception if called subsequent times
         */
        public function setFrom($email, $name = null)
        {
            if (null !== $this->_from) {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('From Header set twice');
            }
    
            $email = $this->_filterEmail($email);
            $name  = $this->_filterName($name);
            $this->_from = $email;
            $this->_storeHeader('From', $this->_formatAddress($email, $name), true);
    
            return $this;
        }
    
        /**
         * Set Reply-To Header
         *
         * @param string $email
         * @param string $name
         * @return Zend_Mail
         * @throws Zend_Mail_Exception if called more than one time
         */
        public function setReplyTo($email, $name = null)
        {
            if (null !== $this->_replyTo) {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Reply-To Header set twice');
            }
    
            $email = $this->_filterEmail($email);
            $name  = $this->_filterName($name);
            $this->_replyTo = $email;
            $this->_storeHeader('Reply-To', $this->_formatAddress($email, $name), true);
    
            return $this;
        }
    
        /**
         * Returns the sender of the mail
         *
         * @return string
         */
        public function getFrom()
        {
            return $this->_from;
        }
    
        /**
         * Returns the current Reply-To address of the message
         *
         * @return string|null Reply-To address, null when not set
         */
        public function getReplyTo()
        {
            return $this->_replyTo;
        }
    
        /**
         * Clears the sender from the mail
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearFrom()
        {
            $this->_from = null;
            $this->clearHeader('From');
    
            return $this;
        }
    
         /**
          * Clears the current Reply-To address from the message
          *
          * @return Zend_Mail Provides fluent interface
          */
        public function clearReplyTo()
        {
            $this->_replyTo = null;
            $this->clearHeader('Reply-To');
    
            return $this;
        }
    
        /**
         * Sets Default From-email and name of the message
         *
         * @param  string               $email
         * @param  string    Optional   $name
         * @return void
         */
        public static function setDefaultFrom($email, $name = null)
        {
            self::$_defaultFrom = array('email' => $email, 'name' => $name);
        }
    
        /**
         * Returns the default sender of the mail
         *
         * @return null|array   Null if none was set.
         */
        public static function getDefaultFrom()
        {
            return self::$_defaultFrom;
        }
    
        /**
         * Clears the default sender from the mail
         *
         * @return void
         */
        public static function clearDefaultFrom()
        {
            self::$_defaultFrom = null;
        }
    
        /**
         * Sets From-name and -email based on the defaults
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function setFromToDefaultFrom() {
            $from = self::getDefaultFrom();
            if($from === null) {
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception(
                    'No default From Address set to use');
            }
    
            $this->setFrom($from['email'], $from['name']);
    
            return $this;
        }
    
        /**
         * Sets Default ReplyTo-address and -name of the message
         *
         * @param  string               $email
         * @param  string    Optional   $name
         * @return void
         */
        public static function setDefaultReplyTo($email, $name = null)
        {
            self::$_defaultReplyTo = array('email' => $email, 'name' => $name);
        }
    
        /**
         * Returns the default Reply-To Address and Name of the mail
         *
         * @return null|array   Null if none was set.
         */
        public static function getDefaultReplyTo()
        {
            return self::$_defaultReplyTo;
        }
    
        /**
         * Clears the default ReplyTo-address and -name from the mail
         *
         * @return void
         */
        public static function clearDefaultReplyTo()
        {
            self::$_defaultReplyTo = null;
        }
    
        /**
         * Sets ReplyTo-name and -email based on the defaults
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function setReplyToFromDefault() {
            $replyTo = self::getDefaultReplyTo();
            if($replyTo === null) {
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception(
                    'No default Reply-To Address set to use');
            }
    
            $this->setReplyTo($replyTo['email'], $replyTo['name']);
    
            return $this;
        }
    
        /**
         * Sets the Return-Path header of the message
         *
         * @param  string    $email
         * @return Zend_Mail Provides fluent interface
         * @throws Zend_Mail_Exception if set multiple times
         */
        public function setReturnPath($email)
        {
            if ($this->_returnPath === null) {
                $email = $this->_filterEmail($email);
                $this->_returnPath = $email;
                $this->_storeHeader('Return-Path', $email, false);
            } else {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Return-Path Header set twice');
            }
            return $this;
        }
    
        /**
         * Returns the current Return-Path address of the message
         *
         * If no Return-Path header is set, returns the value of {@link $_from}.
         *
         * @return string
         */
        public function getReturnPath()
        {
            if (null !== $this->_returnPath) {
                return $this->_returnPath;
            }
    
            return $this->_from;
        }
    
        /**
         * Clears the current Return-Path address from the message
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearReturnPath()
        {
            $this->_returnPath = null;
            $this->clearHeader('Return-Path');
    
            return $this;
        }
    
        /**
         * Sets the subject of the message
         *
         * @param   string    $subject
         * @return  Zend_Mail Provides fluent interface
         * @throws  Zend_Mail_Exception
         */
        public function setSubject($subject)
        {
            if ($this->_subject === null) {
                $subject = $this->_filterOther($subject);
                $this->_subject = $this->_encodeHeader($subject);
                $this->_storeHeader('Subject', $this->_subject);
            } else {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Subject set twice');
            }
            return $this;
        }
    
        /**
         * Returns the encoded subject of the message
         *
         * @return string
         */
        public function getSubject()
        {
            return $this->_subject;
        }
    
        /**
         * Clears the encoded subject from the message
         *
         * @return  Zend_Mail Provides fluent interface
         */
        public function clearSubject()
        {
            $this->_subject = null;
            $this->clearHeader('Subject');
    
            return $this;
        }
    
        /**
         * Sets Date-header
         *
         * @param  timestamp|string|Zend_Date $date
         * @return Zend_Mail Provides fluent interface
         * @throws Zend_Mail_Exception if called subsequent times or wrong date format.
         */
        public function setDate($date = null)
        {
            if ($this->_date === null) {
                if ($date === null) {
                    $date = date('r');
                } else if (is_int($date)) {
                    $date = date('r', $date);
                } else if (is_string($date)) {
                    $date = strtotime($date);
                    if ($date === false || $date < 0) {
                        /**
                         * @see Zend_Mail_Exception
                         */
                        require_once 'Zend/Mail/Exception.php';
                        throw new Zend_Mail_Exception('String representations of Date Header must be ' .
                                                      'strtotime()-compatible');
                    }
                    $date = date('r', $date);
                } else if ($date instanceof Zend_Date) {
                    $date = $date->get(Zend_Date::RFC_2822);
                } else {
                    /**
                     * @see Zend_Mail_Exception
                     */
                    require_once 'Zend/Mail/Exception.php';
                    throw new Zend_Mail_Exception(__METHOD__ . ' only accepts UNIX timestamps, Zend_Date objects, ' .
                                                  ' and strtotime()-compatible strings');
                }
                $this->_date = $date;
                $this->_storeHeader('Date', $date);
            } else {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Date Header set twice');
            }
            return $this;
        }
    
        /**
         * Returns the formatted date of the message
         *
         * @return string
         */
        public function getDate()
        {
            return $this->_date;
        }
    
        /**
         * Clears the formatted date from the message
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearDate()
        {
            $this->_date = null;
            $this->clearHeader('Date');
    
            return $this;
        }
    
        /**
         * Sets the Message-ID of the message
         *
         * @param   boolean|string  $id
         * true  :Auto
         * false :No set
         * null  :No set
         * string:Sets given string (Angle brackets is not necessary)
         * @return  Zend_Mail Provides fluent interface
         * @throws  Zend_Mail_Exception
         */
        public function setMessageId($id = true)
        {
            if ($id === null || $id === false) {
                return $this;
            } elseif ($id === true) {
                $id = $this->createMessageId();
            }
    
            if ($this->_messageId === null) {
                $id = $this->_filterOther($id);
                $this->_messageId = $id;
                $this->_storeHeader('Message-Id', '<' . $this->_messageId . '>');
            } else {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Message-ID set twice');
            }
    
            return $this;
        }
    
        /**
         * Returns the Message-ID of the message
         *
         * @return string
         */
        public function getMessageId()
        {
            return $this->_messageId;
        }
    
    
        /**
         * Clears the Message-ID from the message
         *
         * @return Zend_Mail Provides fluent interface
         */
        public function clearMessageId()
        {
            $this->_messageId = null;
            $this->clearHeader('Message-Id');
    
            return $this;
        }
    
        /**
         * Creates the Message-ID
         *
         * @return string
         */
        public function createMessageId() {
    
            $time = time();
    
            if ($this->_from !== null) {
                $user = $this->_from;
            } elseif (isset($_SERVER['REMOTE_ADDR'])) {
                $user = $_SERVER['REMOTE_ADDR'];
            } else {
                $user = getmypid();
            }
    
            $rand = mt_rand();
    
            if ($this->_recipients !== array()) {
                $recipient = array_rand($this->_recipients);
            } else {
                $recipient = 'unknown';
            }
    
            if (isset($_SERVER["SERVER_NAME"])) {
                $hostName = $_SERVER["SERVER_NAME"];
            } else {
                $hostName = php_uname('n');
            }
    
            return sha1($time . $user . $rand . $recipient) . '@' . $hostName;
        }
    
        /**
         * Add a custom header to the message
         *
         * @param  string              $name
         * @param  string              $value
         * @param  boolean             $append
         * @return Zend_Mail           Provides fluent interface
         * @throws Zend_Mail_Exception on attempts to create standard headers
         */
        public function addHeader($name, $value, $append = false)
        {
            $prohibit = array('to', 'cc', 'bcc', 'from', 'subject',
                              'reply-to', 'return-path',
                              'date', 'message-id',
                             );
            if (in_array(strtolower($name), $prohibit)) {
                /**
                 * @see Zend_Mail_Exception
                 */
                require_once 'Zend/Mail/Exception.php';
                throw new Zend_Mail_Exception('Cannot set standard header from addHeader()');
            }
    
            $value = $this->_filterOther($value);
            $value = $this->_encodeHeader($value);
            $this->_storeHeader($name, $value, $append);
    
            return $this;
        }
    
        /**
         * Return mail headers
         *
         * @return void
         */
        public function getHeaders()
        {
            return $this->_headers;
        }
    
        /**
         * Sends this email using the given transport or a previously
         * set DefaultTransport or the internal mail function if no
         * default transport had been set.
         *
         * @param  Zend_Mail_Transport_Abstract $transport
         * @return Zend_Mail                    Provides fluent interface
         */
        public function send($transport = null)
        {
            if ($transport === null) {
                if (! self::$_defaultTransport instanceof Zend_Mail_Transport_Abstract) {
                    require_once 'Zend/Mail/Transport/Sendmail.php';
                    $transport = new Zend_Mail_Transport_Sendmail();
                } else {
                    $transport = self::$_defaultTransport;
                }
            }
    
            if ($this->_date === null) {
                $this->setDate();
            }
    
            if(null === $this->_from && null !== self::getDefaultFrom()) {
                $this->setFromToDefaultFrom();
            }
    
            if(null === $this->_replyTo && null !== self::getDefaultReplyTo()) {
                $this->setReplyToFromDefault();
            }
    
            $transport->send($this);
    
            return $this;
        }
    
        /**
         * Filter of email data
         *
         * @param string $email
         * @return string
         */
        protected function _filterEmail($email)
        {
            $rule = array("\r" => '',
                          "\n" => '',
                          "\t" => '',
                          '"'  => '',
                          ','  => '',
                          '<'  => '',
                          '>'  => '',
            );
    
            return strtr($email, $rule);
        }
    
        /**
         * Filter of name data
         *
         * @param string $name
         * @return string
         */
        protected function _filterName($name)
        {
            $rule = array("\r" => '',
                          "\n" => '',
                          "\t" => '',
                          '"'  => "'",
                          '<'  => '[',
                          '>'  => ']',
            );
    
            return trim(strtr($name, $rule));
        }
    
        /**
         * Filter of other data
         *
         * @param string $data
         * @return string
         */
        protected function _filterOther($data)
        {
            $rule = array("\r" => '',
                          "\n" => '',
                          "\t" => '',
            );
    
            return strtr($data, $rule);
        }
    
        /**
         * Formats e-mail address
         *
         * @param string $email
         * @param string $name
         * @return string
         */
        protected function _formatAddress($email, $name)
        {
            if ($name === '' || $name === null || $name === $email) {
                return $email;
            } else {
                $encodedName = $this->_encodeHeader($name);
                if ($encodedName === $name  &&  strcspn($name, '()<>[]:;@\\,') != strlen($name)) {
                    $format = '"%s" <%s>';
                } else {
                    $format = '%s <%s>';
                }
                return sprintf($format, $encodedName, $email);
            }
        }
    
    }
  • 相关阅读:
    Error_OAF_the descriptive flexfield with application name payables and name is not frozen
    Error_OAF_Flex VO() of flex bean (ExpenseDescFlexs) is null (异常)
    AME_Oracle自带AME审批链详解AME Standard Handler(概念)
    PS_Form个性化复杂需求新增Menu并调用Request(案例)
    PS_Form个性化选择Block自动查询和查询条件排序实现(案例)
    Error_Unix Shell_syntax error near unexpected token `fi'
    PLSQL_性能优化效能跟踪工具DBMS_PROFILER分析(案例)
    Workflow_工作流的基本元素(概念)
    Form_如何通过标准功能查找数据源(概念)
    Report_SRW工具的基本用法(概念)
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/3027966.html
Copyright © 2020-2023  润新知