function post_notification_send() { global $wpdb, $timestart; if (get_option('post_notification_lock') == 'db') { if (!$wpdb->get_var("SELECT GET_LOCK('" . $wpdb->prefix . 'post_notification_lock' . "', 0)")) { return; } } else { $mutex = @fopen(POST_NOTIFICATION_PATH . '_temp/post_notification.lock', 'w'); if (!$mutex || !flock($mutex, LOCK_EX | LOCK_NB, $eWouldBlock) || $eWouldBlock) { // There is already someone mailing. @fclose($mutex); return; } } //Make sure plugins don't think we're a page or something.... $GLOBALS['wp_query']->init_query_flags(); ignore_user_abort(true); //Let's get this done.... //some general stuff $t_emails = $wpdb->prefix . 'post_notification_emails'; $t_posts = $wpdb->prefix . 'post_notification_posts'; $t_cats = $wpdb->prefix . 'post_notification_cats'; $posts = $wpdb->get_results("SELECT id, notification_sent " . post_notification_sql_posts_to_send()); if (!$posts) { //This shouldn't happen, but never mind. post_notification_set_next_send(); return; //Nothing to do. } //Include user functions, if they exist. //We don't want an error if the file does not exist. if (file_exists(POST_NOTIFICATION_PATH . 'userfunctions.php')) { include_once POST_NOTIFICATION_PATH . 'userfunctions.php'; } // Mail out mails $maxsend = get_option('post_notification_maxsend'); $mailssent = -1; $endtime = ini_get('max_execution_time'); if ($endtime != 0) { $endtime += floor($timestart) - 5; //Make shure we will have a least 5 sek left. } $time_remain = 1; foreach ($posts as $post) { if (get_option('post_notification_debug') == 'yes') { echo '<hr />Sending post: ' . $post->id . '<br />'; } //Find the categories if (get_option('db_version') < 6124) { $cats = $wpdb->get_results("SELECT category_id FROM " . $wpdb->post2cat . " WHERE post_id = " . $post->id); } else { $cats = $wpdb->get_results("SELECT term_id \r\n\t\t\t\t\t\t\t\t\t\tFROM " . $wpdb->term_relationships . " \r\n\t\t\t\t\t\t\t\t\t\tJOIN " . $wpdb->term_taxonomy . " USING (term_taxonomy_id)\r\n\t\t\t\t\t\t\t\t\t\tWHERE taxonomy = 'category' AND object_id = " . $post->id); } $cat_ids = array(); foreach ($cats as $cat) { if (get_option('db_version') < 6124) { $last_cat = $cat->category_id; } else { $last_cat = $cat->term_id; } while ($last_cat != 0) { $cat_ids[] = (string) $last_cat; if (get_option('db_version') < 6124) { $last_cat = $wpdb->get_var("SELECT category_parent FROM " . $wpdb->categories . " WHERE cat_ID = {$last_cat}"); } else { $last_cat = $wpdb->get_var("SELECT parent FROM " . $wpdb->term_taxonomy . " \r\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE term_id = {$last_cat} AND taxonomy = 'category'"); } } } $cat_ids[] = (string) $last_cat; $cat_ids = implode(", ", $cat_ids); //convert to string if (get_option('post_notification_debug') == 'yes') { echo 'The cat-Ids are: ' . $cat_ids . '<br />'; } // Get the Emailadds $emails = $wpdb->get_results(" SELECT e.email_addr, e.id, e.act_code" . " FROM {$t_emails} e, {$t_cats} c " . " WHERE c.cat_id IN ({$cat_ids}) AND c.id = e.id AND e.gets_mail = 1 AND e.id >= " . $post->notification_sent . " GROUP BY e.id " . " ORDER BY e.id ASC"); //We need this. Otherwise we can't be shure whether we already have sent mail. if (get_option('post_notification_debug') == 'yes') { echo count($emails) . ' Emails were found.<br />'; } if ($emails) { //Check wheater ther are any mails to send anything. //Get Data $maildata = post_notification_create_email($post->id); foreach ($emails as $email) { if (get_option('post_notification_debug') == 'yes') { echo 'Sending mail to: ' . $email->email_addr . '<br />'; } if ($endtime != 0) { //if this is 0 we have as much time as we want. $time_remain = $endtime - time(); } if ($maxsend < 1 || $time_remain < 0) { //Are we allowed to send any more mails? $mailssent = $email->id; //Save where we stoped break; } post_notification_sendmail($maildata, $email->email_addr, $email->act_code); $maxsend--; } } // Update notification_sent to -1 (We're done) $wpdb->query(" UPDATE {$t_posts} " . " SET " . " notification_sent = " . $mailssent . " WHERE post_id = " . $post->id); if ($maxsend < 1) { break; } //We dont need to go on, if there's nothing to send. } update_option('post_notification_lastsend', time()); post_notification_set_next_send(); if (get_option('post_notification_lock') == 'db') { $wpdb->query("SELECT RELEASE_LOCK('" . $wpdb->prefix . 'post_notification_lock' . "')"); } else { flock($mutex, LOCK_UN); fclose($mutex); } }
function post_notification_admin_sub() { global $wpdb; require_once POST_NOTIFICATION_PATH . 'sendmail.php'; echo '<h3>' . __('Test', 'post_notification') . '</h3>'; ?> <form id="test" method="post" action="admin.php?page=post_notification/admin.php&action=test"> <table width="100%"> <tr class="alternate"> <th style="text-align:right;padding-right:10px;"><?php _e('Post id:', 'post_notification'); ?> </th> <td> <input name="pid" type="text" size="35" value="<?php echo $_POST['pid']; ?> " /> </td> </tr> <tr class="alternate"> <td /> <td> <?php _e('This must be the ID of the post you want to send. You can find the ID under Manage->Posts.', 'post_notification'); ?> </td> </tr> <?php if (($email = $_POST['email']) == '') { $email = get_option('post_notification_from_email'); } ?> <tr class="alternate"> <th style="text-align:right;padding-right:10px;"><?php _e('Email:', 'post_notification'); ?> </th> <td> <input name="email" type="text" size="35" value="<?php echo $email; ?> " /> </td> </tr> <?php ///Find templates if (($template = $_POST['template']) == '') { $template = get_option('post_notification_template'); } $dir_handle = opendir(post_notification_get_profile_dir()); while (false !== ($file = readdir($dir_handle))) { if (substr($file, -5) == '.html' or substr($file, -4) == '.txt') { $en_templates .= "<option value=\"{$file}\" "; if ($file == $template) { $en_templates .= ' selected="selected"'; } $en_templates .= ">{$file}</option>"; } } closedir($dir_handle); ?> <tr class="alternate"> <th style="text-align:right;padding-right:10px;"><?php _e('Template:', 'post_notification'); ?> </th> <td> <select name="template" > <?php echo $en_templates; ?> </select> </td> </tr> <tr class="alternate"> <th style="text-align:right;padding-right:10px;"><?php _e('Do not send mail:', 'post_notification'); ?> </th> <td> <input type="checkbox" name="nosend" value="true" <?php if ($_POST['nosend'] == 'true') { echo ' checked="checked" '; } ?> /> </td> </tr> <tr class="alternate"> <td> </td> <td><input type="submit" name="updateSettings" value="<?php _e('Send test mail.', 'post_notification'); ?> " /></td> </tr> </table> </form> <?php //send of email if (isset($_POST['email']) && isset($_POST['pid'])) { echo '<h3>' . __('Email', 'post_notification') . '</h3>'; $t_emails = $wpdb->prefix . 'post_notification_emails'; $emails = $wpdb->get_results(" SELECT e.email_addr, e.id, e.act_code" . " FROM {$t_emails} e" . " WHERE e.email_addr = '" . $_POST['email'] . "'"); //We need this. Otherwise we can't be sure whether we already have sent mail. if (!$emails) { echo '<div class="error"> ' . __('Error:', 'post_notification') . ' ' . __('Email has to be in the database.', 'post_notification') . '</div>'; } else { $email = $emails[0]; if (file_exists(POST_NOTIFICATION_PATH . 'userfunctions.php')) { include_once POST_NOTIFICATION_PATH . 'userfunctions.php'; } $GLOBALS['wp_query']->init_query_flags(); $maildata = post_notification_create_email($_POST['pid'], $_POST['template']); $send = $_POST['nosend'] == 'true' ? false : true; $maildata = post_notification_sendmail($maildata, $email->email_addr, '', $send); //returns the modified body. if ($maildata['sent'] == false) { global $phpmailer; echo '<br/><b>The mail has not been sent!</b><br/>'; echo 'PHP-Mailer - Dump: <br/><pre>'; var_dump($phpmailer); echo '</pre>'; } echo '<b>Header:</b><BR><pre>'; echo $maildata['header']; echo '</pre><br /> <b>Subject:</b><pre>' . $maildata['subject'] . '</pre> </br>'; echo '<b>Body:</b><BR><pre>'; echo htmlspecialchars($maildata['body']); echo '</pre><br/>'; } } }