/** * Process the mailjet bounce emails * * @return boolean always returns true (for the api). at a later stage we should * fix this to return true on success / false on failure etc */ static function processBounces($mailingId = NULL) { require_once 'packages/mailjet-0.1/php-mailjet.class-mailjet-0.1.php'; // Create a new Mailjet Object @php-mailjet.class-mailjet-0.1.php $mj = new Mailjet(MAILJET_API_KEY, MAILJET_SECRET_KEY); //G: TODO $mj->debug = 0; if ($mailingId) { $apiParams = array('mailing_id' => $mailingId); $campaignJobId = 0; $mailJobResult = civicrm_api3('MailingJob', 'get', $apiParams); foreach ($mailJobResult['values'] as $jobId => $currentJob) { if (isset($currentJob['job_type'])) { $jobType = $currentJob['job_type']; //if job is not test if ($jobType == 'child') { $campaignJobId = $jobId; } } } $mailjetParams = array('custom_campaign' => CRM_Mailjet_BAO_Event::getMailjetCustomCampaignId($campaignJobId)); //G: https://uk.mailjet.com/docs/api/message/list //List all your messages (both transactional and campaign) with numerous filters. $response = $mj->messageList($mailjetParams); if (!$response) { return TRUE; //always return true - we don't process bounces if there is no reponse. } $campaign = $response->result[0]; //G: https://uk.mailjet.com/docs/api/report/emailbounce //Lists emails declared as bounce. //Call $response = $mj->reportEmailBounce(array('campaign_id' => $campaign->id)); } else { $response = $mj->reportEmailBounce(); } //Result $bounces = $response->bounces; foreach ($bounces as $bounce) { $params = array('email' => $bounce->email, 'sequential' => 1); $emailResult = civicrm_api3('Email', 'get', $params); if (!empty($emailResult['values'])) { //we always get the first result //TODO: might related to bounce record issue $contactId = $emailResult['values'][0]['contact_id']; $emailId = $emailResult['values'][0]['id']; $emailAddress = $emailResult['values'][0]['email']; if (!$bounce->customcampaign) { //do not process bounce if we dont have custom campaign continue; } $campaingArray = explode("MJ", $bounce->customcampaign); //TODO: related to bounce record issue $jobId = $campaingArray[0]; $mailingJobResult = civicrm_api3('MailingJob', 'get', array('id' => $jobId)); $mailingResult = civicrm_api3('Mailing', 'get', array('id' => $mailingJobResult['values'][$jobId]['mailing_id'])); $currentMailingId = 0; foreach ($mailingResult['values'] as $mailingId => $mailing) { $currentMailingId = $mailingId; } /*$params = array( 'mailing_id' => $mailingId, ); $result = civicrm_api3('MailingJob', 'get', $params); $jobIds = array(); foreach ($result['values'] as $id => $value) { $jobIds[] = $id; } $jobIds = implode(",", $jobIds); $params = array( 1 => array( $contactId, 'Integer'), 2 => array( $emailId, 'Integer') );*/ $query = "SELECT eq.id\n FROM civicrm_mailing_event_bounce eb\n LEFT JOIN civicrm_mailing_event_queue eq ON eq.id = eb.event_queue_id\n WHERE 1\n AND eq.job_id = {$jobId}\n AND eq.email_id = {$emailId}\n AND eq.contact_id = {$contactId}"; $dao = CRM_Core_DAO::executeQuery($query); $isBounceRecord = FALSE; while ($dao->fetch()) { $isBounceRecord = TRUE; break; } //if bounce record doesn't exsit so we record it if (!$isBounceRecord) { $bounceArray = array('is_spam' => FALSE, 'mailing_id' => $currentMailingId, 'job_id' => $jobId, 'contact_id' => $contactId, 'email_id' => $emailId, 'email' => $emailAddress, 'blocked' => 0, 'hard_bounce' => $bounce->hard_bounce, 'date_ts' => $bounce->date_ts, 'error_related_to' => $bounce->error_related_to, 'error' => $bounce->error); CRM_Mailjet_BAO_Event::recordBounce($bounceArray); } } } // always returns true, i.e. never fails :) return TRUE; }