static function TrySendEmail($ID, &$arFields, &$arErrors)
{
if (!CModule::IncludeModule('subscribe'))
{
$arErrors[] = array('CODE' => self::ERR_CANT_LOAD_SUBSCRIBE);
return false;
}
$ID = intval($ID);
if($ID <= 0 && isset($arFields['ID']))
{
$ID = intval($arFields['ID']);
}
if($ID <= 0 || !is_array($arFields))
{
$arErrors[] = array('CODE' => self::ERR_INVALID_DATA);
return false;
}
$typeID = isset($arFields['TYPE_ID']) ? intval($arFields['TYPE_ID']) : CCrmActivityType::Undefined;
if($typeID !== CCrmActivityType::Email)
{
$arErrors[] = array('CODE' => self::ERR_INVALID_DATA);
return false;
}
$urn = CCrmActivity::PrepareUrn($arFields);
if(!($urn !== ''
&& CCrmActivity::Update($ID, array('URN'=> $urn), false, false)))
{
$arErrors[] = array('CODE' => self::ERR_CANT_UPDATE_ACTIVITY);
return false;
}
$messageId = sprintf(
'', $urn,
defined('BX24_HOST_NAME') ? BX24_HOST_NAME : (
defined('SITE_SERVER_NAME') && SITE_SERVER_NAME
? SITE_SERVER_NAME : \COption::getOptionString('main', 'server_name', '')
)
);
$settings = isset($arFields['SETTINGS']) && is_array($arFields['SETTINGS']) ? $arFields['SETTINGS'] : array();
// Creating Email -->
if (CModule::includeModule('mail'))
{
$res = \Bitrix\Mail\MailboxTable::getList(array(
'select' => array('*', 'LANG_CHARSET' => 'SITE.CULTURE.CHARSET'),
'filter' => array(
'=LID' => SITE_ID,
'=ACTIVE' => 'Y',
array(
'LOGIC' => 'OR',
'=USER_ID' => $arFields['RESPONSIBLE_ID'],
array(
'USER_ID' => 0,
'=SERVER_TYPE' => 'imap',
),
),
),
'order' => array('TIMESTAMP_X' => 'ASC'), // @TODO: order by ID
));
while ($mailbox = $res->fetch())
{
if (!empty($mailbox['OPTIONS']['flags']) && in_array('crm_connect', (array) $mailbox['OPTIONS']['flags']))
{
$mailbox['EMAIL_FROM'] = null;
if (check_email($mailbox['NAME'], true))
$mailbox['EMAIL_FROM'] = mb_strtolower($mailbox['NAME']);
elseif(check_email($mailbox['LOGIN'], true))
$mailbox['EMAIL_FROM'] = mb_strtolower($mailbox['LOGIN']);
if ($mailbox['USER_ID'] > 0)
$userImap = $mailbox;
else
$crmImap = $mailbox;
}
}
$defaultFrom = \Bitrix\Mail\User::getDefaultEmailFrom();
}
$crmEmail = \CCrmMailHelper::extractEmail(\COption::getOptionString('crm', 'mail', ''));
$from = '';
$reply = '';
$to = array();
$cc = '';
if (isset($settings['MESSAGE_FROM']))
$from = trim(strval($settings['MESSAGE_FROM']));
if ($from == '')
{
if (!empty($userImap))
{
$from = $userImap['EMAIL_FROM'] ?: $defaultFrom;
$userImap['need_sync'] = true;
}
elseif (!empty($crmImap))
{
$from = $crmImap['EMAIL_FROM'] ?: $defaultFrom;
$crmImap['need_sync'] = true;
}
else
{
$from = $crmEmail;
$cc = $crmEmail;
}
if ($from == '')
$arErrors[] = array('CODE' => self::ERR_CANT_FIND_EMAIL_FROM);
}
else
{
$fromAddresses = explode(',', $from);
foreach ($fromAddresses as $fromAddress)
{
if (!check_email($fromAddress))
{
$arErrors[] = array(
'CODE' => self::ERR_INVALID_EMAIL,
'DATA' => array('EMAIL' => $fromAddress)
);
continue;
}
// copied from check_email
if (preg_match('/.*?[<\[\(](.+?)[>\]\)].*/i', $fromAddress, $matches))
$fromAddress = $matches[1];
$fromList[] = mb_strtolower(trim($fromAddress));
}
if (!empty($userImap['EMAIL_FROM']) && in_array($userImap['EMAIL_FROM'], $fromList))
$userImap['need_sync'] = true;
if (!empty($crmImap['EMAIL_FROM']) && in_array($crmImap['EMAIL_FROM'], $fromList))
$crmImap['need_sync'] = true;
$cc = join(', ', array_diff(
$fromList,
array(
!empty($userImap['EMAIL_FROM']) ? $userImap['EMAIL_FROM'] : '',
!empty($crmImap['EMAIL_FROM']) ? $crmImap['EMAIL_FROM'] : '',
)
));
if (empty($userImap['need_sync']) && empty($crmImap['need_sync']))
{
if (!empty($userImap['EMAIL_FROM']))
$reply = join(', ', $fromList) . ', ' . $userImap['EMAIL_FROM'];
else if (!empty($crmImap['EMAIL_FROM']))
$reply = join(', ', $fromList) . ', ' . $crmImap['EMAIL_FROM'];
else if ($crmEmail != '' && !in_array($crmEmail, $fromList))
$reply = join(', ', $fromList) . ', ' . $crmEmail;
}
}
//Save user email in settings -->
if($from !== CUserOptions::GetOption('crm', 'activity_email_addresser', ''))
{
CUserOptions::SetOption('crm', 'activity_email_addresser', $from);
}
//<-- Save user email in settings
$to = array();
$commData = isset($arFields['COMMUNICATIONS']) ? $arFields['COMMUNICATIONS'] : array();
foreach($commData as &$commDatum)
{
$commType = isset($commDatum['TYPE'])? mb_strtoupper(strval($commDatum['TYPE'])) : '';
$commValue = isset($commDatum['VALUE']) ? strval($commDatum['VALUE']) : '';
if($commType !== 'EMAIL' || $commValue === '')
{
continue;
}
if(!check_email($commValue))
{
$arErrors[] = array(
'CODE' => self::ERR_INVALID_EMAIL,
'DATA' => array('EMAIL' => $commValue)
);
continue;
}
$to[] = mb_strtolower(trim($commValue));
}
unset($commDatum);
if(count($to) == 0)
{
$arErrors[] = array('CODE' => self::ERR_CANT_FIND_EMAIL_TO);
}
if(!empty($arErrors))
{
return false;
}
// Try to resolve posting charset -->
$postingCharset = '';
$siteCharset = defined('LANG_CHARSET') ? LANG_CHARSET : (defined('SITE_CHARSET') ? SITE_CHARSET : 'windows-1251');
$arSupportedCharset = explode(',', COption::GetOptionString('subscribe', 'posting_charset'));
if(count($arSupportedCharset) === 0)
{
$postingCharset = $siteCharset;
}
else
{
foreach($arSupportedCharset as $curCharset)
{
if(strcasecmp($curCharset, $siteCharset) === 0)
{
$postingCharset = $curCharset;
break;
}
}
if($postingCharset === '')
{
$postingCharset = $arSupportedCharset[0];
}
}
//<-- Try to resolve posting charset
$subject = isset($arFields['SUBJECT']) ? $arFields['SUBJECT'] : '';
$description = isset($arFields['DESCRIPTION']) ? $arFields['DESCRIPTION'] : '';
$descriptionType = isset($arFields['DESCRIPTION_TYPE']) ? intval($arFields['DESCRIPTION_TYPE']) : CCrmContentType::PlainText;
$descriptionHtml = '';
if($descriptionType === CCrmContentType::Html)
{
$descriptionHtml = $description;
}
elseif($descriptionType === CCrmContentType::BBCode)
{
$parser = new CTextParser();
$parser->allow['SMILES'] = 'N';
$descriptionHtml = ''.$parser->convertText($description).'';
}
elseif($descriptionType === CCrmContentType::PlainText)
{
$descriptionHtml = htmlspecialcharsbx($description);
}
if (isset($settings['DISABLE_SENDING_MESSAGE_COPY']) && $settings['DISABLE_SENDING_MESSAGE_COPY'] === 'Y')
{
$cc = '';
}
$postingData = array(
'STATUS' => 'D',
'FROM_FIELD' => $from,
'TO_FIELD' => $cc,
'BCC_FIELD' => implode(',', $to),
'SUBJECT' => $subject,
'BODY_TYPE' => 'html',
'BODY' => $descriptionHtml,
'DIRECT_SEND' => 'Y',
'SUBSCR_FORMAT' => 'html',
'CHARSET' => $postingCharset
);
CCrmActivity::InjectUrnInMessage(
$postingData,
$urn,
CCrmEMailCodeAllocation::GetCurrent()
);
$posting = new CPosting();
$postingID = $posting->Add($postingData);
if($postingID === false)
{
$arErrors[] = array('CODE' => self::ERR_CANT_ADD_POSTING, 'MESSAGE' => $posting->LAST_ERROR);
return false;
}
$arUpdateFields = array(
'COMPLETED' => 'Y',
'ASSOCIATED_ENTITY_ID'=> $postingID,
'SETTINGS' => $settings
);
$arUpdateFields['SETTINGS']['MESSAGE_HEADERS'] = array('Message-Id' => $messageId);
if ($reply != '')
$arUpdateFields['SETTINGS']['MESSAGE_HEADERS']['Reply-To'] = $reply;
$arUpdateFields['SETTINGS']['IS_MESSAGE_SENT'] = true;
if(!CCrmActivity::Update($ID, $arUpdateFields, false, false))
{
$arErrors[] = array('CODE' => self::ERR_CANT_UPDATE_ACTIVITY);
return false;
}
// <-- Creating Email
$arFields['COMPLETED'] = $arUpdateFields['COMPLETED'];
$arFields['ASSOCIATED_ENTITY_ID'] = $arUpdateFields['ASSOCIATED_ENTITY_ID'];
$arFields['SETTINGS'] = $arUpdateFields['SETTINGS'];
// Attaching files -->
$storageTypeID = isset($arFields['STORAGE_TYPE_ID'])
? intval($arFields['STORAGE_TYPE_ID']) : StorageType::Undefined;
$storageElementsID = isset($arFields['STORAGE_ELEMENT_IDS'])
&& is_array($arFields['STORAGE_ELEMENT_IDS'])
? $arFields['STORAGE_ELEMENT_IDS'] : array();
$hostname = \COption::getOptionString('main', 'server_name', 'localhost');
if (defined('BX24_HOST_NAME') && BX24_HOST_NAME != '')
$hostname = BX24_HOST_NAME;
else if (defined('SITE_SERVER_NAME') && SITE_SERVER_NAME != '')
$hostname = SITE_SERVER_NAME;
$arRawFiles = StorageManager::makeFileArray($storageElementsID, $storageTypeID);
foreach($arRawFiles as $arRawFile)
{
$contentId = sprintf(
'bxacid.%s@%s.crm',
hash('crc32b', $arRawFile['external_id'].$arRawFile['size'].$arRawFile['name']),
hash('crc32b', $hostname)
);
$arRawFile['name'] = sprintf('%s_%s', $arRawFile['name'], $contentId);
if(!$posting->SaveFile($postingID, $arRawFile))
{
$arErrors[] = array('CODE' => self::ERR_CANT_SAVE_POSTING_FILE, 'MESSAGE' => $posting->LAST_ERROR);
return false;
}
}
// <-- Attaching files
if (!empty($userImap['need_sync']) || !empty($crmImap['need_sync']))
{
$attachments = array();
foreach ($arRawFiles as $item)
{
$attachments[] = array(
'ID' => $item['external_id'],
'NAME' => $item['ORIGINAL_NAME'] ?: $item['name'],
'PATH' => $item['tmp_name'],
'CONTENT_TYPE' => $item['type'],
);
}
class_exists('Bitrix\Mail\Helper');
$rcpt = array();
foreach ($to as $item)
$rcpt[] = \Bitrix\Mail\DummyMail::encodeHeaderFrom($item, SITE_CHARSET);
$rcpt = join(', ', $rcpt);
$outgoing = new \Bitrix\Mail\DummyMail(array(
'CONTENT_TYPE' => 'html',
'CHARSET' => SITE_CHARSET,
'HEADER' => array(
'From' => $from,
'To' => $rcpt,
'Subject' => $subject,
'Message-Id' => $messageId,
),
'BODY' => $descriptionHtml,
'ATTACHMENT' => $attachments
));
if (!empty($userImap['need_sync']))
\Bitrix\Mail\Helper::addImapMessage($userImap, (string) $outgoing, $err);
if (!empty($crmImap['need_sync']))
\Bitrix\Mail\Helper::addImapMessage($crmImap, (string) $outgoing, $err);
}
// Sending Email -->
if($posting->ChangeStatus($postingID, 'P'))
{
$rsAgents = CAgent::GetList(
array('ID'=>'DESC'),
array(
'MODULE_ID' => 'subscribe',
'NAME' => 'CPosting::AutoSend('.$postingID.',%',
)
);
if(!$rsAgents->Fetch())
{
CAgent::AddAgent('CPosting::AutoSend('.$postingID.',true);', 'subscribe', 'N', 0);
}
}
// Try add event to entity
$CCrmEvent = new CCrmEvent();
$bindings = \CCrmActivity::GetBindings($ID);
if(!empty($bindings))
{
$eventText = '';
$eventText .= GetMessage('CRM_ACTIVITY_EMAIL_SUBJECT').': '.$subject."\n\r";
$eventText .= GetMessage('CRM_ACTIVITY_EMAIL_FROM').': '.$from."\n\r";
$eventText .= GetMessage('CRM_ACTIVITY_EMAIL_TO').': '.implode(',', $to)."\n\r\n\r";
$eventText .= $description;
$eventBindings = array();
foreach($bindings as $item)
{
$bindingEntityID = $item['OWNER_ID'];
$bindingEntityTypeID = $item['OWNER_TYPE_ID'];
$bindingEntityTypeName = \CCrmOwnerType::resolveName($bindingEntityTypeID);
$eventBindings["{$bindingEntityTypeName}_{$bindingEntityID}"] = array(
'ENTITY_TYPE' => $bindingEntityTypeName,
'ENTITY_ID' => $bindingEntityID
);
}
$CCrmEvent->Add(
array(
'ENTITY' => $eventBindings,
'EVENT_ID' => 'MESSAGE',
'EVENT_TEXT_1' => $eventText,
'FILES' => $arRawFiles
)
);
}
// <-- Sending Email
return true;
}