source: tags/2.5.0/admin/include/functions_notification_by_mail.inc.php @ 26010

Last change on this file since 26010 was 19703, checked in by plg, 11 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 14.3 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/* nbm_global_var */
25$env_nbm = array
26          (
27            'start_time' => get_moment(),
28            'sendmail_timeout' => (intval(ini_get('max_execution_time')) * $conf['nbm_max_treatment_timeout_percent']),
29            'is_sendmail_timeout' => false
30          );
31
32if
33  (
34    (!isset($env_nbm['sendmail_timeout'])) or
35    (!is_numeric($env_nbm['sendmail_timeout'])) or
36    ($env_nbm['sendmail_timeout'] <= 0)
37  )
38{
39  $env_nbm['sendmail_timeout'] = $conf['nbm_treatment_timeout_default'];
40}
41
42/*
43 * Search an available check_key
44 *
45 * It's a copy of function find_available_feed_id
46 *
47 * @return string nbm identifier
48 */
49function find_available_check_key()
50{
51  while (true)
52  {
53    $key = generate_key(16);
54    $query = '
55select
56  count(*)
57from
58  '.USER_MAIL_NOTIFICATION_TABLE.'
59where
60  check_key = \''.$key.'\';';
61
62    list($count) = pwg_db_fetch_row(pwg_query($query));
63    if ($count == 0)
64    {
65      return $key;
66    }
67  }
68}
69
70/*
71 * Check sendmail timeout state
72 *
73 * @return true, if it's timeout
74 */
75function check_sendmail_timeout()
76{
77  global $env_nbm;
78
79  $env_nbm['is_sendmail_timeout'] = ((get_moment() - $env_nbm['start_time']) > $env_nbm['sendmail_timeout']);
80
81  return $env_nbm['is_sendmail_timeout'];
82}
83
84
85/*
86 * Add quote to all elements of check_key_list
87 *
88 * @return quoted check key list
89 */
90function quote_check_key_list($check_key_list = array())
91{
92  return array_map(create_function('$s', 'return \'\\\'\'.$s.\'\\\'\';'), $check_key_list);
93}
94
95/*
96 * Execute all main queries to get list of user
97 *
98 * Type are the type of list 'subscribe', 'send'
99 *
100 * return array of users
101 */
102function get_user_notifications($action, $check_key_list = array(), $enabled_filter_value = '')
103{
104  global $conf;
105
106  $data_users = array();
107
108  if (in_array($action, array('subscribe', 'send')))
109  {
110    $quoted_check_key_list = quote_check_key_list($check_key_list);
111    if (count($quoted_check_key_list) != 0 )
112    {
113      $query_and_check_key = ' and
114    check_key in ('.implode(",", $quoted_check_key_list).') ';
115    }
116    else
117    {
118      $query_and_check_key = '';
119    }
120
121    $query = '
122select
123  N.user_id,
124  N.check_key,
125  U.'.$conf['user_fields']['username'].' as username,
126  U.'.$conf['user_fields']['email'].' as mail_address,
127  N.enabled,
128  N.last_send
129from
130  '.USER_MAIL_NOTIFICATION_TABLE.' as N,
131  '.USERS_TABLE.' as U
132where
133  N.user_id =  U.'.$conf['user_fields']['id'];
134
135    if ($action == 'send')
136    {
137      // No mail empty and all users enabled
138      $query .= ' and
139  N.enabled = \'true\' and
140  U.'.$conf['user_fields']['email'].' is not null';
141    }
142
143    $query .= $query_and_check_key;
144
145    if (isset($enabled_filter_value) and ($enabled_filter_value != ''))
146    {
147      $query .= ' and
148        N.enabled = \''.boolean_to_string($enabled_filter_value).'\'';
149    }
150
151    $query .= '
152order by';
153
154    if ($action == 'send')
155    {
156      $query .= '
157  last_send, username;';
158    }
159    else
160    {
161      $query .= '
162  username;';
163    }
164
165    $query .= ';';
166
167    $result = pwg_query($query);
168    if (!empty($result))
169    {
170      while ($nbm_user = pwg_db_fetch_assoc($result))
171      {
172        array_push($data_users, $nbm_user);
173      }
174    }
175  }
176  return $data_users;
177}
178
179/*
180 * Begin of use nbm environment
181 * Prepare and save current environment and initialize data in order to send mail
182 *
183 * Return none
184 */
185function begin_users_env_nbm($is_to_send_mail = false)
186{
187  global $user, $lang, $lang_info, $conf, $env_nbm;
188
189  // Save $user, $lang_info and $lang arrays (include/user.inc.php has been executed)
190  $env_nbm['save_user'] = $user;
191  // Save current language to stack, necessary because $user change during NBM
192  switch_lang_to($user['language']);
193
194  $env_nbm['is_to_send_mail'] = $is_to_send_mail;
195
196  if ($is_to_send_mail)
197  {
198    // Init mail configuration
199    $env_nbm['email_format'] = get_str_email_format($conf['nbm_send_html_mail']);
200    $env_nbm['send_as_name'] = ((isset($conf['nbm_send_mail_as']) and !empty($conf['nbm_send_mail_as'])) ? $conf['nbm_send_mail_as'] : get_mail_sender_name());
201    $env_nbm['send_as_mail_address'] = get_webmaster_mail_address();
202    $env_nbm['send_as_mail_formated'] = format_email($env_nbm['send_as_name'], $env_nbm['send_as_mail_address']);
203    // Init mail counter
204    $env_nbm['error_on_mail_count'] = 0;
205    $env_nbm['sent_mail_count'] = 0;
206    // Save sendmail message info and error in the original language
207    $env_nbm['msg_info'] = l10n('Mail sent to %s [%s].');
208    $env_nbm['msg_error'] = l10n('Error when sending email to %s [%s].');
209  }
210}
211
212/*
213 * End of use nbm environment
214 * Restore environment
215 *
216 * Return none
217 */
218function end_users_env_nbm()
219{
220  global $user, $lang, $lang_info, $env_nbm;
221
222  // Restore $user, $lang_info and $lang arrays (include/user.inc.php has been executed)
223  $user = $env_nbm['save_user'];
224  // Restore current language to stack, necessary because $user change during NBM
225  switch_lang_back();
226
227  if ($env_nbm['is_to_send_mail'])
228  {
229    unset($env_nbm['email_format']);
230    unset($env_nbm['send_as_name']);
231    unset($env_nbm['send_as_mail_address']);
232    unset($env_nbm['send_as_mail_formated']);
233    // Don t unset counter
234    //unset($env_nbm['error_on_mail_count']);
235    //unset($env_nbm['sent_mail_count']);
236    unset($env_nbm['msg_info']);
237    unset($env_nbm['msg_error']);
238  }
239
240  unset($env_nbm['save_user']);
241  unset($env_nbm['is_to_send_mail']);
242}
243
244/*
245 * Set user on nbm enviromnent
246 *
247 * Return none
248 */
249function set_user_on_env_nbm(&$nbm_user, $is_action_send)
250{
251  global $user, $lang, $lang_info, $env_nbm;
252
253  $user = build_user( $nbm_user['user_id'], true );
254
255  switch_lang_to($user['language']);
256
257  if ($is_action_send)
258  {
259    $nbm_user['theme'] = $user['theme'];
260    $env_nbm['mail_template'] = get_mail_template($env_nbm['email_format'], $nbm_user['theme']);
261    $env_nbm['mail_template']->set_filename('notification_by_mail', 'notification_by_mail.tpl');
262  }
263}
264
265/*
266 * Unset user on nbm enviromnent
267 *
268 * Return none
269 */
270function unset_user_on_env_nbm()
271{
272  global $env_nbm;
273
274  switch_lang_back();
275  unset($env_nbm['mail_template']);
276}
277
278/*
279 * Inc Counter success
280 *
281 * Return none
282 */
283function inc_mail_sent_success($nbm_user)
284{
285  global $page, $env_nbm;
286
287  $env_nbm['sent_mail_count'] += 1;
288  array_push($page['infos'], sprintf($env_nbm['msg_info'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
289}
290
291/*
292 * Inc Counter failed
293 *
294 * Return none
295 */
296function inc_mail_sent_failed($nbm_user)
297{
298  global $page, $env_nbm;
299
300  $env_nbm['error_on_mail_count'] += 1;
301  array_push($page['errors'], sprintf($env_nbm['msg_error'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
302}
303
304/*
305 * Display Counter Info
306 *
307 * Return none
308 */
309function display_counter_info()
310{
311  global $page, $env_nbm;
312
313  if ($env_nbm['error_on_mail_count'] != 0)
314  {
315    array_push($page['errors'], l10n_dec('%d mail was not sent.', '%d mails were not sent.', $env_nbm['error_on_mail_count']));
316    if ($env_nbm['sent_mail_count'] != 0)
317      array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
318  }
319  else
320  {
321    if ($env_nbm['sent_mail_count'] == 0)
322      array_push($page['infos'], l10n('No mail to send.'));
323    else
324      array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
325  }
326}
327
328function assign_vars_nbm_mail_content($nbm_user)
329{
330  global $env_nbm;
331
332  set_make_full_url();
333
334  $env_nbm['mail_template']->assign
335  (
336    array
337    (
338      'USERNAME' => stripslashes($nbm_user['username']),
339
340      'SEND_AS_NAME' => $env_nbm['send_as_name'],
341
342      'UNSUBSCRIBE_LINK' => add_url_params(get_gallery_home_url().'/nbm.php', array('unsubscribe' => $nbm_user['check_key'])),
343      'SUBSCRIBE_LINK' => add_url_params(get_gallery_home_url().'/nbm.php', array('subscribe' => $nbm_user['check_key'])),
344      'CONTACT_EMAIL' => $env_nbm['send_as_mail_address']
345    )
346  );
347
348  unset_make_full_url();
349}
350
351/*
352 * Subscribe or unsubscribe notification by mail
353 *
354 * is_subscribe define if action=subscribe or unsubscribe
355 * check_key list where action will be done
356 *
357 * @return check_key list treated
358 */
359function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_subscribe = false, $check_key_list = array())
360{
361  global $conf, $page, $env_nbm, $conf;
362
363  set_make_full_url();
364
365  $check_key_treated = array();
366  $updated_data_count = 0;
367  $error_on_updated_data_count = 0;
368
369  if ($is_subscribe)
370  {
371    $msg_info = l10n('User %s [%s] was added to the subscription list.');
372    $msg_error = l10n('User %s [%s] was not added to the subscription list.');
373  }
374  else
375  {
376    $msg_info = l10n('User %s [%s] was removed from the subscription list.');
377    $msg_error = l10n('User %s [%s] was not removed from the subscription list.');
378  }
379
380  if (count($check_key_list) != 0)
381  {
382    $updates = array();
383    $enabled_value = boolean_to_string($is_subscribe);
384    $data_users = get_user_notifications('subscribe', $check_key_list, !$is_subscribe);
385
386    // Prepare message after change language
387    $msg_break_timeout = l10n('Time to send mail is limited. Others mails are skipped.');
388
389    // Begin nbm users environment
390    begin_users_env_nbm(true);
391
392    foreach ($data_users as $nbm_user)
393    {
394      if (check_sendmail_timeout())
395      {
396        // Stop fill list on 'send', if the quota is override
397        array_push($page['errors'], $msg_break_timeout);
398        break;
399      }
400
401      // Fill return list
402      array_push($check_key_treated, $nbm_user['check_key']);
403
404      $do_update = true;
405      if ($nbm_user['mail_address'] != '')
406      {
407        // set env nbm user
408        set_user_on_env_nbm($nbm_user, true);
409
410        $subject = '['.$conf['gallery_title'].']: '.($is_subscribe ? l10n('Subscribe to notification by mail'): l10n('Unsubscribe from notification by mail'));
411
412        // Assign current var for nbm mail
413        assign_vars_nbm_mail_content($nbm_user);
414
415        $section_action_by = ($is_subscribe ? 'subscribe_by_' : 'unsubscribe_by_');
416        $section_action_by .= ($is_admin_request ? 'admin' : 'himself');
417        $env_nbm['mail_template']->assign
418        (
419          array
420          (
421            $section_action_by => true,
422            'GOTO_GALLERY_TITLE' => $conf['gallery_title'],
423            'GOTO_GALLERY_URL' => get_gallery_home_url(),
424          )
425        );
426
427        if (pwg_mail
428            (
429              format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
430              array
431              (
432                'from' => $env_nbm['send_as_mail_formated'],
433                'subject' => $subject,
434                'email_format' => $env_nbm['email_format'],
435                'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
436                'content_format' => $env_nbm['email_format'],
437                'theme' => $nbm_user['theme']
438              )
439            ))
440        {
441          inc_mail_sent_success($nbm_user);
442        }
443        else
444        {
445          inc_mail_sent_failed($nbm_user);
446          $do_update = false;
447        }
448
449        // unset env nbm user
450        unset_user_on_env_nbm();
451
452      }
453
454      if ($do_update)
455      {
456        array_push
457        (
458          $updates,
459          array
460          (
461            'check_key' => $nbm_user['check_key'],
462            'enabled' => $enabled_value
463          )
464        );
465        $updated_data_count += 1;
466        array_push($page['infos'], sprintf($msg_info, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
467      }
468      else
469      {
470        $error_on_updated_data_count += 1;
471        array_push($page['errors'], sprintf($msg_error, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
472      }
473
474    }
475
476    // Restore nbm environment
477    end_users_env_nbm();
478
479    display_counter_info();
480
481    mass_updates(
482      USER_MAIL_NOTIFICATION_TABLE,
483      array(
484        'primary' => array('check_key'),
485        'update' => array('enabled')
486      ),
487      $updates
488    );
489
490  }
491
492  array_push($page['infos'], l10n_dec('%d user was updated.', '%d users were updated.', $updated_data_count));
493  if ($error_on_updated_data_count != 0)
494  {
495    array_push($page['errors'],
496      l10n_dec('%d user was not updated.',
497               '%d users were not updated.',
498               $error_on_updated_data_count));
499  }
500
501  unset_make_full_url();
502
503  return $check_key_treated;
504}
505
506/*
507 * Unsubscribe notification by mail
508 *
509 * check_key list where action will be done
510 *
511 * @return check_key list treated
512 */
513function unsubscribe_notification_by_mail($is_admin_request, $check_key_list = array())
514{
515  return do_subscribe_unsubscribe_notification_by_mail($is_admin_request, false, $check_key_list);
516}
517
518/*
519 * Subscribe notification by mail
520 *
521 * check_key list where action will be done
522 *
523 * @return check_key list treated
524 */
525function subscribe_notification_by_mail($is_admin_request, $check_key_list = array())
526{
527  return do_subscribe_unsubscribe_notification_by_mail($is_admin_request, true, $check_key_list);
528}
529
530?>
Note: See TracBrowser for help on using the repository browser.