CCrmEMail::EmailMessageAdd

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmEMail
  4. EmailMessageAdd
  • Модуль: 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; }

Добавить комментарий