/** * Location() * * Fonction de redirection du script avec url absolue, d'apr�s les * sp�cifications HTTP/1.1 * * @param string $url Url relative de redirection * * @return void */ function Location($url) { global $db, $output; if (function_exists('sessid') && defined('IN_ADMIN')) { $url = sessid($url); } // // On ferme la connexion � la base de donn�es, si elle existe // if (isset($db) && is_object($db)) { $db->close(); } $use_refresh = preg_match("#Microsoft|WebSTAR|Xitami#i", server_info('SERVER_SOFTWARE')); $absolute_url = make_script_url() . (defined('IN_ADMIN') ? 'admin/' : ''); $absolute_url .= unhtmlspecialchars($url); header(($use_refresh ? 'Refresh: 0; URL=' : 'Location: ') . $absolute_url); // // Si la fonction header() ne donne rien, on affiche une page de redirection // $message = '<p>If your browser doesn\'t support meta redirect, click <a href="' . $url . '">here</a> to go on next page.</p>'; $output->redirect($url, 0); $output->basic($message, 'Redirection'); }
} else { $s_title_clip = $lang['Joined_file']; } $s_clip = '<img src="../templates/images/icon_clip.png" width="10" height="13" alt="@" title="' . $s_title_clip . '" />'; } else { $s_clip = '  '; } $output->assign_block_vars('logrow', array('TD_CLASS' => !($i % 2) ? 'row1' : 'row2', 'ITEM_CLIP' => $s_clip, 'LOG_SUBJECT' => htmlspecialchars(cut_str($logrow[$i]['log_subject'], 60), ENT_NOQUOTES), 'LOG_DATE' => convert_time($nl_config['date_format'], $logrow[$i]['log_date']), 'U_VIEW' => sessid('./view.php?mode=log&action=view&id=' . $logrow[$i]['log_id'] . $get_string))); if ($display_checkbox) { $output->assign_block_vars('logrow.delete', array('LOG_ID' => $logrow[$i]['log_id'])); } } if ($action == 'view' && is_array($logdata)) { $format = !empty($_POST['format']) ? intval($_POST['format']) : 0; $output->set_filenames(array('iframe_body' => 'iframe_body.tpl')); $output->assign_vars(array('L_SUBJECT' => $lang['Log_subject'], 'L_NUMDEST' => $lang['Log_numdest'], 'L_EXPORT_T' => $lang['Export_nl'], 'L_EXPORT' => $lang['Export'], 'SUBJECT' => htmlspecialchars($logdata['log_subject'], ENT_NOQUOTES), 'S_NUMDEST' => $logdata['log_numdest'], 'S_CODEBASE' => $nl_config['urlsite'] . $nl_config['path'] . 'admin/', 'U_FRAME' => sessid('./view.php?mode=iframe&id=' . $log_id . '&format=' . $format), 'U_EXPORT' => sessid('./view.php?mode=export&id=' . $log_id))); if ($listdata['liste_format'] == FORMAT_MULTIPLE) { require WA_ROOTDIR . '/includes/functions.box.php'; $output->assign_block_vars('format_box', array('L_FORMAT' => $lang['Format'], 'L_GO_BUTTON' => $lang['Button']['go'], 'FORMAT_BOX' => format_box('format', $format, true))); } $output->files_list($logdata, $format); $output->assign_var_from_handle('IFRAME', 'iframe_body'); } } else { $output->assign_block_vars('empty', array('L_EMPTY' => $lang['No_log_sended'])); } } } } } }
if (!$zziplib_loaded && $file_ext == 'zip' || !$zlib_loaded && $file_ext == 'gz' || !$bzip2_loaded && $file_ext == 'bz2') { $output->message('Compress_unsupported'); } $data = decompress_filedata($tmp_filename, $file_ext); // // S'il y a une restriction d'accés par l'open_basedir, et que c'est un fichier uploadé, // nous avons dù le déplacer dans le dossier des fichiers temporaires du script, on le supprime. // if ($unlink) { require WA_ROOTDIR . '/includes/class.attach.php'; Attach::remove_file($tmp_filename); } } else { $output->redirect('./tools.php?mode=restore', 4); $message = $lang['Message']['No_data_received']; $message .= '<br /><br />' . sprintf($lang['Click_return_back'], '<a href="' . sessid('./tools.php?mode=restore') . '">', '</a>'); $output->message($message); } $queries = parseSQL($data); $db->beginTransaction(); fake_header(false); foreach ($queries as $query) { $db->query($query) || trigger_error('Erreur sql lors de la restauration', ERROR); fake_header(true); } $db->commit(); $output->message('Success_restore'); } $output->addHiddenField('sessid', $session->session_id); $output->set_filenames(array('tool_body' => 'restore_body.tpl')); $output->assign_vars(array('L_TITLE_RESTORE' => $lang['Title']['restore'], 'L_EXPLAIN_RESTORE' => nl2br($lang['Explain']['restore']), 'L_FILE_LOCAL' => $lang['File_local'], 'L_VALID_BUTTON' => $lang['Button']['valid'], 'L_RESET_BUTTON' => $lang['Button']['reset'], 'S_HIDDEN_FIELDS' => $output->getHiddenFields(), 'S_ENCTYPE' => FILE_UPLOADS_ON ? 'multipart/form-data' : 'application/x-www-form-urlencoded'));
* along with Wanewsletter; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * @package Wanewsletter * @author Bobe <*****@*****.**> * @link http://phpcodeur.net/wascripts/wanewsletter/ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License * @version $Id: config.php 352 2006-04-10 21:18:05Z bobe $ */ define('IN_NEWSLETTER', true); require './pagestart.php'; require WAMAILER_DIR . '/class.mailer.php'; if ($admindata['admin_level'] != ADMIN) { $output->redirect('./index.php', 6); $message = $lang['Message']['Not_authorized']; $message .= '<br /><br />' . sprintf($lang['Click_return_index'], '<a href="' . sessid('./index.php') . '">', '</a>'); $output->message($message); } $sql = "SELECT * FROM " . CONFIG_TABLE; if (!($result = $db->query($sql))) { trigger_error('Impossible de récupérer la configuration du script', ERROR); } $old_config = $result->fetch(SQL_FETCH_ASSOC); $move_files = false; if (isset($_POST['submit'])) { require WA_ROOTDIR . '/includes/class.attach.php'; require WA_ROOTDIR . '/includes/functions.validate.php'; $new_config = array(); foreach ($old_config as $name => $value) { $new_config[$name] = isset($_POST[$name]) ? trim($_POST[$name]) : $value; }
$width = '360'; $height = '180'; if (preg_match('/<(?:[^:]+:)?svg([^>]+)>/', $data, $match)) { if (preg_match('/width=("|\')([0-9]+)\\1/', $match[1], $match_w)) { $width = $match_w[2]; } if (preg_match('/height=("|\')([0-9]+)\\1/', $match[1], $match_h)) { $height = $match_h[2]; } } } else { list($width, $height) = getimagesize($tmp_filename); } $output->send_headers(); $output->set_filenames(array('body' => 'show_popup.tpl')); $output->assign_vars(array('POPUP_TITLE' => sprintf($lang['Title']['Show_popup'], $filedata['file_real_name']), 'CONTENT_LANG' => $lang['CONTENT_LANG'], 'CONTENT_DIR' => $lang['CONTENT_DIR'], 'CHARSET' => $lang['CHARSET'], 'FILENAME' => $filedata['file_real_name'], 'MIME_TYPE' => $filedata['file_mimetype'], 'WIDTH_IMG' => $width, 'HEIGHT_IMG' => $height, 'U_SHOW_IMG' => sessid('./show.php?fid=' . $file_id))); $output->pparse('body'); } else { header('Date: ' . gmdate('D, d M Y H:i:s', time()) . ' GMT'); header('Content-Disposition: inline; filename="' . $filedata['file_real_name'] . '"'); header('Content-Length: ' . $filedata['file_size']); if ($is_svg == true) { $charset = 'UTF-8'; if (preg_match('/^<\\?xml(.+?)\\?>/', $data, $match)) { if (preg_match('/encoding="([a-z0-9.:_-]+)"/i', $match[0], $match2)) { $charset = $match2[1]; } } header('Content-Type: ' . $filedata['file_mimetype'] . '; charset=' . $charset); } else { header('Content-Type: ' . $filedata['file_mimetype']);
/** * Affichage de la page de sélection de liste ou insertion du select de choix de liste dans * le coin inférieur gauche de l'administration * * @param integer $auth_type * @param boolean $display * @param string $jump_to * * @access public * @return void */ function build_listbox($auth_type, $display = true, $jump_to = '') { global $admindata, $auth, $session, $lang; $tmp_box = ''; $liste_id_ary = $auth->check_auth($auth_type); if (empty($jump_to)) { $jump_to = './' . htmlspecialchars(basename(server_info('PHP_SELF'))); $query_string = server_info('QUERY_STRING'); if ($query_string != '') { $jump_to .= '?' . htmlspecialchars($query_string); } } foreach ($auth->listdata as $liste_id => $data) { if (in_array($liste_id, $liste_id_ary)) { $selected = $admindata['session_liste'] == $liste_id ? ' selected="selected"' : ''; $tmp_box .= sprintf("<option value=\"%d\"%s>%s</option>\n\t", $liste_id, $selected, cut_str($data['liste_name'], 30)); } } if ($tmp_box == '') { if ($display) { $message = $lang['Message']['No_liste_exists']; if ($admindata['admin_level'] == ADMIN) { $message .= '<br /><br />' . sprintf($lang['Click_create_liste'], '<a href="' . sessid('./view.php?mode=liste&action=add') . '">', '</a>'); } $this->message($message); } return ''; } $list_box = '<select id="liste" name="liste">'; if (!$display) { $list_box .= '<option value="0">' . $lang['Choice_liste'] . '</option>'; } $list_box .= $tmp_box . '</select>'; $this->addHiddenField('sessid', $session->session_id); if ($display) { $this->page_header(); $this->set_filenames(array('body' => 'select_liste_body.tpl')); $this->assign_vars(array('L_TITLE' => $lang['Title']['select'], 'L_SELECT_LISTE' => $lang['Choice_liste'], 'L_VALID_BUTTON' => $lang['Button']['valid'], 'LISTE_BOX' => $list_box, 'S_HIDDEN_FIELDS' => $this->getHiddenFields(), 'U_FORM' => sessid($jump_to))); $this->pparse('body'); $this->page_footer(); } else { $this->set_filenames(array('list_box_body' => 'list_box.tpl')); $this->assign_vars(array('L_VIEW_LIST' => $lang['View_liste'], 'L_BUTTON_GO' => $lang['Button']['go'], 'S_LISTBOX' => $list_box, 'S_HIDDEN_FIELDS' => $this->getHiddenFields(), 'U_LISTBOX' => sessid($jump_to))); $this->assign_var_from_handle('LISTBOX', 'list_box_body'); } }
/** * If not already done, load the file for the given handle and populate * the uncompiled_code[] hash with its code. Do not compile. */ function loadfile($handle) { // If the file for this handle is already loaded and compiled, do nothing. if (isset($this->uncompiled_code[$handle]) && !empty($this->uncompiled_code[$handle])) { return true; } // If we don't have a file assigned to this handle, die. if (!isset($this->files[$handle])) { die("Template->loadfile(): Aucun fichier spécifié pour le modèle {$handle}"); } $filename = $this->files[$handle]; $str = implode("", @file($filename)); if (empty($str)) { die("Template->loadfile(): Le fichier {$filename} pour le modèle {$handle} est vide"); } // // Ajout traitement par sessid() pour ajout des sessid au bout des urls si besoin // Cela évite d'appeller la fonction à chaque insertion d'url dans le template // $this->uncompiled_code[$handle] = function_exists('sessid') ? sessid($str, true) : $str; return true; }
$output->page_header(); $output->set_filenames(array('body' => 'stats_body.tpl')); $y_list = ''; $m_list = ''; $y = date('Y', $listdata['liste_startdate']); $n = date('n', $listdata['liste_startdate']); $c = date('Y'); if ($y == $c) { $m = date('n'); } else { $m = 12; $n = 1; } for (; $y <= $c; $y++) { $selected = $y == $year ? ' selected="selected"' : ''; $y_list .= sprintf("\n\t<option value=\"%1\$d\"%2\$s>%1\$d</option>", $y, $selected); } for (; $n <= $m; $n++) { $selected = $n == $month ? ' selected="selected"' : ''; $m_list .= sprintf("\n\t<option value=\"%d\"%s>%s</option>", $n, $selected, convert_time('F', mktime(0, 0, 0, $n, 1, $y))); } $output->assign_vars(array('L_TITLE' => $lang['Title']['stats'], 'L_EXPLAIN_STATS' => nl2br($lang['Explain']['stats']), 'L_GO_BUTTON' => $lang['Button']['go'], 'L_IMG_GRAPH' => $lang['Graph_bar_title'], 'L_IMG_CAMEMBERT' => $lang['Camembert_title'], 'YEAR_LIST' => $y_list, 'MONTH_LIST' => $m_list, 'U_IMG_GRAPH' => sessid('./stats.php?img=graph&year=' . $year . '&month=' . $month), 'U_IMG_CAMEMBERT' => sessid('./stats.php?img=camembert'), 'S_HIDDEN_FIELDS' => $output->getHiddenFields())); // // Affichons un message d'alerte au cas où le répertoire de statistiques n'est pas // accessible en écriture. // if (!is_writable(WA_STATSDIR)) { $output->assign_block_vars('statsdir_error', array('MESSAGE' => $lang['Stats_dir_not_writable'])); } $output->pparse('body'); $output->page_footer();
if (!$db->query($sql)) { trigger_error('Impossible de dupliquer les fichiers joints', ERROR); } } } $logdata['log_id'] = $tmp_id; $prev_status = $logdata['log_status']; unset($tmp_id); if ($mode == 'save' || $mode == 'send') { if ($mode == 'save') { $output->redirect('./envoi.php?mode=load&id=' . $logdata['log_id'], 4); $message = $lang['Message']['log_saved']; $message .= '<br /><br />' . sprintf($lang['Click_return_back'], '<a href="' . sessid('./envoi.php?mode=load&id=' . $logdata['log_id']) . '">', '</a>'); } else { $message = $lang['Message']['log_ready']; $message .= '<br /><br />' . sprintf($lang['Click_start_send'], '<a href="' . sessid('./envoi.php?mode=progress&id=' . $logdata['log_id']) . '">', '</a>'); } $output->message($message); } } } // // Attachement de fichiers // if ($mode == 'attach' && !empty($logdata['log_id']) && $auth->check_auth(AUTH_ATTACH, $listdata['liste_id'])) { $join_file = isset($_FILES['join_file']) ? $_FILES['join_file'] : array(); $local_file = !empty($_POST['join_file']) ? trim($_POST['join_file']) : ''; $tmp_filename = !empty($join_file['tmp_name']) && $join_file['tmp_name'] != 'none' ? $join_file['tmp_name'] : $local_file; $filename = !empty($join_file['name']) ? $join_file['name'] : ''; $filesize = !empty($join_file['size']) ? intval($join_file['size']) : 0; $filetype = !empty($join_file['type']) ? $join_file['type'] : '';
/** * launch_sending() * * Cette fonction est appellée soit dans envoi.php lors de l'envoi, soit * dans le fichier appellé originellement cron.php * * @param array $listdata Tableau des données de la liste concernée * @param array $logdata Tableau des données de la newsletter * @param array $supp_address Adresses de destinataires supplémentaires * * @return string */ function launch_sending($listdata, $logdata, $supp_address = array()) { global $nl_config, $db, $lang, $other_tags; // // On commence par poser un verrou sur un fichier lock, // il ne faut pas qu'il y ait simultanément plusieurs flôts d'envois // pour une même liste de diffusion. // $lockfile = sprintf(WA_LOCKFILE, $listdata['liste_id']); if (file_exists($lockfile)) { $isBeginning = false; $fp = fopen($lockfile, 'r+'); $supp_address = array(); // On en tient pas compte, ça l'a déjà été lors du premier flôt } else { $isBeginning = true; $fp = fopen($lockfile, 'w'); @chmod($lockfile, 0600); } if (!flock($fp, LOCK_EX | LOCK_NB)) { fclose($fp); return $lang['Message']['List_is_busy']; } if (filesize($lockfile) > 0) { // // L'envoi a planté au cours d'un "flôt" précédent. On récupère les éventuels // identifiants d'abonnés stockés dans le fichier lock et on met à jour la table // $abo_ids = fread($fp, filesize($lockfile)); $abo_ids = array_map('trim', explode("\n", trim($abo_ids))); if (count($abo_ids) > 0) { $abo_ids = array_unique(array_map('intval', $abo_ids)); $sql = "UPDATE " . ABO_LISTE_TABLE . "\n\t\t\t\tSET send = 1\n\t\t\t\tWHERE abo_id IN(" . implode(', ', $abo_ids) . ")\n\t\t\t\t\tAND liste_id = " . $listdata['liste_id']; if (!$db->query($sql)) { trigger_error('Impossible de mettre à jour la table des abonnés', ERROR); } } ftruncate($fp, 0); fseek($fp, 0); } // // Initialisation de la classe mailer // require WAMAILER_DIR . '/class.mailer.php'; $mailer = new Mailer(WA_ROOTDIR . '/language/email_' . $nl_config['language'] . '/'); if ($nl_config['use_smtp']) { $mailer->smtp_path = WAMAILER_DIR . '/'; $mailer->use_smtp($nl_config['smtp_host'], $nl_config['smtp_port'], $nl_config['smtp_user'], $nl_config['smtp_pass']); } $mailer->set_charset($lang['CHARSET']); $mailer->set_from($listdata['sender_email'], unhtmlspecialchars($listdata['liste_name'])); if ($listdata['return_email'] != '') { $mailer->set_return_path($listdata['return_email']); } // // On traite les données de la newsletter à envoyer // if (preg_match('/[\\x80-\\x9F]/', $logdata['log_subject']) || preg_match('/[\\x80-\\x9F]/', $logdata['log_body_text']) || preg_match('/[\\x80-\\x9F]/', $logdata['log_body_html'])) { if (TRANSLITE_INVALID_CHARS == false) { $logdata['log_subject'] = wan_utf8_encode($logdata['log_subject']); $logdata['log_body_text'] = wan_utf8_encode($logdata['log_body_text']); $logdata['log_body_html'] = wan_utf8_encode($logdata['log_body_html']); $lang['Label_link'] = wan_utf8_encode($lang['Label_link']); $mailer->set_charset('UTF-8'); } else { $logdata['log_subject'] = purge_latin1($logdata['log_subject'], true); $logdata['log_body_text'] = purge_latin1($logdata['log_body_text'], true); $logdata['log_body_html'] = purge_latin1($logdata['log_body_html']); } } $mailer->set_subject($logdata['log_subject']); $body = array(FORMAT_TEXTE => $logdata['log_body_text'], FORMAT_HTML => $logdata['log_body_html']); // // Ajout du lien de désinscription, selon les méthodes d'envoi/format utilisés // $link = newsletter_links($listdata); if ($listdata['use_cron'] || $nl_config['engine_send'] == ENGINE_BCC) { $body[FORMAT_TEXTE] = str_replace('{LINKS}', $link[FORMAT_TEXTE], $body[FORMAT_TEXTE]); $body[FORMAT_HTML] = str_replace('{LINKS}', $link[FORMAT_HTML], $body[FORMAT_HTML]); } // // On s'occupe maintenant des fichiers joints ou incorporés // Si les fichiers sont stockés sur un serveur ftp, on les rapatrie le temps du flot d'envoi // $total_files = count($logdata['joined_files']); $tmp_files = array(); require WA_ROOTDIR . '/includes/class.attach.php'; $attach = new Attach(); hasCidReferences($body[FORMAT_HTML], $refs); for ($i = 0; $i < $total_files; $i++) { $real_name = $logdata['joined_files'][$i]['file_real_name']; $physical_name = $logdata['joined_files'][$i]['file_physical_name']; $mime_type = $logdata['joined_files'][$i]['file_mimetype']; $error = FALSE; $msg = array(); $attach->joined_file_exists($physical_name, $error, $msg); if ($error) { $error = FALSE; continue; } if ($nl_config['use_ftp']) { $file_path = $attach->ftp_to_tmp($logdata['joined_files'][$i]); array_push($tmp_files, $file_path); } else { $file_path = WA_ROOTDIR . '/' . $nl_config['upload_path'] . $physical_name; } if (is_array($refs) && in_array($real_name, $refs)) { $embedded = TRUE; } else { $embedded = FALSE; } $mailer->attachment($file_path, $real_name, 'attachment', $mime_type, $embedded); } // // Récupération des champs des tags personnalisés // if (count($other_tags) > 0) { $fields_str = ''; foreach ($other_tags as $data) { $fields_str .= 'a.' . $data['column_name'] . ', '; } } else { $fields_str = ''; } // // Si on en est au premier flôt, on récupère également les adresses email // des administrateurs ayant activés l'option de réception de copie // if ($isBeginning) { $sql = "SELECT a.admin_email\n\t\t\tFROM " . ADMIN_TABLE . " AS a\n\t\t\t\tINNER JOIN " . AUTH_ADMIN_TABLE . " AS aa ON aa.admin_id = a.admin_id\n\t\t\t\t\tAND aa.cc_admin = " . TRUE; if (!($result = $db->query($sql))) { trigger_error('Impossible d\'obtenir la liste des fichiers joints', ERROR); } while ($email = $result->column('admin_email')) { array_push($supp_address, $email); } $result->free(); $supp_address = array_unique($supp_address); // Au cas où... } // // On récupère les infos sur les abonnés destinataires // $sql = "SELECT COUNT(a.abo_id) AS total\n\t\tFROM " . ABONNES_TABLE . " AS a\n\t\t\tINNER JOIN " . ABO_LISTE_TABLE . " AS al ON al.abo_id = a.abo_id\n\t\t\t\tAND al.liste_id = {$listdata['liste_id']}\n\t\t\t\tAND al.confirmed = " . SUBSCRIBE_CONFIRMED . "\n\t\t\t\tAND al.send = 0\n\t\tWHERE a.abo_status = " . ABO_ACTIF; if (!($result = $db->query($sql))) { trigger_error('Impossible d\'obtenir le nombre d\'adresses emails', ERROR); } $total_abo = $result->column('total'); if ($nl_config['emails_sended'] > 0) { $total_abo = min($total_abo, $nl_config['emails_sended']); } $sql = "SELECT a.abo_id, a.abo_pseudo, {$fields_str} a.abo_email, al.register_key, al.format\n\t\tFROM " . ABONNES_TABLE . " AS a\n\t\t\tINNER JOIN " . ABO_LISTE_TABLE . " AS al ON al.abo_id = a.abo_id\n\t\t\t\tAND al.liste_id = {$listdata['liste_id']}\n\t\t\t\tAND al.confirmed = " . SUBSCRIBE_CONFIRMED . "\n\t\t\t\tAND al.send = 0\n\t\tWHERE a.abo_status = " . ABO_ACTIF; if ($nl_config['emails_sended'] > 0) { $sql .= " LIMIT {$nl_config['emails_sended']} OFFSET 0"; } if (!($result = $db->query($sql))) { trigger_error('Impossible d\'obtenir la liste des adresses emails', ERROR); } $abo_ids = array(); $format = $listdata['liste_format'] != FORMAT_MULTIPLE ? $listdata['liste_format'] : false; if ($row = $result->fetch()) { if ($nl_config['engine_send'] == ENGINE_BCC) { fake_header(false); $abonnes = array(FORMAT_TEXTE => array(), FORMAT_HTML => array()); $abo_ids = array(FORMAT_TEXTE => array(), FORMAT_HTML => array()); do { $abo_format = !$format ? $row['format'] : $format; array_push($abo_ids[$abo_format], $row['abo_id']); array_push($abonnes[$abo_format], $row['abo_email']); fake_header(true); } while ($row = $result->fetch()); if ($listdata['liste_format'] != FORMAT_HTML) { $abonnes[FORMAT_TEXTE] = array_merge($abonnes[FORMAT_TEXTE], $supp_address); } if ($listdata['liste_format'] != FORMAT_TEXTE) { $abonnes[FORMAT_HTML] = array_merge($abonnes[FORMAT_HTML], $supp_address); } // // Tableau pour remplacer les tags par des chaines vides // Non utilisation des tags avec le moteur d'envoi en copie cachée // $tags_replace = array('NAME' => ''); if (count($other_tags) > 0) { foreach ($other_tags as $data) { $tags_replace[$data['tag_name']] = ''; } } if (count($abonnes[FORMAT_TEXTE]) > 0) { $mailer->set_address($abonnes[FORMAT_TEXTE], 'Bcc'); $mailer->set_format(FORMAT_TEXTE); $mailer->set_message($body[FORMAT_TEXTE]); $mailer->assign_tags($tags_replace); if (!$mailer->send()) { trigger_error(sprintf($lang['Message']['Failed_sending2'], $mailer->msg_error), ERROR); } fwrite($fp, implode("\n", $abo_ids[FORMAT_TEXTE]) . "\n"); } $mailer->clear_address(); if (count($abonnes[FORMAT_HTML]) > 0) { $mailer->set_address($abonnes[FORMAT_HTML], 'Bcc'); $mailer->set_format($listdata['liste_format']); $mailer->assign_tags($tags_replace); $mailer->set_message($body[FORMAT_HTML]); if ($listdata['liste_format'] == FORMAT_MULTIPLE) { $mailer->set_altmessage($body[FORMAT_TEXTE]); } if (!$mailer->send()) { trigger_error(sprintf($lang['Message']['Failed_sending2'], $mailer->msg_error), ERROR); } fwrite($fp, implode("\n", $abo_ids[FORMAT_HTML]) . "\n"); } $abo_ids = array_merge($abo_ids[FORMAT_TEXTE], $abo_ids[FORMAT_HTML]); } else { if ($nl_config['engine_send'] == ENGINE_UNIQ) { if (defined('IN_COMMANDLINE')) { require WA_ROOTDIR . '/contrib/Console/ProgressBar.php'; // // Initialisation de la barre de progression des envois // $bar = new Console_ProgressBar('Sending emails %percent% [%bar%] %current% of %max%', '=>', ' ', 80, $total_abo + count($supp_address), array('ansi_terminal' => ANSI_TERMINAL)); } else { fake_header(false); } if (($isPHP5 = version_compare(phpversion(), '5.0.0', '>=')) == true) { eval('$mailerText = clone $mailer;'); eval('$mailerHTML = clone $mailer;'); } else { $mailerText = $mailer; $mailerHTML = $mailer; } if (!$listdata['use_cron']) { $body[FORMAT_TEXTE] = str_replace('{LINKS}', $link[FORMAT_TEXTE], $body[FORMAT_TEXTE]); $body[FORMAT_HTML] = str_replace('{LINKS}', $link[FORMAT_HTML], $body[FORMAT_HTML]); } $mailerText->set_format(FORMAT_TEXTE); $mailerText->set_message($body[FORMAT_TEXTE]); $mailerHTML->set_format(FORMAT_HTML); if ($listdata['liste_format'] == FORMAT_MULTIPLE) { $mailerHTML->set_format(FORMAT_MULTIPLE); $mailerHTML->set_altmessage($body[FORMAT_TEXTE]); } $mailerHTML->set_message($body[FORMAT_HTML]); $supp_address_ok = array(); foreach ($supp_address as $address) { if ($listdata['liste_format'] != FORMAT_HTML) { array_push($supp_address_ok, array('format' => FORMAT_TEXTE, 'abo_pseudo' => '', 'abo_email' => $address, 'register_key' => '', 'abo_id' => -1)); } if ($listdata['liste_format'] != FORMAT_TEXTE) { array_push($supp_address_ok, array('format' => FORMAT_HTML, 'abo_pseudo' => '', 'abo_email' => $address, 'register_key' => '', 'abo_id' => -1)); } } $counter = 0; $sendError = 0; do { $counter++; $abo_format = !$format ? $row['format'] : $format; if ($abo_format == FORMAT_TEXTE) { if ($isPHP5 == true) { eval('$mailer = clone $mailerText;'); } else { $mailer = $mailerText; } } else { if ($isPHP5 == true) { eval('$mailer = clone $mailerHTML;'); } else { $mailer = $mailerHTML; } } if ($row['abo_pseudo'] != '') { $address = array($row['abo_pseudo'] => $row['abo_email']); } else { $address = $row['abo_email']; } $mailer->clear_address(); $mailer->set_address($address); // // Traitement des tags et tags personnalisés // $tags_replace = array(); if ($row['abo_pseudo'] != '') { $tags_replace['NAME'] = $abo_format == FORMAT_HTML ? $row['abo_pseudo'] : unhtmlspecialchars($row['abo_pseudo']); } else { $tags_replace['NAME'] = ''; } if (count($other_tags) > 0) { foreach ($other_tags as $data) { if (isset($row[$data['column_name']])) { if (!is_numeric($row[$data['column_name']]) && $abo_format == FORMAT_HTML) { $row[$data['column_name']] = htmlspecialchars($row[$data['column_name']]); } $tags_replace[$data['tag_name']] = $row[$data['column_name']]; continue; } $tags_replace[$data['tag_name']] = ''; } } if (!$listdata['use_cron']) { $tags_replace = array_merge($tags_replace, array('WA_CODE' => $row['register_key'], 'WA_EMAIL' => rawurlencode($row['abo_email']))); } $mailer->assign_tags($tags_replace); // envoi if (!$mailer->send()) { $sendError++; } if ($row['abo_id'] != -1) { array_push($abo_ids, $row['abo_id']); fwrite($fp, "{$row['abo_id']}\n"); } if (defined('IN_COMMANDLINE')) { $bar->update($counter); if (SEND_DELAY > 0 && $counter % SEND_PACKET == 0) { sleep(SEND_DELAY); } } else { fake_header(true); } } while (($row = $result->fetch()) || ($row = array_pop($supp_address_ok)) != null); // // Aucun email envoyé, il y a manifestement un problème, on affiche le message d'erreur // if ($sendError == $total_abo) { flock($fp, LOCK_UN); fclose($fp); unlink($lockfile); trigger_error(sprintf($lang['Message']['Failed_sending2'], $mailer->msg_error), ERROR); } } else { trigger_error('Unknown_engine', ERROR); } } $result->free(); } else { if ($isBeginning) { // // Aucun abonné dont le champ send soit positionné à 0 et nous sommes au // début de l'envoi. Cette liste ne comporte donc pas encore d'abonné. // return $lang['Message']['No_subscribers']; } } // // Si l'option FTP est utilisée, suppression des fichiers temporaires // if ($nl_config['use_ftp']) { foreach ($tmp_files as $filename) { $attach->remove_file($filename); } } unset($tmp_files); $no_send = $sended = 0; if (!$db->ping()) { // // L'envoi a duré trop longtemps et la connexion au serveur SQL a été perdue // if (SQL_DRIVER == 'mysqli') { trigger_error("La connexion à la base de données a été perdue.<br />\nVous devriez mettre l'option PHP mysqli.reconnect à On dans le php.ini,<br />\npour permettre la reconnexion automatique au serveur.", ERROR); } else { trigger_error("La connexion à la base de données a été perdue", ERROR); } } if (count($abo_ids) > 0) { $sql = "UPDATE " . ABO_LISTE_TABLE . "\n\t\t\tSET send = 1\n\t\t\tWHERE abo_id IN(" . implode(', ', $abo_ids) . ")\n\t\t\t\tAND liste_id = " . $listdata['liste_id']; if (!$db->query($sql)) { trigger_error('Impossible de mettre à jour la table des abonnés (connexion au serveur sql perdue)', ERROR); } } $sql = "SELECT COUNT(*) AS num_dest, al.send\n\t\tFROM " . ABO_LISTE_TABLE . " AS al\n\t\t\tINNER JOIN " . ABONNES_TABLE . " AS a ON a.abo_id = al.abo_id\n\t\t\t\tAND a.abo_status = " . ABO_ACTIF . "\n\t\tWHERE al.liste_id = {$listdata['liste_id']}\n\t\t\tAND al.confirmed = " . SUBSCRIBE_CONFIRMED . "\n\t\tGROUP BY al.send"; if (!($result = $db->query($sql))) { trigger_error('Impossible d\'obtenir le nombre d\'envois restants à faire', ERROR); } while ($row = $result->fetch()) { if ($row['send'] == 1) { $sended = $row['num_dest']; } else { $no_send = $row['num_dest']; } } $result->free(); ftruncate($fp, 0); flock($fp, LOCK_UN); fclose($fp); if ($no_send > 0) { $message = sprintf($lang['Message']['Success_send'], $nl_config['emails_sended'], $sended, $sended + $no_send); if (!defined('IN_COMMANDLINE')) { if (!empty($_GET['step']) && $_GET['step'] == 'auto') { Location("envoi.php?mode=progress&id={$logdata['log_id']}&step=auto"); } $message .= '<br /><br />' . sprintf($lang['Click_resend_auto'], '<a href="' . sessid('./envoi.php?mode=progress&id=' . $logdata['log_id'] . '&step=auto') . '">', '</a>'); $message .= '<br /><br />' . sprintf($lang['Click_resend_manuel'], '<a href="' . sessid('./envoi.php?mode=progress&id=' . $logdata['log_id']) . '">', '</a>'); } } else { unlink($lockfile); $db->beginTransaction(); $sql = "UPDATE " . LOG_TABLE . "\n\t\t\tSET log_status = " . STATUS_SENDED . ",\n\t\t\t\tlog_numdest = {$sended}\n\t\t\tWHERE log_id = " . $logdata['log_id']; if (!$db->query($sql)) { trigger_error('Impossible de mettre à jour la table des logs', ERROR); } $sql = "UPDATE " . ABO_LISTE_TABLE . "\n\t\t\tSET send = 0\n\t\t\tWHERE liste_id = " . $listdata['liste_id']; if (!$db->query($sql)) { trigger_error('Impossible de mettre à jour la table des abonnés', ERROR); } $sql = "UPDATE " . LISTE_TABLE . "\n\t\t\tSET liste_numlogs = liste_numlogs + 1\n\t\t\tWHERE liste_id = " . $listdata['liste_id']; if (!$db->query($sql)) { trigger_error('Impossible de mettre à jour la table des listes', ERROR); } $db->commit(); $message = sprintf($lang['Message']['Success_send_finish'], $sended); } return $message; }