#! /usr/bin/php4 -f "users", 'SITE' => "users", 'COMMNTY' => "users", 'DVLPR' => "users,user_group", 'ADMIN' => "users,user_group,groups", 'SFDVLPR' => "users,user_group", ); // This tables maps mailing types to WHERE subclauses which select // appropriate users $cond_mapping = array( 'ALL' => "", 'SITE' => "AND mail_siteupdates=1", 'COMMNTY' => "AND mail_va=1", 'DVLPR' => "AND users.user_id=user_group.user_id", 'ADMIN' => "AND users.user_id=user_group.user_id AND user_group.admin_flags='A' AND groups.status='A' AND groups.group_id=user_group.group_id", 'SFDVLPR' => "AND users.user_id=user_group.user_id AND user_group.group_id=1" ); $mail_res = db_query("SELECT * FROM massmail_queue WHERE finished_date=0 ORDER BY queued_date"); /* If there was error, notify admins, but don't be pesky */ if (!$mail_res) { $err .= "cannot execute query to select pending mailings\n"; $hrs = time()/(60*60); // Send reminder every second day at 11am if (($hrs%24)==11 && (($hrs/24)%2)==1) { global $sys_default_domain; util_send_message( "admin@$sys_default_domain", "ATT: Problems with massmail cron script", "This is automatically generated message from\n" ."the mass mailing cron script of $sys_name\n" ."installation. There was error querying massmail_queue\n" ."database table. Please take appropriate actions.\n" ); } cron_entry(6,$err); } // $err .= "Got ".db_numrows($mail_res)." rows\n"; if (db_numrows($mail_res)<1) { // Nothing to send exit(); } $type = db_result($mail_res, 0, 'type'); if (!$table_mapping[$type]) { $err .= "Unknown mailing type\n"; cron_entry(6,$err); exit(); } $subj = db_result($mail_res, 0, 'subject'); $mail_id = db_result($mail_res, 0, 'id'); //$err .= "Got mail to send: ".$subj."\n"; $sql = "SELECT users.user_id,users.user_name,users.realname,users.email,users.confirm_hash FROM $table_mapping[$type] WHERE users.user_id>".db_result($mail_res, 0, 'last_userid')." AND users.status='A' ".$cond_mapping[$type]." ORDER BY users.user_id"; //$err .= $sql; // Get next chunk of users to mail $users_res = db_query($sql); $err .= "Mailing ".db_numrows($users_res)." users.\n"; // If no more users left, we've finished with this mailing if ($users_res && db_numrows($users_res)==0) { db_query("UPDATE massmail_queue SET failed_date=0,finished_date='".time()."' WHERE id='$mail_id'"); exit(); } // These mailing types should include unsubscription info if ($type=='SITE' || $type=='COMMNTY') { $tail = "\r\n==================================================================\r\n" ."You receive this message because you subscribed to $sys_name\r\n" ."site mailing(s). You may opt out from some of them selectively\r\n" ."by logging in to $sys_name and visiting your Account Maintenance\r\n" ."page (http://$sys_default_domain/account/), or disable them altogether\r\n" ."by visiting following link:\r\n" ."\r\n"; } $body = db_result($mail_res, 0, 'message'); // Actual mailing loop while ($row =& db_fetch_array($users_res)) { util_send_message($row['email'],$subj,$body."\r\n".sprintf( $tail,$row['confirm_hash'] ),'noreply@'.$sys_default_domain ); //echo "$row[email],$subj,$body.\r\n".sprintf( $tail,$row['confirm_hash'] ).",'noreply@'.$sys_default_domain"; echo "\n".$row['email'].$row['user_id']; $last_userid = $row['user_id']; sleep($SLEEP); } $sql="UPDATE massmail_queue SET failed_date=0, last_userid='999999999' WHERE id='$mail_id'"; db_query($sql); if (db_error()) { $err .= $sql.db_error(); } cron_entry(6,$err); ?>