source: trunk/include/functions_mail.inc.php @ 25358

Last change on this file since 25358 was 25358, checked in by mistic100, 10 years ago

feature feature 2995: New email template
improve mail cache system
fix font-size in Thunderbird

  • Property svn:eol-style set to LF
File size: 21.7 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24/**
25 * Returns the name of the mail sender
26 * @return string
27 */
28function get_mail_sender_name()
29{
30  global $conf;
31
32  return (empty($conf['mail_sender_name']) ? $conf['gallery_title'] : $conf['mail_sender_name']);
33}
34
35/**
36 * Returns the email of the mail sender
37 * @since 2.6
38 * @return string
39 */
40function get_mail_sender_email()
41{
42  global $conf;
43
44  return (empty($conf['mail_sender_email']) ? get_webmaster_mail_address() : $conf['mail_sender_email']);
45}
46
47/**
48 * Returns an array of mail configuration parameters :
49 * - send_bcc_mail_webmaster
50 * - mail_allow_html
51 * - use_smtp
52 * - smtp_host
53 * - smtp_user
54 * - smtp_password
55 * - smtp_secure
56 * - email_webmaster
57 * - name_webmaster
58 *
59 * @return array
60 */
61function get_mail_configuration()
62{
63  global $conf;
64
65  $conf_mail = array(
66    'send_bcc_mail_webmaster' => $conf['send_bcc_mail_webmaster'],
67    'mail_allow_html' => $conf['mail_allow_html'],
68    'mail_theme' => $conf['mail_theme'],
69    'use_smtp' => !empty($conf['smtp_host']),
70    'smtp_host' => $conf['smtp_host'],
71    'smtp_user' => $conf['smtp_user'],
72    'smtp_password' => $conf['smtp_password'],
73    'smtp_secure' => $conf['smtp_secure'],
74    'email_webmaster' => get_mail_sender_email(),
75    'name_webmaster' => get_mail_sender_name(),
76    );
77
78  return $conf_mail;
79}
80
81/**
82 * Returns an email address with an associated real name
83 * @param string name
84 * @param string email
85 */
86function format_email($name, $email)
87{
88  $cvt_email = trim(preg_replace('#[\n\r]+#s', '', $email));
89  $cvt_name = trim(preg_replace('#[\n\r]+#s', '', $name));
90
91  if ($cvt_name!="")
92  {
93    $cvt_name = '"'.addcslashes($cvt_name,'"').'"'.' ';
94  }
95
96  if (strpos($cvt_email, '<') === false)
97  {
98    return $cvt_name.'<'.$cvt_email.'>';
99  }
100  else
101  {
102    return $cvt_name.$cvt_email;
103  }
104}
105
106/**
107 * Returns the mail and the name from a formatted address
108 * @since 2.6
109 * @param string|array $input
110 * @return array
111 */
112function unformat_email($input)
113{
114  if (is_array($input))
115  {
116    return $input;
117  }
118
119  if (preg_match('/(.*)<(.*)>.*/', $input, $matches))
120  {
121    return array(
122      'email' => trim($matches[2]),
123      'name' => trim($matches[1]),
124      );
125  }
126  else
127  {
128    return array(
129      'email' => trim($input),
130      'name' => '',
131      );
132  }
133}
134 
135
136/**
137 * Returns an email address list with minimal email string
138 * @param string $email_list - comma separated
139 * @return string
140 */
141function get_strict_email_list($email_list)
142{
143  $result = array();
144  $list = explode(',', $email_list);
145
146  foreach ($list as $email)
147  {
148    if (strpos($email, '<') !== false)
149    {
150       $email = preg_replace('/.*<(.*)>.*/i', '$1', $email);
151    }
152    $result[] = trim($email);
153  }
154
155  return implode(',', array_unique($result));
156}
157
158
159/**
160 * Return an new mail template
161 * @param string $email_format - text/html or text/plain
162 * @return Template
163 */
164function &get_mail_template($email_format)
165{
166  $template = new Template(PHPWG_ROOT_PATH.'themes', 'default', 'template/mail/'.$email_format);
167  return $template;
168}
169
170/**
171 * Switch language to specified language
172 * All entries are push on language stack
173 * @param string $language
174 */
175function switch_lang_to($language)
176{
177  global $switch_lang, $user, $lang, $lang_info, $language_files;
178
179  // explanation of switch_lang
180  // $switch_lang['language'] contains data of language
181  // $switch_lang['stack'] contains stack LIFO
182  // $switch_lang['initialisation'] allow to know if it's first call
183
184  // Treatment with current user
185  // Language of current user is saved (it's considered OK on firt call)
186  if (!isset($switch_lang['initialisation']) and !isset($switch_lang['language'][$user['language']]))
187  {
188    $switch_lang['initialisation'] = true;
189    $switch_lang['language'][$user['language']]['lang_info'] = $lang_info;
190    $switch_lang['language'][$user['language']]['lang'] = $lang;
191  }
192
193  // Change current infos
194  $switch_lang['stack'][] = $user['language'];
195  $user['language'] = $language;
196
197  // Load new data if necessary
198  if (!isset($switch_lang['language'][$language]))
199  {
200    // Re-Init language arrays
201    $lang_info = array();
202    $lang  = array();
203
204    // language files
205    load_language('common.lang', '', array('language'=>$language) );
206    // No test admin because script is checked admin (user selected no)
207    // Translations are in admin file too
208    load_language('admin.lang', '', array('language'=>$language) );
209   
210    // Reload all plugins files (see load_language declaration)
211    if (!empty($language_files))
212    {
213      foreach ($language_files as $dirname => $files)
214        foreach ($files as $filename)
215          load_language($filename, $dirname, array('language'=>$language) );
216    }
217   
218    trigger_action('loading_lang');
219    load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR,
220      array('language'=>$language, 'no_fallback'=>true, 'local'=>true)
221    );
222
223    $switch_lang['language'][$language]['lang_info'] = $lang_info;
224    $switch_lang['language'][$language]['lang'] = $lang;
225  }
226  else
227  {
228    $lang_info = $switch_lang['language'][$language]['lang_info'];
229    $lang = $switch_lang['language'][$language]['lang'];
230  }
231}
232
233/**
234 * Switch back language pushed with switch_lang_to function
235 */
236function switch_lang_back()
237{
238  global $switch_lang, $user, $lang, $lang_info;
239
240  if (count($switch_lang['stack']) > 0)
241  {
242    // Get last value
243    $language = array_pop($switch_lang['stack']);
244
245    // Change current infos
246    if (isset($switch_lang['language'][$language]))
247    {
248      $lang_info = $switch_lang['language'][$language]['lang_info'];
249      $lang = $switch_lang['language'][$language]['lang'];
250    }
251    $user['language'] = $language;
252  }
253}
254
255/**
256 * Send a notification email to all administrators
257 * current user (if admin) is not notified
258 * @param string $subject
259 * @param string $content
260 * @param boolean $send_technical_details - send user IP and browser
261 * @return boolean
262 */
263function pwg_mail_notification_admins($subject, $content, $send_technical_details=true)
264{
265  if (empty($subject) or empty($content))
266  {
267    return false;
268  }
269 
270  // for backward compatibility < 2.6
271  if (is_array($subject))
272  {
273    $subject = l10n_args($subject);
274  }
275  if (is_array($content))
276  {
277    $content = l10n_args($content);
278  }
279
280  global $conf, $user;
281 
282  $tpl_vars = array();
283  if ($send_technical_details)
284  {
285    $tpl_vars['TECHNICAL'] = 
286      l10n('Connected user: %s', stripslashes($user['username'])) ."\n".
287      l10n('IP: %s', $_SERVER['REMOTE_ADDR']) . "\n" .
288      l10n('Browser: %s', $_SERVER['HTTP_USER_AGENT']);
289  }
290
291  return pwg_mail_admins(
292    array(
293      'subject' => '['. $conf['gallery_title'] .'] '. $subject,
294      'mail_title' => $conf['gallery_title'],
295      'mail_subtitle' => $subject,
296      'content' => $content,
297      'content_format' => 'text/plain',
298      ),
299    array(
300      'filename' => 'notification_admin',
301      'assign' => $tpl_vars,
302      )
303    );
304}
305
306/**
307 * Send a email to all administrators
308 * current user (if admin) is excluded
309 * @see pwg_mail()
310 * @since 2.6
311 *
312 * @param array $args - as in pwg_mail()
313 * @param array $tpl - as in pwg_mail()
314 * @return boolean
315 */
316function pwg_mail_admins($args=array(), $tpl=array())
317{
318  if (empty($args['content']) and empty($tpl))
319  {
320    return false;
321  }
322
323  global $conf, $user;
324  $return = true;
325
326  // get admins (except ourself)
327  $query = '
328SELECT
329    u.'.$conf['user_fields']['username'].' AS name,
330    u.'.$conf['user_fields']['email'].' AS email
331  FROM '.USERS_TABLE.' AS u
332    JOIN '.USER_INFOS_TABLE.' AS i
333    ON i.user_id =  u.'.$conf['user_fields']['id'].'
334  WHERE i.status in (\'webmaster\',  \'admin\')
335    AND u.'.$conf['user_fields']['email'].' IS NOT NULL
336    AND i.user_id <> '.$user['id'].'
337  ORDER BY username
338;';
339  $admins = array_from_query($query);
340
341  if (empty($admins))
342  {
343    return $return;
344  }
345
346  switch_lang_to(get_default_language());
347
348  $return = pwg_mail($admins, $args, $tpl);
349
350  switch_lang_back();
351
352  return $return;
353}
354
355/**
356 * Send an email to a group
357 * @see pwg_mail()
358 *
359 * @param int $group_id
360 * @param array $args - as in pwg_mail()
361 *    @option string language_selected - filters users of the group by language
362 * @param array $tpl - as in pwg_mail()
363 * @return boolean
364 */
365function pwg_mail_group($group_id, $args=array(), $tpl=array())
366{ 
367  if (empty($group_id) or ( empty($args['content']) and empty($tpl) ))
368  {
369    return false;
370  }
371
372  global $conf;
373  $return = true;
374
375  // get distinct languages of targeted users
376  $query = '
377SELECT DISTINCT language
378  FROM '.USER_GROUP_TABLE.' AS ug
379    INNER JOIN '.USERS_TABLE.' AS u
380    ON '.$conf['user_fields']['id'].' = ug.user_id
381    INNER JOIN '.USER_INFOS_TABLE.' AS ui
382    ON ui.user_id = ug.user_id
383  WHERE group_id = '.$group_id.'
384    AND '.$conf['user_fields']['email'].' <> ""';
385  if (!empty($args['language_selected']))
386  {
387    $query .= '
388    AND language = \''.$args['language_selected'].'\'';
389  }
390
391    $query .= '
392;';
393  $languages = array_from_query($query, 'language');
394
395  if (empty($languages))
396  {
397    return $return;
398  }
399
400  foreach ($languages as $language)
401  {
402    // get subset of users in this group for a specific language
403    $query = '
404SELECT
405    u.'.$conf['user_fields']['username'].' AS name,
406    u.'.$conf['user_fields']['email'].' AS email
407  FROM '.USER_GROUP_TABLE.' AS ug
408    INNER JOIN '.USERS_TABLE.' AS u
409    ON '.$conf['user_fields']['id'].' = ug.user_id
410    INNER JOIN '.USER_INFOS_TABLE.' AS ui
411    ON ui.user_id = ug.user_id
412  WHERE group_id = '.$group_id.'
413    AND '.$conf['user_fields']['email'].' <> ""
414    AND language = \''.$language.'\'
415;';
416    $users = array_from_query($query);
417
418    if (empty($users))
419    {
420      continue;
421    }
422
423    switch_lang_to($language);
424
425    $return&= pwg_mail(null,
426      array_merge(
427        $args,
428        array('Bcc' => $users)
429        ),
430      $tpl
431      );
432
433    switch_lang_back();
434  }
435
436  return $return;
437}
438
439/**
440 * sends an email, using Piwigo specific informations
441 *
442 * @param string|string[] $to
443 * @param array $args
444 *       o from: sender [default value webmaster email]
445 *       o Cc: array of carbon copy receivers of the mail. [default value empty]
446 *       o Bcc: array of blind carbon copy receivers of the mail. [default value empty]
447 *       o subject [default value 'Piwigo']
448 *       o content: content of mail [default value '']
449 *       o content_format: format of mail content [default value 'text/plain']
450 *       o email_format: global mail format [default value $conf_mail['default_email_format']]
451 *       o theme: theme to use [default value $conf_mail['mail_theme']]
452 *       o mail_title: main title of the mail [default value $conf['gallery_title']]
453 *       o mail_subtitle: subtitle of the mail [default value subject]
454 * @param array $tpl - use these options to define a custom content template file
455 *       o filename
456 *       o dirname (optional)
457 *       o assign (optional)
458 *
459 * @return boolean
460 */
461function pwg_mail($to, $args=array(), $tpl=array())
462{
463  global $conf, $conf_mail, $lang_info, $page;
464
465  if (empty($to) and empty($args['Cc']) and empty($args['Bcc']))
466  {
467    return true;
468  }
469
470  if (!isset($conf_mail))
471  {
472    $conf_mail = get_mail_configuration();
473  }
474
475  include_once(PHPWG_ROOT_PATH.'include/phpmailer/class.phpmailer.php');
476
477  $mail = new PHPMailer;
478
479  $recipients = !is_array($to) ? explode(',', $to) : $to;
480  foreach ($recipients as $recipient)
481  {
482    $recipient = unformat_email($recipient);
483    $mail->addAddress($recipient['email'], $recipient['name']);
484  }
485
486  $mail->WordWrap = 76;
487  $mail->CharSet = 'UTF-8';
488 
489  // Compute root_path in order have complete path
490  set_make_full_url();
491
492  if (empty($args['from']))
493  {
494    $from = array(
495      'email' => $conf_mail['email_webmaster'],
496      'name' => $conf_mail['name_webmaster'],
497      );
498  }
499  else
500  {
501    $from = unformat_email($args['from']);
502  }
503  $mail->setFrom($from['email'], $from['name']);
504  $mail->addReplyTo($from['email'], $from['name']);
505
506  // Subject
507  if (empty($args['subject']))
508  {
509    $args['subject'] = 'Piwigo';
510  }
511  $args['subject'] = trim(preg_replace('#[\n\r]+#s', '', $args['subject']));
512  $mail->Subject = $args['subject'];
513
514  // Cc
515  if (!empty($args['Cc']))
516  {
517    foreach ($args['Cc'] as $cc)
518    {
519      $cc = unformat_email($cc);
520      $mail->addCC($cc['email'], $cc['name']);
521    }
522  }
523
524  // Bcc
525  if ($conf_mail['send_bcc_mail_webmaster'])
526  {
527    $args['Bcc'][] = get_webmaster_mail_address();
528  }
529  if (!empty($args['Bcc']))
530  {
531    foreach ($args['Bcc'] as $bcc)
532    {
533      $bcc = unformat_email($bcc);
534      $mail->addBCC($bcc['email'], $bcc['name']);
535    }
536  }
537
538  // theme
539  if (empty($args['theme']) or !in_array($args['theme'], array('clear','dark')))
540  {
541    $args['theme'] = $conf_mail['mail_theme'];
542  }
543
544  // content
545  if (!isset($args['content']))
546  {
547    $args['content'] = '';
548  }
549 
550  // try to decompose subject like "[....] ...."
551  if (!isset($args['mail_title']) and !isset($args['mail_subtitle']))
552  {
553    if (preg_match('#^\[(.*)\](.*)$#',  $args['subject'], $matches))
554    {
555      $args['mail_title'] = $matches[1];
556      $args['mail_subtitle'] = $matches[2];
557    }
558  }
559  if (!isset($args['mail_title']))
560  {
561    $args['mail_title'] = $conf['gallery_title'];
562  }
563  if (!isset($args['mail_subtitle']))
564  {
565    $args['mail_subtitle'] = $args['subject'];
566  }
567
568  // content type
569  if (empty($args['content_format']))
570  {
571    $args['content_format'] = 'text/plain';
572  }
573
574  $content_type_list = array();
575  if ($conf_mail['mail_allow_html'] and @$args['email_format'] != 'text/plain')
576  {
577    $content_type_list[] = 'text/html';
578  }
579  $content_type_list[] = 'text/plain';
580
581  $contents = array();
582  foreach ($content_type_list as $content_type)
583  {
584    // key compose of indexes witch allow to cache mail data
585    $cache_key = $content_type.'-'.$lang_info['code'];
586
587    if (!isset($conf_mail[$cache_key]))
588    {
589      // instanciate a new Template
590      if (!isset($conf_mail[$cache_key]['theme']))
591      {
592        $conf_mail[$cache_key]['theme'] = get_mail_template($content_type);
593        trigger_action('before_parse_mail_template', $cache_key, $content_type);
594      }
595      $template = &$conf_mail[$cache_key]['theme'];
596
597      $template->set_filename('mail_header', 'header.tpl');
598      $template->set_filename('mail_footer', 'footer.tpl');
599
600      $template->assign(
601        array(
602          'GALLERY_URL' => get_gallery_home_url(),
603          'GALLERY_TITLE' => isset($page['gallery_title']) ? $page['gallery_title'] : $conf['gallery_title'],
604          'VERSION' => $conf['show_version'] ? PHPWG_VERSION : '',
605          'PHPWG_URL' => defined('PHPWG_URL') ? PHPWG_URL : '',
606          'CONTENT_ENCODING' => get_pwg_charset(),
607          'CONTACT_MAIL' => $conf_mail['email_webmaster'],
608          )
609        );
610
611      if ($content_type == 'text/html')
612      {
613        if ($template->smarty->template_exists('global-mail-css.tpl'))
614        {
615          $template->set_filename('css', 'global-mail-css.tpl');
616          $template->assign_var_from_handle('GLOBAL_MAIL_CSS', 'css');
617        }
618
619        if ($template->smarty->template_exists('mail-css-'. $args['theme'] .'.tpl'))
620        {
621          $template->set_filename('css', 'mail-css-'. $args['theme'] .'.tpl');
622          $template->assign_var_from_handle('MAIL_CSS', 'css');
623        }
624      }
625    }
626   
627    $template = &$conf_mail[$cache_key]['theme'];
628    $template->assign(
629      array(
630        'MAIL_TITLE' => $args['mail_title'],
631        'MAIL_SUBTITLE' => $args['mail_subtitle'],
632        )
633      );
634
635    // Header
636    $contents[$content_type] = $template->parse('mail_header', true);
637
638    // Content
639    // Stored in a temp variable, if a content template is used it will be assigned
640    // to the $CONTENT template variable, otherwise it will be appened to the mail
641    if ($args['content_format'] == 'text/plain' and $content_type == 'text/html')
642    {
643      // convert plain text to html
644      $mail_content =
645        '<p>'.
646        nl2br(
647          preg_replace(
648            '/(https?:\/\/([-\w\.]+[-\w])+(:\d+)?(\/([\w\/_\.\#-]*(\?\S+)?[^\.\s])?)?)/i',
649            '<a href="$1">$1</a>',
650            htmlspecialchars($args['content'])
651            )
652          ).
653        '</p>';
654    }
655    else if ($args['content_format'] == 'text/html' and $content_type == 'text/plain')
656    {
657      // convert html text to plain text
658      $mail_content = strip_tags($args['content']);
659    }
660    else
661    {
662      $mail_content = $args['content'];
663    }
664
665    // Runtime template
666    if (isset($tpl['filename']))
667    {
668      if (isset($tpl['dirname']))
669      {
670        $template->set_template_dir($tpl['dirname'] .'/'. $content_type);
671      }
672      if ($template->smarty->template_exists($tpl['filename'] .'.tpl'))
673      {
674        $template->set_filename($tpl['filename'], $tpl['filename'] .'.tpl');
675        if (!empty($tpl['assign']))
676        {
677          $template->assign($tpl['assign']);
678        }
679        $template->assign('CONTENT', $mail_content);
680        $contents[$content_type].= $template->parse($tpl['filename'], true);
681      }
682      else
683      {
684        $contents[$content_type].= $mail_content;
685      }
686    }
687    else
688    {
689      $contents[$content_type].= $mail_content;
690    }
691
692    // Footer
693    $contents[$content_type].= $template->parse('mail_footer', true);
694  }
695
696  // Undo Compute root_path in order have complete path
697  unset_make_full_url();
698
699  // Send content to PHPMailer
700  if (isset($contents['text/html']))
701  {
702    $mail->isHTML(true);
703    $mail->Body = move_css_to_body($contents['text/html']);
704   
705    if (isset($contents['text/plain']))
706    {
707      $mail->AltBody = $contents['text/plain'];
708    }
709  }
710  else
711  {
712    $mail->isHTML(false);
713    $mail->Body = $contents['text/plain'];
714  }
715
716  if ($conf_mail['use_smtp'])
717  {
718    // now we need to split port number
719    if (strpos($conf_mail['smtp_host'], ':') !== false)
720    {
721      list($smtp_host, $smtp_port) = explode(':', $conf_mail['smtp_host']);
722    }
723    else
724    {
725      $smtp_host = $conf_mail['smtp_host'];
726      $smtp_port = 25;
727    }
728
729    $mail->IsSMTP();
730
731    // enables SMTP debug information (for testing) 2 - debug, 0 - no message
732    $mail->SMTPDebug = 0;
733   
734    $mail->Host = $smtp_host;
735    $mail->Port = $smtp_port;
736
737    if (!empty($conf_mail['smtp_secure']) and in_array($conf_mail['smtp_secure'], array('ssl', 'tls')))
738    {
739      $mail->SMTPSecure = $conf_mail['smtp_secure'];
740    }
741   
742    if (!empty($conf_mail['smtp_user']))
743    {
744      $mail->SMTPAuth = true;
745      $mail->Username = $conf_mail['smtp_user'];
746      $mail->Password = $conf_mail['smtp_password'];
747    }
748  }
749
750  $ret = true;
751  $pre_result = trigger_event('before_send_mail', true, $to, $args, $mail);
752
753  if ($pre_result)
754  {
755    $ret = $mail->send();
756    if (!$ret and is_admin())
757    {
758      trigger_error('Mailer Error: ' . $mail->ErrorInfo, E_USER_WARNING);
759    }
760  }
761
762  return $ret;
763}
764
765/**
766 * @deprecated 2.6
767 */
768function pwg_send_mail($result, $to, $subject, $content, $headers)
769{
770  if (is_admin())
771  {
772    trigger_error('pwg_send_mail function is deprecated', E_USER_NOTICE);
773  }
774 
775  if (!$result)
776  {
777    return pwg_mail($to, array(
778        'content' => $content,
779        'subject' => $subject,
780      ));
781  }
782  else
783  {
784    return $result;
785  }
786}
787
788/**
789 * Moves CSS rules contained in the <style> tag to inline CSS
790 * (for compatibility with Gmail and such clients)
791 * @since 2.6
792 * @param string $content
793 * @return string
794 */
795function move_css_to_body($content)
796{
797  include_once(PHPWG_ROOT_PATH.'include/emogrifier.class.php');
798
799  $e = new Emogrifier($content);
800  // $e->preserveStyleTag = true;
801  return $e->emogrify();
802}
803
804/**
805 * Saves a copy of the mail if _data/tmp
806 * @param boolean $result
807 * @param string $to
808 * @param array $args
809 * @param PHPMailer $mail
810 * @return boolean $result
811 */
812function pwg_send_mail_test($result, $to, $args, $mail)
813{
814  global $conf, $user, $lang_info;
815 
816  $dir = PHPWG_ROOT_PATH.$conf['data_location'].'tmp';
817  if (mkgetdir($dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR))
818  {
819    $filename = $dir.'/mail.'.stripslashes($user['username']).'.'.$lang_info['code'].'.'.$args['theme'].'-'.date('YmdHis');
820    if ($args['content_format'] == 'text/plain')
821    {
822      $filename .= '.txt';
823    }
824    else
825    {
826      $filename .= '.html';
827    }
828   
829    $file = fopen($filename, 'w+');
830    fwrite($file, implode(', ', $to) ."\n");
831    fwrite($file, $mail->Subject ."\n");
832    fwrite($file, $mail->createHeader() ."\n");
833    fwrite($file, $mail->createBody());
834    fclose($file);
835  }
836 
837  return $result;
838}
839
840if ($conf['debug_mail'])
841{
842  add_event_handler('before_send_mail', 'pwg_send_mail_test', EVENT_HANDLER_PRIORITY_NEUTRAL+10, 4);
843}
844
845trigger_action('functions_mail_included');
846
847?>
Note: See TracBrowser for help on using the repository browser.