<?php
/* This is a sample callback function for PHPMailer-BMH (Bounce Mail Handler).
* This callback function will echo the results of the BMH processing.
*/
/**
* Callback (action) function
*
* @param int $msgnum the message number returned by Bounce Mail Handler
* @param string $bounceType the bounce type:
* 'antispam','autoreply','concurrent','content_reject','command_reject','internal_error','defer','delayed'
* =>
* array('remove'=>0,'bounce_type'=>'temporary'),'dns_loop','dns_unknown','full','inactive','latin_only','other','oversize','outofoffice','unknown','unrecognized','user_reject','warning'
* @param string $email the target email address
* @param string $subject the subject, ignore now
* @param string $xheader the XBounceHeader from the mail
* @param bool $remove remove status, 1 means removed, 0 means not removed
* @param bool|string $ruleNo bounce Mail Handler detect rule no
* @param bool|string $ruleCat bounce Mail Handler detect rule category
* @param int $totalFetched total number of messages in the mailbox
* @param string $body Bounce Mail Body
* @param string $headerFull Bounce Mail Header
* @param string $bodyFull Bounce Mail Body (full)
*
* @return bool
*/
function callbackAction($msgnum, $bounceType, $email, $subject, $xheader, $remove, $ruleNo = false, $ruleCat = false, $totalFetched = 0, $body = '', $headerFull = '', $bodyFull = ''): bool
{
$currentTime = \date('Y-m-d H:i:s', \time());
$displayData = prepData($email, $bounceType, $remove);
$bounceType = $displayData['bounce_type'];
$emailName = $displayData['emailName'];
$emailAddy = $displayData['emailAddy'];
$remove = $displayData['remove'];
$removeraw = $displayData['removestat'];
$msg = $msgnum . ',' . $currentTime . ',' . $ruleNo . ',' . $ruleCat . ',' . $bounceType . ',' . $removeraw . ',' . $email . ',' . $subject;
$filename = 'logs/bouncelog_' . \date('m') . \date('Y') . '.csv';
if (!\file_exists($filename)) {
$tmsg = 'Msg#,Current Time,Rule Number,Rule Category,Bounce Type,Status,Email,Subject' . "\n" . $msg;
} else {
$fileContents = \file_get_contents($filename);
if (\stripos($fileContents, "\n" . $msgnum . ',') !== false) {
$doPutFile = false;
}
$tmsg = $msg;
}
$handle = \fopen($filename, 'ab');
if ($handle) {
if (\fwrite($handle, $tmsg . "\n") === false) {
echo 'Cannot write message<br />';
}
\fclose($handle);
} else {
echo 'Cannot open file to append<br />';
}
echo $msgnum . ': ' . $ruleNo . ' | ' . $ruleCat . ' | ' . $bounceType . ' | ' . $remove . ' | ' . $email . ' | ' . $subject . "<br />\n";
return true;
}
/**
* Function to clean the data from the Callback Function for optimized display
*
* @param $email
* @param $bounce_type
* @param $remove
*
* @return mixed
*/
function prepData($email, $bounce_type, $remove)
{
$data['bounce_type'] = \trim($bounce_type);
$data['email'] = '';
$data['emailName'] = '';
$data['emailAddy'] = '';
$data['remove'] = '';
if (\strpos($email, '<') !== false) {
$pos_start = \strpos($email, '<');
$data['emailName'] = \trim(\substr($email, 0, $pos_start));
$data['emailAddy'] = \substr($email, $pos_start + 1);
$pos_end = \strpos($data['emailAddy'], '>');
if ($pos_end) {
$data['emailAddy'] = \substr($data['emailAddy'], 0, $pos_end);
}
}
// replace the < and > able so they display on screen
// replace the < and > able so they display on screen
$email = \str_replace(['<', '>'], ['<', '>'], $email);
// replace the "TO:<" with nothing
$email = \str_ireplace('TO:<', '', $email);
$data['email'] = $email;
// account for legitimate emails that have no bounce type
if (\trim($bounce_type) == '') {
$data['bounce_type'] = 'none';
}
// change the remove flag from true or 1 to textual representation
if (\stripos($remove, 'moved') !== false && \stripos($remove, 'hard') !== false) {
$data['removestat'] = 'moved (hard)';
$data['remove'] = '<span style="color:red;">' . 'moved (hard)' . '</span>';
} elseif (\stripos($remove, 'moved') !== false && \stripos($remove, 'soft') !== false) {
$data['removestat'] = 'moved (soft)';
$data['remove'] = '<span style="color:gray;">' . 'moved (soft)' . '</span>';
} elseif ($remove == true || $remove == '1') {
$data['removestat'] = 'deleted';
$data['remove'] = '<span style="color:red;">' . 'deleted' . '</span>';
} else {
$data['removestat'] = 'not deleted';
$data['remove'] = '<span style="color:gray;">' . 'not deleted' . '</span>';
}
return $data;
}
|