...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_email.php
- Класс: \CCrmEMail
- Вызов: CCrmEMail::EmailMessageAdd
static function EmailMessageAdd($arMessageFields, $ACTION_VARS) { if(!CModule::IncludeModule('crm')) { return false; } $eventTag = sprintf('%x%x', time(), rand(0, 0xffffffff)); $date = $arMessageFields['FIELD_DATE'] ?? ''; $maxAgeDays = intval(COption::GetOptionString('crm', 'email_max_age', 7)); $maxAge = $maxAgeDays > 0 ? ($maxAgeDays * 86400) : 0; if($maxAge > 0 && $date !== '') { $now = time() + CTimeZone::GetOffset(); $timestamp = MakeTimeStamp($date, FORMAT_DATETIME); if( ($now - $timestamp) > $maxAge) { //Time threshold is exceeded return false; } } $crmEmail = mb_strtolower(trim(COption::GetOptionString('crm', 'mail', ''))); $messageId = isset($arMessageFields['ID']) ? intval($arMessageFields['ID']) : 0; $mailboxId = isset($arMessageFields['MAILBOX_ID']) ? intval($arMessageFields['MAILBOX_ID']) : 0; if (empty($mailboxId)) { static::log( $eventTag, 'CCrmEmail: empty MAILBOX_ID', array( 'ID' => $messageId, 'MAILBOX_ID' => $mailboxId, ) ); return false; } $from = $arMessageFields['FIELD_FROM'] ?? ''; $replyTo = $arMessageFields['FIELD_REPLY_TO'] ?? ''; if($replyTo !== '') { // Ignore FROM if REPLY_TO EXISTS $from = $replyTo; } $addresserInfo = CCrmMailHelper::ParseEmail($from); if($crmEmail !== '' && strcasecmp($addresserInfo['EMAIL'], $crmEmail) === 0) { // Ignore emails from ourselves return false; } $to = $arMessageFields['FIELD_TO'] ?? ''; $cc = $arMessageFields['FIELD_CC'] ?? ''; $bcc = $arMessageFields['FIELD_BCC'] ?? ''; $addresseeEmails = array_unique( array_merge( $to !== '' ? CMailUtil::ExtractAllMailAddresses($to) : array(), $cc !== '' ? CMailUtil::ExtractAllMailAddresses($cc) : array(), $bcc !== '' ? CMailUtil::ExtractAllMailAddresses($bcc) : array()), SORT_STRING ); $mailbox = \CMailBox::getById($mailboxId)->fetch(); if (empty($mailbox)) { static::log( $eventTag, 'CCrmEmail: empty mailbox', array( 'ID' => $messageId, 'MAILBOX_ID' => $mailboxId, ) ); return false; } $mailboxOwnerId = (int)$mailbox['USER_ID'] ?? 0; // POP3 mailboxes are ignored - they bound to single email if ( $mailbox && $mailbox['SERVER_TYPE'] === 'smtp' && (empty($crmEmail) || !in_array($crmEmail, $addresseeEmails, true)) ) { return false; } $subject = trim($arMessageFields['SUBJECT']) ?: getMessage('CRM_EMAIL_DEFAULT_SUBJECT'); $body = $arMessageFields['BODY'] ?? ''; $arBodyEmails = null; $userID = 0; $parentID = 0; $ownerTypeID = CCrmOwnerType::Undefined; $ownerID = 0; $addresserID = self::FindUserIDByEmail($addresserInfo['EMAIL']); if($addresserID > 0 && Bitrix\Crm\Integration\IntranetManager::isExternalUser($addresserID)) { //Forget about extranet user $addresserID = 0; } $arCommEmails = $addresserID <= 0 ? array($addresserInfo['EMAIL']) : ($crmEmail !== '' ? array_diff($addresseeEmails, array($crmEmail)) : $addresseeEmails); //Trying to fix strange behaviour of array_diff under OPcache (issue #60862) $arCommEmails = array_filter($arCommEmails); $targInfo = CCrmActivity::ParseUrn( CCrmActivity::ExtractUrnFromMessage( $arMessageFields, CCrmEMailCodeAllocation::GetCurrent() ) ); $targActivity = $targInfo['ID'] > 0 ? CCrmActivity::GetByID($targInfo['ID'], false) : null; // Check URN if ($targActivity && (!isset($targActivity['URN']) || mb_strtoupper($targActivity['URN']) !== mb_strtoupper($targInfo['URN']))) { $targActivity = null; } if($targActivity) { $postingID = self::ExtractPostingID($arMessageFields); if($postingID > 0 && isset($targActivity['ASSOCIATED_ENTITY_ID']) && intval($targActivity['ASSOCIATED_ENTITY_ID']) === $postingID) { // Ignore - it is our message. return false; } $parentID = $targActivity['ID']; $subject = CCrmActivity::ClearUrn($subject); if($addresserID > 0) { $userID = $addresserID; } elseif(isset($targActivity['RESPONSIBLE_ID'])) { $userID = $targActivity['RESPONSIBLE_ID']; } if(isset($targActivity['OWNER_TYPE_ID'])) { $ownerTypeID = intval($targActivity['OWNER_TYPE_ID']); } if(isset($targActivity['OWNER_ID'])) { $ownerID = intval($targActivity['OWNER_ID']); } $arCommData = self::ExtractCommsFromEmails($arCommEmails); if($ownerTypeID > 0 && $ownerID > 0) { if(empty($arCommData)) { if($addresserID > 0) { foreach($addresseeEmails as $email) { if($email === $crmEmail) { continue; } $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $email)); } } else { $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $addresserInfo['EMAIL'])); } } elseif($ownerTypeID !== CCrmOwnerType::Deal) { //Check if owner in communications. If owner is found then clear outsider communications. Otherwise reset owner. //There is only one exception for DEAL - it entity does not have communications $ownerCommunications = array(); foreach($arCommData as $arCommItem) { $commEntityTypeID = isset($arCommItem['ENTITY_TYPE_ID']) ? $arCommItem['ENTITY_TYPE_ID'] : CCrmOwnerType::Undefined; $commEntityID = isset($arCommItem['ENTITY_ID']) ? $arCommItem['ENTITY_ID'] : 0; if($commEntityTypeID === $ownerTypeID && $commEntityID === $ownerID) { $ownerCommunications[] = $arCommItem; } } if(empty($ownerCommunications)) { $ownerTypeID = CCrmOwnerType::Undefined; $ownerID = 0; } else { $arCommData = $ownerCommunications; } } } } else { if($addresserID > 0) { //It is email from registered user $userID = $addresserID; if(empty($arCommEmails)) { $arBodyEmails = self::ExtractEmailsFromBody($body); //Clear system user emails and CRM email if(!empty($arBodyEmails)) { foreach($arBodyEmails as $email) { if(strcasecmp($email, $crmEmail) !== 0 && self::FindUserIDByEmail($email) <= 0) { $arCommEmails[] = $email; } } } } // Try to resolve communications $arCommData = self::ExtractCommsFromEmails($arCommEmails); } else { //It is email from unknown user //Try to resolve bindings from addresser $arCommData = self::ExtractCommsFromEmails($arCommEmails); if(!empty($arCommData)) { // Try to resolve responsible user foreach($arCommData as &$arComm) { $userID = self::ResolveResponsibleID( $arComm['ENTITY_TYPE_ID'], $arComm['ENTITY_ID'] ); if($userID > 0) { break; } } unset($arComm); } } // Try to resolve owner by old-style method--> $arACTION_VARS = explode('&', $ACTION_VARS); for ($i=0, $ic=count($arACTION_VARS); $i < $ic ; $i++) { $v = $arACTION_VARS[$i]; if($pos = mb_strpos($v, '=')) { $name = mb_substr($v, 0, $pos); ${$name} = urldecode(mb_substr($v, $pos + 1)); } } $arTypeNames = CCrmOwnerType::GetNames( array( CCrmOwnerType::Lead, CCrmOwnerType::Deal, CCrmOwnerType::Contact, CCrmOwnerType::Company ) ); foreach ($arTypeNames as $typeName) { $regexVar = 'W_CRM_ENTITY_REGEXP_'.$typeName; if (empty(${$regexVar})) { continue; } $regexp = '/'.${$regexVar}.'/i'.BX_UTF_PCRE_MODIFIER; $match = array(); if (preg_match($regexp, $subject, $match) === 1) { $ownerID = (int)$match[1]; $ownerTypeID = CCrmOwnerType::ResolveID($typeName); $subject = preg_replace($regexp, '', $subject); break; } } // <-- Try to resolve owner by old-style method if($ownerID > 0 && CCrmOwnerType::IsDefined($ownerTypeID)) { // Filter communications by owner if($ownerTypeID !== CCrmOwnerType::Deal) { if(!empty($arCommData)) { foreach($arCommData as $commKey => $arComm) { if($arComm['ENTITY_TYPE_ID'] === $ownerTypeID && $arComm['ENTITY_ID'] === $ownerID) { continue; } unset($arCommData[$commKey]); } $arCommData = array_values($arCommData); } if(empty($arCommData)) { if($addresserID > 0) { foreach($addresseeEmails as $email) { if($email === $crmEmail) { continue; } $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $email)); } } else { $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $addresserInfo['EMAIL'])); } } } else { // Deal does not have communications. But lead communications are strange for this context. // It is important for explicit binding mode (like text [DID#100] in subject). Try to get rid of lead communications. $arCommTypeMap = array(); foreach($arCommData as $commKey => $arComm) { $commTypeID = $arComm['ENTITY_TYPE_ID']; if(!isset($arCommTypeMap[$commTypeID])) { $arCommTypeMap[$commTypeID] = array(); } $arCommTypeMap[$commTypeID][] = $arComm; } if(isset($arCommTypeMap[CCrmOwnerType::Contact]) || isset($arCommTypeMap[CCrmOwnerType::Company])) { if(isset($arCommTypeMap[CCrmOwnerType::Contact]) && isset($arCommTypeMap[CCrmOwnerType::Company])) { $arCommData = array_merge($arCommTypeMap[CCrmOwnerType::Contact], $arCommTypeMap[CCrmOwnerType::Company]); } elseif(isset($arCommTypeMap[CCrmOwnerType::Contact])) { $arCommData = $arCommTypeMap[CCrmOwnerType::Contact]; } else//if(isset($arCommTypeMap[CCrmOwnerType::Company])) { $arCommData = $arCommTypeMap[CCrmOwnerType::Company]; } } } } } $arBindingData = self::ConvertCommsToBindings($arCommData); // Check bindings for converted leads --> // Not Existed entities are ignored. Converted leads are ignored if their associated entities (contacts, companies, deals) are contained in bindings. $arCorrectedBindingData = array(); $arConvertedLeadData = array(); foreach($arBindingData as $bindingKey => &$arBinding) { if($arBinding['TYPE_ID'] !== CCrmOwnerType::Lead) { if(self::IsEntityExists($arBinding['TYPE_ID'], $arBinding['ID'])) { $arCorrectedBindingData[$bindingKey] = $arBinding; } continue; } $arFields = self::GetEntity( CCrmOwnerType::Lead, $arBinding['ID'], array('STATUS_ID') ); if(!is_array($arFields)) { continue; } if(isset($arFields['STATUS_ID']) && $arFields['STATUS_ID'] === 'CONVERTED') { $arConvertedLeadData[$bindingKey] = $arBinding; } else { $arCorrectedBindingData[$bindingKey] = $arBinding; } } unset($arBinding); foreach($arConvertedLeadData as &$arConvertedLead) { $leadID = $arConvertedLead['ID']; $exists = false; $dbRes = CCrmCompany::GetListEx( array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID') ); if($dbRes) { while($arRes = $dbRes->Fetch()) { if(isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Company, $arRes['ID'])])) { $exists = true; break; } } } if($exists) { continue; } $dbRes = CCrmContact::GetListEx( array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID') ); if($dbRes) { while($arRes = $dbRes->Fetch()) { if(isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Contact, $arRes['ID'])])) { $exists = true; break; } } } if($exists) { continue; } $dbRes = CCrmDeal::GetListEx( array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID') ); if($dbRes) { while($arRes = $dbRes->Fetch()) { if(isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Deal, $arRes['ID'])])) { $exists = true; break; } } } if($exists) { continue; } $arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Lead, $leadID)] = $arConvertedLead; } unset($arConvertedLead); $arBindingData = $arCorrectedBindingData; // <-- Check bindings for converted leads // If no bindings are found then create new lead from this message // Skip lead creation if email list is empty. Otherwise we will create lead with no email-addresses. It is absolutely useless. $emailQty = count($arCommEmails); if(empty($arBindingData) && $emailQty > 0) { if(mb_strtoupper(COption::GetOptionString('crm', 'email_create_lead_for_new_addresser', 'Y')) !== 'Y') { // Creation of new lead is not allowed return true; } //"Lead from forwarded email..." or "Lead from email..." $title = trim($arMessageFields['SUBJECT']) ?: GetMessage( $addresserID > 0 ? 'CRM_MAIL_LEAD_FROM_USER_EMAIL_TITLE' : 'CRM_MAIL_LEAD_FROM_EMAIL_TITLE', array('%SENDER%' => $addresserInfo['ORIGINAL']) ); $comment = ''; if($body !== '') { // Remove extra new lines (fix for #31807) $comment = preg_replace("/(\r\n|\n|\r)+/", '
', htmlspecialcharsbx($body)); } if($comment === '') { $comment = htmlspecialcharsbx($subject); } $name = ''; if($addresserID <= 0) { $name = $addresserInfo['NAME']; } else { //Try get name from body for($i = 0; $i < $emailQty; $i++) { $email = $arCommEmails[$i]; $match = array(); if(preg_match('/"([^"]+)"\s*<'.$email.'>/i'.BX_UTF_PCRE_MODIFIER, $body, $match) === 1 && count($match) > 1) { $name = $match[1]; break; } if(preg_match('/"([^"]+)"\s*[\s*mailto\:\s*'.$email.']/i'.BX_UTF_PCRE_MODIFIER, $body, $match) === 1 && count($match) > 1) { $name = $match[1]; break; } } if($name === '') { $name = $arCommEmails[0]; } } $arLeadFields = array( 'TITLE' => $title, 'NAME' => $name, 'STATUS_ID' => 'NEW', 'COMMENTS' => $comment, 'SOURCE_DESCRIPTION' => GetMessage('CRM_MAIL_LEAD_FROM_EMAIL_SOURCE', array('%SENDER%' => $addresserInfo['ORIGINAL'])), 'FM' => array( 'EMAIL' => array() ) ); $sourceList = CCrmStatus::GetStatusList('SOURCE'); $sourceID = COption::GetOptionString('crm', 'email_lead_source_id', ''); if($sourceID === '' || !isset($sourceList[$sourceID])) { if(isset($sourceList['EMAIL'])) { $sourceID = 'EMAIL'; } elseif(isset($sourceList['OTHER'])) { $sourceID = 'OTHER'; } } if($sourceID !== '') { $arLeadFields['SOURCE_ID'] = $sourceID; } $responsibleID = self::GetDefaultResponsibleID(CCrmOwnerType::Lead); if($responsibleID > 0) { $arLeadFields['CREATED_BY_ID'] = $arLeadFields['MODIFY_BY_ID'] = $arLeadFields['ASSIGNED_BY_ID'] = $responsibleID; if($userID === 0) { $userID = $responsibleID; } } for($i = 0; $i < $emailQty; $i++) { $arLeadFields['FM']['EMAIL']['n'.($i + 1)] = array( 'VALUE_TYPE' => 'WORK', 'VALUE' => $arCommEmails[$i] ); } $leadEntity = new CCrmLead(false); $leadID = $leadEntity->Add( $arLeadFields, true, array( 'DISABLE_USER_FIELD_CHECK' => true, 'REGISTER_SONET_EVENT' => true, 'CURRENT_USER' => $responsibleID ) ); // TODO: log error if($leadID > 0) { $arBizProcErrors = array(); CCrmBizProcHelper::AutoStartWorkflows( CCrmOwnerType::Lead, $leadID, CCrmBizProcEventType::Create, $arBizProcErrors ); //Region automation $starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $leadID); $starter->setUserId($userID)->runOnAdd(); //End region $arCommData = array(); for($i = 0; $i < $emailQty; $i++) { $arCommData[] = self::CreateComm( CCrmOwnerType::Lead, $leadID, $arCommEmails[$i] ); } $arBindingData = array( self::PrepareEntityKey(CCrmOwnerType::Lead, $leadID) => self::CreateBinding(CCrmOwnerType::Lead, $leadID) ); } } // Terminate processing if no bindings are found. if(empty($arBindingData)) { // Try to export vcf-files before exit if email from registered user if($addresserID > 0) { $dbAttachment = CMailAttachment::GetList(array(), array('MESSAGE_ID' => $messageId)); while ($arAttachment = $dbAttachment->Fetch()) { if(GetFileExtension(mb_strtolower($arAttachment['FILE_NAME'])) === 'vcf') { if ($arAttachment['FILE_ID']) $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); self::TryImportVCard($arAttachment['FILE_DATA']); } } } return false; } // If owner info not defined set it by default if($ownerID <= 0 || $ownerTypeID <= 0) { if(count($arBindingData) > 1) { // Search owner in specified order: Contact, Company, Lead. $arTypeIDs = array( CCrmOwnerType::Contact, CCrmOwnerType::Company, CCrmOwnerType::Lead ); foreach($arTypeIDs as $typeID) { foreach($arBindingData as &$arBinding) { if($arBinding['TYPE_ID'] === $typeID) { $ownerTypeID = $typeID; $ownerID = $arBinding['ID']; break; } } unset($arBinding); if($ownerID > 0 && $ownerTypeID > 0) { break; } } } if($ownerID <= 0 || $ownerTypeID <= 0) { $arBinding = array_shift(array_values($arBindingData)); $ownerTypeID = $arBinding['TYPE_ID']; $ownerID = $arBinding['ID']; } } // Precessing of attachments --> $attachmentMaxSizeMb = intval(COption::GetOptionString('crm', 'email_attachment_max_size', 24)); $attachmentMaxSize = $attachmentMaxSizeMb > 0 ? ($attachmentMaxSizeMb * 1048576) : 0; $arFilesData = array(); $dbAttachment = CMailAttachment::GetList(array(), array('MESSAGE_ID' => $messageId)); $arBannedAttachments = array(); while ($arAttachment = $dbAttachment->Fetch()) { if (GetFileExtension(mb_strtolower($arAttachment['FILE_NAME'])) === 'vcf') { if ($arAttachment['FILE_ID']) $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); self::TryImportVCard($arAttachment['FILE_DATA']); } $fileSize = isset($arAttachment['FILE_SIZE']) ? intval($arAttachment['FILE_SIZE']) : 0; if($fileSize <= 0) { //Skip zero lenth files continue; } if($attachmentMaxSize > 0 && $fileSize > $attachmentMaxSize) { //File size limit is exceeded $arBannedAttachments[] = array( 'name' => $arAttachment['FILE_NAME'], 'size' => $fileSize ); continue; } if ($arAttachment['FILE_ID'] && empty($arAttachment['FILE_DATA'])) $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); $arFilesData[] = array( 'name' => $arAttachment['FILE_NAME'], 'type' => $arAttachment['CONTENT_TYPE'], 'content' => $arAttachment['FILE_DATA'], //'size' => $arAttachment['FILE_SIZE'], // HACK: Must be commented if use CFile:SaveForDB 'MODULE_ID' => 'crm' ); } //<-- Precessing of attachments // Remove extra new lines (fix for #31807) $body = preg_replace("/(\r\n|\n|\r)+/", PHP_EOL, $body); $encodedBody = htmlspecialcharsbx($body); // Creating of new event --> $arEventBindings = array(); foreach($arBindingData as &$arBinding) { $arEventBindings[] = array( 'ENTITY_TYPE' => $arBinding['TYPE_NAME'], 'ENTITY_ID' => $arBinding['ID'] ); } unset($arBinding); $eventText = ''; $eventText .= ''.GetMessage('CRM_EMAIL_SUBJECT').': '.$subject.PHP_EOL; $eventText .= ''.GetMessage('CRM_EMAIL_FROM').': '.$addresserInfo['EMAIL'].PHP_EOL; $eventText .= ''.GetMessage('CRM_EMAIL_TO').': '.implode('; ', $addresseeEmails).PHP_EOL; if(!empty($arBannedAttachments)) { $eventText .= ''.GetMessage('CRM_EMAIL_BANNENED_ATTACHMENTS', array('%MAX_SIZE%' => $attachmentMaxSizeMb)).': '; foreach($arBannedAttachments as &$attachmentInfo) { $eventText .= GetMessage( 'CRM_EMAIL_BANNENED_ATTACHMENT_INFO', array( '%NAME%' => $attachmentInfo['name'], '%SIZE%' => round($attachmentInfo['size'] / 1048576, 1) ) ); } unset($attachmentInfo); $eventText .= PHP_EOL; } $eventText .= $encodedBody; $CCrmEvent = new CCrmEvent(); $CCrmEvent->Add( array( 'USER_ID' => $userID, 'ENTITY' => array_values($arEventBindings), 'ENTITY_TYPE' => CCrmOwnerType::ResolveName($ownerTypeID), 'ENTITY_ID' => $ownerID, 'EVENT_NAME' => GetMessage('CRM_EMAIL_GET_EMAIL'), 'EVENT_TYPE' => 2, 'EVENT_TEXT_1' => $eventText, 'FILES' => $arFilesData, ), false ); // <-- Creating of new event // Creating new activity --> $storageTypeID = CCrmActivity::GetDefaultStorageTypeID(); $arElementIDs = array(); foreach($arFilesData as $fileData) { $fileID = CFile::SaveFile($fileData, 'crm', true); if (!($fileID > 0)) continue; $fileData = \CFile::getFileArray($fileID); if (empty($fileData)) continue; if (trim($fileData['ORIGINAL_NAME']) == '') $fileData['ORIGINAL_NAME'] = $fileData['FILE_NAME']; $elementID = StorageManager::saveEmailAttachment( $fileData, $storageTypeID, '', array('USER_ID' => $userID) ); if($elementID > 0) { $arElementIDs[] = (int)$elementID; } } $descr = preg_replace("/(\r\n|\n|\r)/", '
', htmlspecialcharsbx($body)); $now = (string) (new \Bitrix\Main\Type\DateTime()); $direction = CCrmActivityDirection::Incoming; $completed = 'N'; // Incomming emails must be marked as 'Not Completed'. if ($addresserID > 0) { if (ActivitySettings::getValue(ActivitySettings::MARK_FORWARDED_EMAIL_AS_OUTGOING)) { $direction = CCrmActivityDirection::Outgoing; $completed = 'Y'; } \Bitrix\Main\Config\Option::set( 'crm', 'email_forwarded_cnt', \Bitrix\Main\Config\Option::get('crm', 'email_forwarded_cnt', 0) + 1 ); } $arActivityFields = array( 'OWNER_ID' => $ownerID, 'OWNER_TYPE_ID' => $ownerTypeID, 'TYPE_ID' => CCrmActivityType::Email, 'ASSOCIATED_ENTITY_ID' => 0, 'PARENT_ID' => $parentID, 'SUBJECT' => $subject, 'START_TIME' => $now, 'END_TIME' => $now, 'COMPLETED' => $completed, 'AUTHOR_ID' => $userID, 'RESPONSIBLE_ID' => $userID, 'PRIORITY' => CCrmActivityPriority::Medium, 'DESCRIPTION' => $descr, 'DESCRIPTION_TYPE' => CCrmContentType::Html, 'DIRECTION' => $direction, 'LOCATION' => '', 'NOTIFY_TYPE' => CCrmActivityNotifyType::None, 'STORAGE_TYPE_ID' => $storageTypeID, 'STORAGE_ELEMENT_IDS' => $arElementIDs ); $arActivityFields['BINDINGS'] = array(); foreach($arBindingData as &$arBinding) { $entityTypeID = $arBinding['TYPE_ID']; $entityID = $arBinding['ID']; if($entityTypeID <= 0 || $entityID <= 0) { continue; } $arActivityFields['BINDINGS'][] = array( 'OWNER_TYPE_ID' => $entityTypeID, 'OWNER_ID' => $entityID ); } unset($arBinding); if (!empty($arCommData)) $arActivityFields['COMMUNICATIONS'] = $arCommData; $activityID = CCrmActivity::Add($arActivityFields, false, false, array('REGISTER_SONET_EVENT' => true)); if ($activityID > 0) { if ($direction === CCrmActivityDirection::Incoming) { \Bitrix\Crm\Automation\Trigger\EmailTrigger::execute($arActivityFields['BINDINGS'], $arActivityFields); } } //Notify the responsible user that the message was added automatically(when syncing a mailbox) to CRM if($userID > 0 && $direction === CCrmActivityDirection::Incoming) { CCrmActivity::Notify($arActivityFields, CCrmNotifierSchemeType::IncomingEmail, '', false, []); } return true; }