Source of file Mail.php
Size: 7,110 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Log/Writer/Mail.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Log\Writer; use Traversable; use Zend\Log\Exception; use Zend\Log\Formatter\Simple as SimpleFormatter; use Zend\Mail\Message as MailMessage; use Zend\Mail\Transport; use Zend\Mail\Transport\Exception as TransportException; /** * Class used for writing log messages to email via Zend\Mail. * * Allows for emailing log messages at and above a certain level via a * Zend\Mail\Message object. Note that this class only sends the email upon * completion, so any log entries accumulated are sent in a single email. * The email is sent using a Zend\Mail\Transport\TransportInterface object * (Sendmail is default). */ class Mail extends AbstractWriter { /** * Array of formatted events to include in message body. * * @var array */ protected $eventsToMail = array(); /** * Mail message instance to use * * @var MailMessage */ protected $mail; /** * Mail transport instance to use; optional. * * @var Transport\TransportInterface */ protected $transport; /** * Array keeping track of the number of entries per priority level. * * @var array */ protected $numEntriesPerPriority = array(); /** * Subject prepend text. * * Can only be used of the Zend\Mail object has not already had its * subject line set. Using this will cause the subject to have the entry * counts per-priority level appended to it. * * @var string|null */ protected $subjectPrependText; /** * Constructor * * @param MailMessage|array|Traversable $mail * @param Transport\TransportInterface $transport Optional * @throws Exception\InvalidArgumentException */ public function __construct($mail, Transport\TransportInterface $transport = null) { if ($mail instanceof Traversable) { $mail = iterator_to_array($mail); } if (is_array($mail)) { parent::__construct($mail); if (isset($mail['subject_prepend_text'])) { $this->setSubjectPrependText($mail['subject_prepend_text']); } $transport = isset($mail['transport']) ? $mail['transport'] : null; $mail = isset($mail['mail']) ? $mail['mail'] : null; } // Ensure we have a valid mail message if (!$mail instanceof MailMessage) { throw new Exception\InvalidArgumentException(sprintf( 'Mail parameter of type %s is invalid; must be of type Zend\Mail\Message', (is_object($mail) ? get_class($mail) : gettype($mail)) )); } $this->mail = $mail; // Ensure we have a valid mail transport if (null === $transport) { $transport = new Transport\Sendmail(); } if (!$transport instanceof Transport\TransportInterface) { throw new Exception\InvalidArgumentException(sprintf( 'Transport parameter of type %s is invalid; must be of type Zend\Mail\Transport\TransportInterface', (is_object($transport) ? get_class($transport) : gettype($transport)) )); } $this->setTransport($transport); if ($this->formatter === null) { $this->formatter = new SimpleFormatter(); } } /** * Set the transport message * * @param Transport\TransportInterface $transport * @return Mail */ public function setTransport(Transport\TransportInterface $transport) { $this->transport = $transport; return $this; } /** * Places event line into array of lines to be used as message body. * * @param array $event Event data */ protected function doWrite(array $event) { // Track the number of entries per priority level. if (!isset($this->numEntriesPerPriority[$event['priorityName']])) { $this->numEntriesPerPriority[$event['priorityName']] = 1; } else { $this->numEntriesPerPriority[$event['priorityName']]++; } // All plaintext events are to use the standard formatter. $this->eventsToMail[] = $this->formatter->format($event); } /** * Allows caller to have the mail subject dynamically set to contain the * entry counts per-priority level. * * Sets the text for use in the subject, with entry counts per-priority * level appended to the end. Since a Zend\Mail\Message subject can only be set * once, this method cannot be used if the Zend\Mail\Message object already has a * subject set. * * @param string $subject Subject prepend text * @return Mail */ public function setSubjectPrependText($subject) { $this->subjectPrependText = (string) $subject; return $this; } /** * Sends mail to recipient(s) if log entries are present. Note that both * plaintext and HTML portions of email are handled here. */ public function shutdown() { // If there are events to mail, use them as message body. Otherwise, // there is no mail to be sent. if (empty($this->eventsToMail)) { return; } if ($this->subjectPrependText !== null) { // Tack on the summary of entries per-priority to the subject // line and set it on the Zend\Mail object. $numEntries = $this->getFormattedNumEntriesPerPriority(); $this->mail->setSubject("{$this->subjectPrependText} ({$numEntries})"); } // Always provide events to mail as plaintext. $this->mail->setBody(implode(PHP_EOL, $this->eventsToMail)); // Finally, send the mail. If an exception occurs, convert it into a // warning-level message so we can avoid an exception thrown without a // stack frame. try { $this->transport->send($this->mail); } catch (TransportException\ExceptionInterface $e) { trigger_error( "unable to send log entries via email; " . "message = {$e->getMessage()}; " . "code = {$e->getCode()}; " . "exception class = " . get_class($e), E_USER_WARNING); } } /** * Gets a string of number of entries per-priority level that occurred, or * an empty string if none occurred. * * @return string */ protected function getFormattedNumEntriesPerPriority() { $strings = array(); foreach ($this->numEntriesPerPriority as $priority => $numEntries) { $strings[] = "{$priority}={$numEntries}"; } return implode(', ', $strings); } } |