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

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

feature 3046: Add option "force_fallback" to load_language + clean code

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