1: <?php
2: /**
3: * CEmailLogRoute class file.
4: *
5: * @author Qiang Xue <qiang.xue@gmail.com>
6: * @link http://www.yiiframework.com/
7: * @copyright 2008-2013 Yii Software LLC
8: * @license http://www.yiiframework.com/license/
9: */
10:
11: /**
12: * CEmailLogRoute sends selected log messages to email addresses.
13: *
14: * The target email addresses may be specified via {@link setEmails emails} property.
15: * Optionally, you may set the email {@link setSubject subject}, the
16: * {@link setSentFrom sentFrom} address and any additional {@link setHeaders headers}.
17: *
18: * @property array $emails List of destination email addresses.
19: * @property string $subject Email subject. Defaults to CEmailLogRoute::DEFAULT_SUBJECT.
20: * @property string $sentFrom Send from address of the email.
21: * @property array $headers Additional headers to use when sending an email.
22: *
23: * @author Qiang Xue <qiang.xue@gmail.com>
24: * @package system.logging
25: * @since 1.0
26: */
27: class CEmailLogRoute extends CLogRoute
28: {
29: /**
30: * @var boolean set this property to true value in case log data you're going to send through emails contains
31: * non-latin or UTF-8 characters. Emails would be UTF-8 encoded.
32: * @since 1.1.13
33: */
34: public $utf8=false;
35: /**
36: * @var array list of destination email addresses.
37: */
38: private $_email=array();
39: /**
40: * @var string email subject
41: */
42: private $_subject;
43: /**
44: * @var string email sent from address
45: */
46: private $_from;
47: /**
48: * @var array list of additional headers to use when sending an email.
49: */
50: private $_headers=array();
51:
52: /**
53: * Sends log messages to specified email addresses.
54: * @param array $logs list of log messages
55: */
56: protected function processLogs($logs)
57: {
58: $message='';
59: foreach($logs as $log)
60: $message.=$this->formatLogMessage($log[0],$log[1],$log[2],$log[3]);
61: $message=wordwrap($message,70);
62: $subject=$this->getSubject();
63: if($subject===null)
64: $subject=Yii::t('yii','Application Log');
65: foreach($this->getEmails() as $email)
66: $this->sendEmail($email,$subject,$message);
67: }
68:
69: /**
70: * Sends an email.
71: * @param string $email single email address
72: * @param string $subject email subject
73: * @param string $message email content
74: */
75: protected function sendEmail($email,$subject,$message)
76: {
77: $headers=$this->getHeaders();
78: if($this->utf8)
79: {
80: $headers[]="MIME-Version: 1.0";
81: $headers[]="Content-Type: text/plain; charset=UTF-8";
82: $subject='=?UTF-8?B?'.base64_encode($subject).'?=';
83: }
84: if(($from=$this->getSentFrom())!==null)
85: {
86: $matches=array();
87: preg_match_all('/([^<]*)<([^>]*)>/iu',$from,$matches);
88: if(isset($matches[1][0],$matches[2][0]))
89: {
90: $name=$this->utf8 ? '=?UTF-8?B?'.base64_encode(trim($matches[1][0])).'?=' : trim($matches[1][0]);
91: $from=trim($matches[2][0]);
92: $headers[]="From: {$name} <{$from}>";
93: }
94: else
95: $headers[]="From: {$from}";
96: $headers[]="Reply-To: {$from}";
97: }
98: mail($email,$subject,$message,implode("\r\n",$headers));
99: }
100:
101: /**
102: * @return array list of destination email addresses
103: */
104: public function getEmails()
105: {
106: return $this->_email;
107: }
108:
109: /**
110: * @param mixed $value list of destination email addresses. If the value is
111: * a string, it is assumed to be comma-separated email addresses.
112: */
113: public function setEmails($value)
114: {
115: if(is_array($value))
116: $this->_email=$value;
117: else
118: $this->_email=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);
119: }
120:
121: /**
122: * @return string email subject. Defaults to CEmailLogRoute::DEFAULT_SUBJECT
123: */
124: public function getSubject()
125: {
126: return $this->_subject;
127: }
128:
129: /**
130: * @param string $value email subject.
131: */
132: public function setSubject($value)
133: {
134: $this->_subject=$value;
135: }
136:
137: /**
138: * @return string send from address of the email
139: */
140: public function getSentFrom()
141: {
142: return $this->_from;
143: }
144:
145: /**
146: * @param string $value send from address of the email
147: */
148: public function setSentFrom($value)
149: {
150: $this->_from=$value;
151: }
152:
153: /**
154: * @return array additional headers to use when sending an email.
155: * @since 1.1.4
156: */
157: public function getHeaders()
158: {
159: return $this->_headers;
160: }
161:
162: /**
163: * @param mixed $value list of additional headers to use when sending an email.
164: * If the value is a string, it is assumed to be line break separated headers.
165: * @since 1.1.4
166: */
167: public function setHeaders($value)
168: {
169: if (is_array($value))
170: $this->_headers=$value;
171: else
172: $this->_headers=preg_split('/\r\n|\n/',$value,-1,PREG_SPLIT_NO_EMPTY);
173: }
174: }