/** * Create an activity for a case via email * * @param int $file email sent * * @return array|void $activity object of newly creted activity via email@access public */ static function recordActivityViaEmail($file) { if (!file_exists($file) || !is_readable($file)) { return CRM_Core_Error::fatal(ts('File %1 does not exist or is not readable', array(1 => $file))); } $result = CRM_Utils_Mail_Incoming::parse($file); if ($result['is_error']) { return $result; } foreach ($result['to'] as $to) { $caseId = NULL; $emailPattern = '/^([A-Z0-9._%+-]+)\\+([\\d]+)@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i'; $replacement = preg_replace($emailPattern, '$2', $to['email']); if ($replacement !== $to['email']) { $caseId = $replacement; //if caseId is invalid, return as error file if (!CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseId, 'id')) { return CRM_Core_Error::createAPIError(ts('Invalid case ID ( %1 ) in TO: field.', array(1 => $caseId))); } } else { continue; } // TODO: May want to replace this with a call to getRelatedAndGlobalContacts() when this feature is revisited. // (Or for efficiency call the global one outside the loop and then union with this each time.) $contactDetails = self::getRelatedContacts($caseId, TRUE); if (!empty($contactDetails[$result['from']['id']])) { $params = array(); $params['subject'] = $result['subject']; $params['activity_date_time'] = $result['date']; $params['details'] = $result['body']; $params['source_contact_id'] = $result['from']['id']; $params['status_id'] = CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name'); $details = CRM_Case_PseudoConstant::caseActivityType(); $matches = array(); preg_match('/^\\W+([a-zA-Z0-9_ ]+)(\\W+)?\\n/i', $result['body'], $matches); if (!empty($matches) && isset($matches[1])) { $activityType = trim($matches[1]); if (isset($details[$activityType])) { $params['activity_type_id'] = $details[$activityType]['id']; } } if (!isset($params['activity_type_id'])) { $params['activity_type_id'] = CRM_Core_OptionGroup::getValue('activity_type', 'Inbound Email', 'name'); } // create activity $activity = CRM_Activity_BAO_Activity::create($params); $caseParams = array('activity_id' => $activity->id, 'case_id' => $caseId); self::processCaseActivity($caseParams); } else { return CRM_Core_Error::createAPIError(ts('FROM email contact %1 doesn\'t have a relationship to the referenced case.', array(1 => $result['from']['email']))); } } }
/** * Convert an email file to an activity */ function civicrm_activity_processemail($file, $activityTypeID, $result = array()) { // do not parse if result array already passed (towards EmailProcessor..) if (empty($result)) { // might want to check that email is ok here if (!file_exists($file) || !is_readable($file)) { return CRM_Core_Error::createAPIError(ts('File %1 does not exist or is not readable', array(1 => $file))); } } require_once 'CRM/Utils/Mail/Incoming.php'; $result = CRM_Utils_Mail_Incoming::parse($file); if ($result['is_error']) { return $result; } $params = _civicrm_activity_buildmailparams($result, $activityTypeID); return civicrm_activity_create($params); }