public static function TrySendEmail($ID, &$arFields, &$arErrors) { global $APPLICATION; 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; } $settings = isset($arFields['SETTINGS']) && is_array($arFields['SETTINGS']) ? $arFields['SETTINGS'] : array(); // Creating Email --> $crmEmail = CCrmMailHelper::ExtractEmail(COption::GetOptionString('crm', 'mail', '')); $from = isset($settings['MESSAGE_FROM']) ? trim(strval($settings['MESSAGE_FROM'])) : ''; if ($from === '') { if ($crmEmail !== '') { $from = $crmEmail; } else { $arErrors[] = array('CODE' => self::ERR_CANT_FIND_EMAIL_FROM); } } elseif (!check_email($from)) { $arErrors[] = array('CODE' => self::ERR_INVALID_EMAIL, 'DATA' => array('EMAIL' => $from)); } //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']) ? 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[] = 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(); $descriptionHtml = $parser->convertText($description); } elseif ($descriptionType === CCrmContentType::PlainText) { $descriptionHtml = htmlspecialcharsbx($description); } $postingData = array('STATUS' => 'D', 'FROM_FIELD' => $from, 'TO_FIELD' => $from, '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); $fromEmail = strtolower(trim(CCrmMailHelper::ExtractEmail($from))); if ($crmEmail !== '' && $fromEmail !== $crmEmail) { $arUpdateFields['SETTINGS']['MESSAGE_HEADERS'] = array('Reply-To' => "<{$fromEmail}>, <{$crmEmail}>"); } $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 // 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(); $arRawFiles = StorageManager::makeFileArray($storageElementsID, $storageTypeID); foreach ($arRawFiles as &$arRawFile) { if (!$posting->SaveFile($postingID, $arRawFile)) { $arErrors[] = array('CODE' => self::ERR_CANT_SAVE_POSTING_FILE, 'MESSAGE' => $posting->LAST_ERROR); return false; } } unset($arRawFile); // <-- Attaching files // 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(); $ownerID = isset($arFields['OWNER_ID']) ? intval($arFields['OWNER_ID']) : 0; $ownerTypeID = isset($arFields['OWNER_TYPE_ID']) ? intval($arFields['OWNER_TYPE_ID']) : 0; if ($ownerID > 0 && $ownerTypeID > 0) { $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; // Register event only for owner $CCrmEvent->Add(array('ENTITY' => array($ownerID => array('ENTITY_TYPE' => CCrmOwnerType::ResolveName($ownerTypeID), 'ENTITY_ID' => $ownerID)), 'EVENT_ID' => 'MESSAGE', 'EVENT_TEXT_1' => $eventText, 'FILES' => $arRawFiles)); } // <-- Sending Email return true; }
$arFields['COMMUNICATIONS'] =& $comms; unset($comms); } } } } CCrmMobileHelper::PrepareActivityItem($arFields, $arParams, array('ENABLE_COMMUNICATIONS' => true, 'ENABLE_FILES' => true)); //Trim seconds $arFields['START_TIME'] = CCrmComponentHelper::TrimDateTimeString(FormatDate('FULL', $arFields['START_TIME_STAMP'])); $arFields['END_TIME'] = CCrmComponentHelper::TrimDateTimeString(FormatDate('FULL', $arFields['END_TIME_STAMP'])); $arResult['ENTITY'] = $arFields; unset($arFields); if ($typeID === CCrmActivityType::Call || $typeID === CCrmActivityType::Meeting) { $arResult['NOTIFY_TYPES'] = CCrmActivityNotifyType::PrepareListItems(); } elseif ($typeID === CCrmActivityType::Email) { $arResult['CRM_EMAIL'] = CCrmMailHelper::ExtractEmail(COption::GetOptionString('crm', 'mail', '')); $lastEmailAddresser = CUserOptions::GetOption('crm', 'activity_email_addresser', ''); if ($lastEmailAddresser === '') { $arResult['USER_LAST_USED_NAME'] = ''; $arResult['USER_LAST_USED_EMAIL'] = ''; } else { $info = CCrmMailHelper::ParseEmail($lastEmailAddresser); $arResult['USER_LAST_USED_NAME'] = $info['NAME']; $arResult['USER_LAST_USED_EMAIL'] = $info['EMAIL']; } $dbUser = CUser::GetList($by = 'id', $order = 'asc', array('ID_EQUAL_EXACT' => $currentUserID), array('FIELDS' => array('LOGIN', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'EMAIL', 'PERSONAL_PHOTO'))); $user = $dbUser->Fetch(); if (!is_array($user)) { $arResult['USER_EMAIL'] = ''; $arResult['USER_FULL_NAME'] = ''; $arResult['USER_PHOTO_URL'] = '';
$arRawFiles = isset($arFields['STORAGE_ELEMENT_IDS']) && !empty($arFields['STORAGE_ELEMENT_IDS']) ? \Bitrix\Crm\Integration\StorageManager::makeFileArray($arFields['STORAGE_ELEMENT_IDS'], $storageTypeID) : array(); foreach ($arRawFiles as &$arRawFile) { if (isset($arRawFile['ORIGINAL_NAME'])) { $arRawFile['name'] = $arRawFile['ORIGINAL_NAME']; } if (!$posting->SaveFile($postingID, $arRawFile)) { $arErrors[] = GetMessage('CRM_ACTIVITY_COULD_NOT_SAVE_POSTING_FILE', array('#FILE_NAME#' => $arRawFile['ORIGINAL_NAME'])); $arErrors[] = $posting->LAST_ERROR; break; } } unset($arRawFile); // <-- Attaching files if (empty($arErrors)) { $arUpdateFields = array('ASSOCIATED_ENTITY_ID' => $postingID); $fromEmail = strtolower(trim(CCrmMailHelper::ExtractEmail($from))); if ($crmEmail !== '' && $fromEmail !== $crmEmail) { $arUpdateFields['SETTINGS'] = array('MESSAGE_HEADERS' => array('Reply-To' => "<{$fromEmail}>, <{$crmEmail}>")); } CCrmActivity::Update($ID, $arUpdateFields, false, false); } } // <-- Creating Email if (!empty($arErrors)) { if ($isNew) { $arErrors[] = GetMessage('CRM_ACTIVITY_EMAIL_CREATION_CANCELED'); CCrmActivity::Delete($ID); } echo CUtil::PhpToJSObject(array('ERROR' => $arErrors)); die; }
public function Execute() { if (!CModule::IncludeModule('crm')) { CBPActivityExecutionStatus::Closed; } $rootActivity = $this->GetRootActivity(); $documentId = $rootActivity->GetDocumentId(); $documentService = $this->workflow->GetService("DocumentService"); $strMailUserFrom = ""; $arMailUserFromArray = CBPHelper::ExtractUsers($this->MailUserFromArray, $documentId, false); foreach ($arMailUserFromArray as $user) { $dbUser = CUser::GetList($b = "", $o = "", array("ID_EQUAL_EXACT" => $user)); if ($arUser = $dbUser->Fetch()) { if (strlen($strMailUserFrom) > 0) { $strMailUserFrom .= ", "; } if (!defined("BX_MS_SMTP") || BX_MS_SMTP !== true) { if (strlen($arUser["NAME"]) > 0 || strlen($arUser["LAST_NAME"]) > 0) { $strMailUserFrom .= "'" . preg_replace("#['\r\n]+#", "", CUser::FormatName(COption::GetOptionString("bizproc", "name_template", CSite::GetNameFormat(false), SITE_ID), $arUser)) . "' <"; } } $strMailUserFrom .= preg_replace("#[\r\n]+#", "", $arUser["EMAIL"]); if (!defined("BX_MS_SMTP") || BX_MS_SMTP !== true) { if (strlen($arUser["NAME"]) > 0 || strlen($arUser["LAST_NAME"]) > 0) { $strMailUserFrom .= ">"; } } } } $mailUserFromTmp = $this->MailUserFrom; if (strlen($mailUserFromTmp) > 0) { if (strlen($strMailUserFrom) > 0) { $strMailUserFrom .= ", "; } $strMailUserFrom .= preg_replace("#[\r\n]+#", "", $mailUserFromTmp); } $strMailTo = ''; if (is_array($this->MailCrmEntityToArray)) { $addressType = $this->MailCrmEntityAddressType !== '' ? $this->MailCrmEntityAddressType : 'WORK'; foreach ($this->MailCrmEntityToArray as &$entityData) { $s = ''; if (is_string($entityData)) { $s = trim($entityData); } elseif (is_array($entityData) && isset($entityData['VALUE'])) { $s = trim($entityData['VALUE']); } if ($s === '') { continue; } $entityInfo = array(); if (CCrmEntityHelper::ParseEntityKey($s, $entityInfo)) { //Process entity key $dbResult = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => $entityInfo['ENTITY_TYPE_NAME'], 'ELEMENT_ID' => $entityInfo['ENTITY_ID'], 'TYPE_ID' => 'EMAIL', 'VALUE_TYPE' => $addressType)); if ($dbResult) { while ($arField = $dbResult->Fetch()) { $v = isset($arField['VALUE']) ? trim($arField['VALUE']) : ''; if ($v === '' || !check_email($v)) { continue; } if ($strMailTo !== '') { $strMailTo .= ', '; } $strMailTo .= preg_replace("#[\r\n]+#", "", $v); break; } } } else { $ary = explode(',', $s); foreach ($ary as &$v) { $v = trim($v); if ($v === '' || !check_email($v)) { continue; } if ($strMailTo !== '') { $strMailTo .= ', '; } $strMailTo .= preg_replace("#[\r\n]+#", "", $v); } unset($v); } } unset($entityData); } $strReplyTo = $strMailUserFrom; $strCrmEmail = CCrmMailHelper::ExtractEmail(COption::GetOptionString('crm', 'mail', '')); if ($strCrmEmail !== '') { $strReplyTo .= ', ' . $strCrmEmail; } $charset = $this->MailCharset; if (!$this->IsPropertyExists("DirrectMail") || $this->DirrectMail == "Y") { global $APPLICATION; $strMailUserFrom = $APPLICATION->ConvertCharset($strMailUserFrom, SITE_CHARSET, $charset); $strMailUserFrom = self::EncodeHeaderFrom($strMailUserFrom, $charset); $strReplyTo = $APPLICATION->ConvertCharset($strReplyTo, SITE_CHARSET, $charset); $strReplyTo = self::EncodeHeaderFrom($strReplyTo, $charset); $strMailTo = $APPLICATION->ConvertCharset($strMailTo, SITE_CHARSET, $charset); $strMailTo = self::EncodeMimeString($strMailTo, $charset); $mailSubject = $APPLICATION->ConvertCharset($this->MailSubject, SITE_CHARSET, $charset); $mailSubject = self::EncodeSubject($mailSubject, $charset); $mailText = $APPLICATION->ConvertCharset(CBPHelper::ConvertTextForMail($this->MailText), SITE_CHARSET, $charset); $eol = CAllEvent::GetMailEOL(); mail($strMailTo, $mailSubject, $mailText, "From: " . $strMailUserFrom . $eol . "Reply-To: " . $strReplyTo . $eol . "X-Priority: 3 (Normal)" . $eol . "Content-Type: text/" . ($this->MailMessageType == "html" ? "html" : "plain") . "; charset=" . $charset . $eol . "X-Mailer: PHP/" . phpversion()); } else { $siteId = null; if ($this->IsPropertyExists("MailSite")) { $siteId = $this->MailSite; } if (strlen($siteId) <= 0) { $siteId = SITE_ID; } $arFields = array("SENDER" => $strMailUserFrom, "RECEIVER" => $strMailTo, "REPLY_TO" => $strReplyTo, "TITLE" => $this->MailSubject, "MESSAGE" => CBPHelper::ConvertTextForMail($this->MailText)); $event = new CEvent(); $event->Send("BIZPROC_MAIL_TEMPLATE", $siteId, $arFields, "N"); } return CBPActivityExecutionStatus::Closed; }