X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=api%2Fv3%2FMailing.php;h=ed73b8a1ed26e3f8478102d78e81c7a24d080858;hb=a1a2a83db067ec5444f056ad3fa00e85fdc176ec;hp=74f7d8fc9ed6ccb48554e35705abb085b02b77e4;hpb=898f38ad65fe945087a16062f22c66bdf9e36e77;p=civicrm-core.git diff --git a/api/v3/Mailing.php b/api/v3/Mailing.php old mode 100644 new mode 100755 index 74f7d8fc9e..ed73b8a1ed --- a/api/v3/Mailing.php +++ b/api/v3/Mailing.php @@ -1,8 +1,7 @@ 'Mailing api "event_confirm" action is deprecated. Use the mailing_event_confirm api instead.'); @@ -184,7 +281,8 @@ function civicrm_api3_mailing_event_reply($params) { * Adjust Metadata for event_reply action * * The metadata is used for setting defaults, documentation & validation - * @param array $params array or parameters determined by getfields + * @param array $params + * Array or parameters determined by getfields. */ function _civicrm_api3_mailing_event_reply_spec(&$params) { $params['job_id']['api.required'] = 1; @@ -225,7 +323,8 @@ function civicrm_api3_mailing_event_forward($params) { * Adjust Metadata for event_forward action * * The metadata is used for setting defaults, documentation & validation - * @param array $params array or parameters determined by getfields + * @param array $params + * Array or parameters determined by getfields. */ function _civicrm_api3_mailing_event_forward_spec(&$params) { $params['job_id']['api.required'] = 1; @@ -246,7 +345,6 @@ function _civicrm_api3_mailing_event_forward_spec(&$params) { * @return array */ function civicrm_api3_mailing_event_click($params) { - civicrm_api3_verify_mandatory($params, 'CRM_Mailing_Event_DAO_TrackableURLOpen', array('event_queue_id', 'url_id'), @@ -290,10 +388,229 @@ function civicrm_api3_mailing_event_open($params) { return civicrm_api3_create_success($params); } +/** + * @param array $params + * @return array + * @throws \API_Exception + */ +function civicrm_api3_mailing_preview($params) { + civicrm_api3_verify_mandatory($params, + 'CRM_Mailing_DAO_Mailing', + array('id'), + FALSE + ); + + $fromEmail = NULL; + if (!empty($params['from_email'])) { + $fromEmail = $params['from_email']; + } + + $session = CRM_Core_Session::singleton(); + $mailing = new CRM_Mailing_BAO_Mailing(); + $mailing->id = $params['id']; + $mailing->find(TRUE); + + CRM_Mailing_BAO_Mailing::tokenReplace($mailing); + + // get and format attachments + $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing', $mailing->id); + + $returnProperties = $mailing->getReturnProperties(); + $contactID = CRM_Utils_Array::value('contact_id', $params); + if (!$contactID) { + $contactID = $session->get('userID'); + } + $mailingParams = array('contact_id' => $contactID); + + $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens()); + + $mime = &$mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail, + TRUE, $details[0][$contactID], $attachments + ); + + return civicrm_api3_create_success(array( + 'id' => $params['id'], + 'contact_id' => $contactID, + 'subject' => $mime->_headers['Subject'], + 'body_html' => $mime->getHTMLBody(), + 'body_text' => $mime->getTXTBody(), + )); +} + +/** + * @param array $spec + */ +function _civicrm_api3_mailing_send_test_spec(&$spec) { + $spec['test_group']['title'] = 'Test Group ID'; + $spec['test_email']['title'] = 'Test Email Address'; +} + +/** + * @param array $params + * @return array + * @throws \API_Exception + * @throws \CiviCRM_API3_Exception + */ +function civicrm_api3_mailing_send_test($params) { + if (!array_key_exists('test_group', $params) && !array_key_exists('test_email', $params)) { + throw new API_Exception("Mandatory key(s) missing from params array: test_group and/or test_email field are required"); + } + civicrm_api3_verify_mandatory($params, + 'CRM_Mailing_DAO_MailingJob', + array('mailing_id'), + FALSE + ); + + $testEmailParams = _civicrm_api3_generic_replace_base_params($params); + $testEmailParams['is_test'] = 1; + $job = civicrm_api3('MailingJob', 'create', $testEmailParams); + $testEmailParams['job_id'] = $job['id']; + $testEmailParams['emails'] = explode(',', $testEmailParams['test_email']); + if (!empty($params['test_email'])) { + $query = CRM_Utils_SQL_Select::from('civicrm_email e') + ->select(array('e.id', 'e.contact_id', 'e.email')) + ->join('c', 'INNER JOIN civicrm_contact c ON e.contact_id = c.id') + ->where('e.email IN (@emails)', array('@emails' => $testEmailParams['emails'])) + ->where('e.on_hold = 0') + ->where('c.is_opt_out = 0') + ->where('c.do_not_email = 0') + ->where('c.is_deceased = 0') + ->groupBy('e.id') + ->orderBy(array('e.is_bulkmail DESC', 'e.is_primary DESC')) + ->toSQL(); + $dao = CRM_Core_DAO::executeQuery($query); + $emailDetail = array(); + // fetch contact_id and email id for all existing emails + while ($dao->fetch()) { + $emailDetail[$dao->email] = array( + 'contact_id' => $dao->contact_id, + 'email_id' => $dao->id, + ); + } + $dao->free(); + foreach ($testEmailParams['emails'] as $key => $email) { + $email = trim($email); + $contactId = $emailId = NULL; + if (array_key_exists($email, $emailDetail)) { + $emailId = $emailDetail[$email]['email_id']; + $contactId = $emailDetail[$email]['contact_id']; + } + if (!$contactId) { + //create new contact. + $contact = civicrm_api3('Contact', 'create', + array( + 'contact_type' => 'Individual', + 'email' => $email, + 'api.Email.get' => array('return' => 'id'), + ) + ); + $contactId = $contact['id']; + $emailId = $contact['values'][$contactId]['api.Email.get']['id']; + } + civicrm_api3('MailingEventQueue', 'create', + array( + 'job_id' => $job['id'], + 'email_id' => $emailId, + 'contact_id' => $contactId, + ) + ); + } + } + + $isComplete = FALSE; + $config = CRM_Core_Config::singleton(); + $mailerJobSize = (property_exists($config, 'mailerJobSize')) ? $config->mailerJobSize : NULL; + while (!$isComplete) { + // Q: In CRM_Mailing_BAO_Mailing::processQueue(), the three runJobs*() + // functions are all called. Why does Mailing.send_test only call one? + // CRM_Mailing_BAO_MailingJob::runJobs_pre($mailerJobSize, NULL); + $isComplete = CRM_Mailing_BAO_MailingJob::runJobs($testEmailParams); + // CRM_Mailing_BAO_MailingJob::runJobs_post(NULL); + } + + //return delivered mail info + $mailDelivered = CRM_Mailing_Event_BAO_Delivered::getRows($params['mailing_id'], $job['id'], TRUE, NULL, NULL, NULL, TRUE); + + return civicrm_api3_create_success($mailDelivered); +} + +/** + * Adjust Metadata for send_mail action + * + * The metadata is used for setting defaults, documentation & validation + * @param array $params + * Array or parameters determined by getfields. + */ +function _civicrm_api3_mailing_stats_spec(&$params) { + $params['date']['api.default'] = 'now'; + $params['date']['title'] = 'Date'; +} + +/** + * @param array $params + * @return array + * @throws \API_Exception + */ +function civicrm_api3_mailing_stats($params) { + civicrm_api3_verify_mandatory($params, + 'CRM_Mailing_DAO_MailingJob', + array('mailing_id'), + FALSE + ); + + if ($params['date'] == 'now') { + $params['date'] = date('YmdHis'); + } + else { + $params['date'] = CRM_Utils_Date::processDate($params['date'] . ' ' . $params['date_time']); + } + + $stats[$params['mailing_id']] = array(); + if (empty($params['job_id'])) { + $params['job_id'] = NULL; + } + foreach (array('Delivered', 'Bounces', 'Unsubscribers', 'Unique Clicks', 'Opened') as $detail) { + switch ($detail) { + case 'Delivered': + $stats[$params['mailing_id']] += array( + $detail => CRM_Mailing_Event_BAO_Delivered::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date']), + ); + break; + + case 'Bounces': + $stats[$params['mailing_id']] += array( + $detail => CRM_Mailing_Event_BAO_Bounce::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date']), + ); + break; + + case 'Unsubscribers': + $stats[$params['mailing_id']] += array( + $detail => CRM_Mailing_Event_BAO_Unsubscribe::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, NULL, $params['date']), + ); + break; + + case 'Unique Clicks': + $stats[$params['mailing_id']] += array( + $detail => CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, NULL, $params['date']), + ); + break; + + case 'Opened': + $stats[$params['mailing_id']] += array( + $detail => CRM_Mailing_Event_BAO_Opened::getTotalCount($params['mailing_id'], $params['job_id'], FALSE, $params['date']), + ); + break; + } + } + return civicrm_api3_create_success($stats); +} + /** * Fix the reset dates on the email record based on when a mail was last delivered * We only consider mailings that were completed and finished in the last 3 to 7 days * Both the min and max days can be set via the params + * @param array $params + * @return array */ function civicrm_api3_mailing_update_email_resetdate($params) { CRM_Mailing_Event_BAO_Delivered::updateEmailResetDate( @@ -302,5 +619,3 @@ function civicrm_api3_mailing_update_email_resetdate($params) { ); return civicrm_api3_create_success(); } - -