1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
16:
17: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
18:
19:
20:
21: require_once 'swiftmailer/lib/swift_init.php';
22:
23: 24: 25: 26: 27: 28:
29: class cMailer extends Swift_Mailer {
30:
31: 32: 33: 34: 35:
36: private $_mailHost = 'localhost';
37:
38: 39: 40: 41: 42:
43: private $_mailUser = '';
44:
45: 46: 47: 48: 49:
50: private $_mailPass = '';
51:
52: 53: 54: 55: 56:
57: private $_mailEncryption = NULL;
58:
59: 60: 61: 62: 63:
64: private $_mailPort = 25;
65:
66: 67: 68: 69: 70:
71: private $_mailSender = 'noreply@contenido.org';
72:
73: 74: 75: 76: 77:
78: private $_mailSenderName = 'CONTENIDO Backend';
79:
80: 81: 82: 83: 84:
85: public function __construct($transport = NULL) {
86:
87: $mailSender = getSystemProperty('system', 'mail_sender');
88: if (Swift_Validate::email($mailSender)) {
89: $this->_mailSender = $mailSender;
90: }
91:
92:
93: $mailSenderName = getSystemProperty('system', 'mail_sender_name');
94: if (!empty($mailSenderName)) {
95: $this->_mailSenderName = $mailSenderName;
96: }
97:
98:
99: if (!is_null($transport)) {
100: parent::__construct($transport);
101: return;
102: }
103:
104:
105:
106:
107: $mailHost = getSystemProperty('system', 'mail_host');
108: if (!empty($mailHost)) {
109: $this->_mailHost = $mailHost;
110: }
111:
112:
113: $this->_mailUser = (getSystemProperty('system', 'mail_user')) ? getSystemProperty('system', 'mail_user') : '';
114: $this->_mailPass = (getSystemProperty('system', 'mail_pass')) ? getSystemProperty('system', 'mail_pass') : '';
115:
116:
117: $encryptions = array(
118: 'tls',
119: 'ssl'
120: );
121: $mail_encryption = strtolower(getSystemProperty('system', 'mail_encryption'));
122: if (in_array($mail_encryption, $encryptions)) {
123: $this->_mailEncryption = $mail_encryption;
124: } elseif ('1' == $mail_encryption) {
125: $this->_mailEncryption = 'ssl';
126: } else {
127: $this->_mailEncryption = 'tls';
128: }
129:
130:
131: if (is_numeric(getSystemProperty('system', 'mail_port'))) {
132: $this->_mailPort = (int) getSystemProperty('system', 'mail_port');
133: }
134:
135:
136: $transport = self::constructTransport($this->_mailHost, $this->_mailPort, $this->_mailEncryption, $this->_mailUser, $this->_mailPass);
137: parent::__construct($transport);
138: }
139:
140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151:
152: public static function constructTransport($mailHost, $mailPort, $mailEncryption = NULL, $mailUser = NULL, $mailPass = NULL) {
153:
154: $transport = Swift_SmtpTransport::newInstance($mailHost, $mailPort, $mailEncryption);
155: if (!empty($mailUser)) {
156: $authHandler = new Swift_Transport_Esmtp_AuthHandler(array(
157: new Swift_Transport_Esmtp_Auth_PlainAuthenticator(),
158: new Swift_Transport_Esmtp_Auth_LoginAuthenticator(),
159: new Swift_Transport_Esmtp_Auth_CramMd5Authenticator()
160: ));
161: $authHandler->setUsername($mailUser);
162: if (!empty($mailPass)) {
163: $authHandler->setPassword($mailPass);
164: }
165: $transport->setExtensionHandlers(array(
166: $authHandler
167: ));
168: }
169:
170:
171: try {
172: $transport->start();
173: } catch (Swift_TransportException $e) {
174:
175: $transport = Swift_MailTransport::newInstance();
176: }
177:
178: return $transport;
179: }
180:
181: 182: 183: 184: 185: 186:
187: public function setCharset($charset) {
188: Swift_Preferences::getInstance()->setCharset($charset);
189: }
190:
191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210:
211: public function sendMail($from, $to, $subject, $body = '', $cc = NULL, $bcc = NULL, $replyTo = NULL, $resend = false, $contentType = 'text/plain') {
212: $message = Swift_Message::newInstance($subject, $body, $contentType);
213: if (empty($from) || is_array($from) && count($from) > 1) {
214: $message->setFrom(array(
215: $this->_mailSender => $this->_mailSenderName
216: ));
217: } else {
218: $message->setFrom($from);
219: }
220: $message->setTo($to);
221: $message->setCc($cc);
222: $message->setBcc($bcc);
223: $message->setReplyTo($replyTo);
224: $failedRecipients = array();
225:
226: return $this->send($message, $failedRecipients, $resend);
227: }
228:
229: 230: 231: 232: 233: 234: 235: 236: 237:
238: public function send(Swift_Mime_Message $message, &$failedRecipients = NULL, $resend = false) {
239: if (!is_array($failedRecipients)) {
240: $failedRecipients = array();
241: }
242: $result = parent::send($message, $failedRecipients);
243:
244:
245: if (!$resend) {
246: $this->_logMail($message, $failedRecipients);
247: }
248:
249: return $result;
250: }
251:
252: 253: 254: 255: 256: 257: 258:
259: public function resendMail($idmailsuccess) {
260: $mailLogSuccess = new cApiMailLogSuccess($idmailsuccess);
261: if (!$mailLogSuccess->isLoaded() || $mailLogSuccess->get('success') == 1) {
262: throw new cInvalidArgumentException('The mail which should be resent has already been sent successfully or does not exist.');
263: }
264:
265:
266: $idmail = $mailLogSuccess->get('idmail');
267: $mailLog = new cApiMailLog($idmail);
268: $from = json_decode($mailLog->get('from'), true);
269: $to = json_decode($mailLog->get('to'), true);
270: $replyTo = json_decode($mailLog->get('reply_to'), true);
271: $cc = json_decode($mailLog->get('cc'), true);
272: $bcc = json_decode($mailLog->get('bcc'), true);
273: $subject = $mailLog->get('subject');
274: $body = $mailLog->get('body');
275: $contentType = $mailLog->get('content_type');
276: $this->setCharset($mailLog->get('charset'));
277:
278:
279: $charset = $mailLog->get('charset');
280: $from = $this->decodeField($from, $charset);
281: $to = $this->decodeField($to, $charset);
282: $replyTo = $this->decodeField($replyTo, $charset);
283: $cc = $this->decodeField($cc, $charset);
284: $bcc = $this->decodeField($bcc, $charset);
285: $subject = $this->decodeField($subject, $charset);
286: $body = $this->decodeField($body, $charset);
287:
288: $success = $this->sendMail($from, $to, $subject, $body, $cc, $bcc, $replyTo, true, $contentType);
289:
290: if ($success) {
291: $mailLogSuccess->set('success', 1);
292: $mailLogSuccess->store();
293: }
294: }
295:
296: 297: 298: 299: 300: 301: 302:
303: private function encodeField($value, $charset) {
304: if (is_array($value)) {
305: for ($i = 0; $i < count($value); $i++) {
306: if (!empty($value[$i])) {
307: $value[$i] = conHtmlEntities($value[$i], ENT_COMPAT, $charset, false);
308: }
309: }
310: return $value;
311: } else if (is_string($value)) {
312: return conHtmlentities($value, ENT_COMPAT, $charset, false);
313: }
314: return $value;
315: }
316:
317: 318: 319: 320: 321: 322: 323:
324: private function decodeField($value, $charset) {
325: if (is_array($value)) {
326: for ($i = 0; $i < count($value); $i++) {
327: if (!empty($value[$i])) {
328: $value[$i] = conHtmlEntityDecode($value[$i], ENT_COMPAT | ENT_HTML401, $charset, false);
329: }
330: }
331: } else if (is_string($value)) {
332: return conHtmlEntityDecode($value, ENT_COMPAT | ENT_HTML401, $charset);
333: }
334: return $value;
335: }
336:
337: 338: 339: 340: 341: 342: 343: 344:
345: private function _logMail(Swift_Mime_Message $message, array $failedRecipients = array()) {
346: $mailLogCollection = new cApiMailLogCollection();
347:
348:
349: $charset = $message->getCharset();
350: $from = $this->encodeField($message->getFrom(), $charset);
351: $to = $this->encodeField($message->getTo(), $charset);
352: $replyTo = $this->encodeField($message->getReplyTo(), $charset);
353: $cc = $this->encodeField($message->getCc(), $charset);
354: $bcc = $this->encodeField($message->getBcc(), $charset);
355: $subject = $this->encodeField($message->getSubject(), $charset);
356: $body = $this->encodeField($message->getBody(), $charset);
357: $contentType = $message->getContentType();
358: $idmail = $mailLogCollection->create($from, $to, $replyTo, $cc, $bcc, $subject, $body, time(), $charset, $contentType);
359:
360:
361:
362: $recipientArrays = array(
363: $message->getTo(),
364: $message->getCc(),
365: $message->getBcc()
366: );
367: $mailLogSuccessCollection = new cApiMailLogSuccessCollection();
368: foreach ($recipientArrays as $recipients) {
369: if (!is_array($recipients)) {
370: continue;
371: }
372: foreach ($recipients as $key => $value) {
373: $recipient = array(
374: $key => $value
375: );
376: $success = true;
377:
378:
379:
380: $exception = '';
381: if (in_array($key, $failedRecipients)) {
382: $success = false;
383: }
384: $mailLogSuccessCollection->create($idmail, $recipient, $success, $exception);
385: }
386: }
387:
388: return $idmail;
389: }
390:
391: }
392: