we wrote a PHP script that runs on our server that cleans everything up.
PHP Code:
<?php
define('DB_SERVER_NAME', 'localhost');
define('DB_USER_NAME', 'user');
define('DB_PASSWORD', 'pass');
$forum_dbs[] = 'db1';
$forum_dbs[] = 'db2';
$server = 'pop.gmail.com';
$user = 'email@email.com';
$password = 'password';
$conn = mysql_connect(DB_SERVER_NAME, DB_USER_NAME, DB_PASSWORD);
if ($conn) {
$port = '995/pop3/ssl';
set_time_limit(6000);
$link = imap_open("{".$server.":".$port."}INBOX",$user,$password);
if (!$link) {
echo "Cannot create POP3 connection to $server: ".imap_last_error();
return;
}
processMessages($link);
}
function processMessages($link, $max = 1000) {
$check = imap_check($link);
$num = $check->Nmsgs;
if ($num > $max) {
print "Processing first $max of $num messages\n";
$num = $max;
}
print "Processed messages will be deleted from mailbox\n";
for ($x=1; $x <= $num; $x++) {
set_time_limit(60);
flush();
print "processing $x of $num messages\n";
$processed = processBounce($link,$x);
// delete it anyway - we've seen it, tried to process it, no need to do it again
imap_mail_move($link, "$x:$x", "[Google Mail]/Trash");
flush();
}
flush();
print "\nClosing mailbox, and purging messages\n\n";
set_time_limit(60 * $num);
imap_expunge($link);
imap_close($link);
}
function processBounce($link,$num) {
global $forum_dbs, $conn;
$headerinfo = imap_headerinfo($link,$num);
$matched = false;
$subject = strtolower($headerinfo->subject);
if (strpos($subject, 'undelivered') !== false || strpos($subject, 'returned') !== false) {
$email_address = '';
$body = imap_body($link,$num);
$pos = strpos($body, 'Undelivered Message');
if ($pos) {
$body = substr($body, $pos);
preg_match ("/To: (.*)/i", $body, $match);
if (is_array($match) && isset($match[1])) $email_address = trim($match[1]);
}
if ($email_address) {
print "procesing email '$email_address'\n";
// loop through the dbs to find the user and turn off emails to that address
foreach ($forum_dbs as $db_name) {
if (mysql_select_db($db_name, $conn)) {
$query = "SELECT * FROM user WHERE email = '".mysql_real_escape_string($email_address) ."'";
$result = mysql_query($query, $conn);
if ($result && $user = mysql_fetch_assoc($result)) {
echo "cleaning user '$email_address' from $db_name\n";
$matched = true;
$user_id = $user['user_id'];
// no weekly newsletter
mysql_query("UPDATE user SET receivebulletin = 0 WHERE userid = $user_id", $conn);
// no longer receive admin emails
mysql_query("UPDATE user SET options = options - 16 WHERE options & 16 AND userid = $user_id", $conn);
}
}
}
}
}
return $matched;
}
?>
Couple notes:
- everything gets bounced to our Google Apps account, so your setup may be slightly different
- we have multiple forums that run to the same email address, so we pass an array of DB's