/** * @return bool */ public function StartMailboxMonitorPrev($iIdTenant) { $aData = $this->GetHelpdeskMainSettings($iIdTenant); if (!empty($aData['AdminEmailAccount']) && 0 < $aData['HelpdeskFetcherType']) { $oApiUsers = $this->apiUsers(); $oApiMail = $this->apiMail(); $oApiFileCache = \CApi::Manager('filecache'); $oApiFilestorage = \CApi::Manager('filestorage'); if ($oApiUsers && $oApiMail && $oApiFileCache) { $oAccount = $oApiUsers->GetAccountOnLogin($aData['AdminEmailAccount']); if ($oAccount) { $iPrevLastUid = $this->GetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email)); $iLastUid = 0; $aData = $oApiMail->HelpdeskMessagesHelper($oAccount, 0 < $iPrevLastUid ? $iPrevLastUid + 1 : 0, $iLastUid); if (0 < $iLastUid) { $this->SetHelpdeskMailboxLastUid($iIdTenant, \strtolower($oAccount->Email), $iLastUid); } if (is_array($aData) && 0 < count($aData)) { foreach ($aData as $oMessage) { $aMatch = array(); $oFrom = $oMessage->From(); $aFrom = $oFrom ? $oFrom->GetAsArray() : array(); $oAttachments = $oMessage->Attachments(); $aAttachments = $oAttachments ? $oAttachments->GetAsArray() : array(); $sSubject = $oMessage->Subject(); if (is_array($aFrom) && 0 < count($aFrom) && !empty($sSubject) && preg_match('/\\[#([a-zA-Z0-9]+)#\\]/', $sSubject, $aMatch) && !empty($aMatch[1])) { $oEmail = $aFrom[0]; $sEmail = $oEmail ? $oEmail->GetEmail() : ''; if (0 < \strlen($sEmail)) { $oHelpdeskUser = $this->GetUserByEmail($iIdTenant, $sEmail); if ($oHelpdeskUser) { $sThreadHash = (string) $aMatch[1]; if (!empty($sThreadHash)) { $iThreadID = $this->GetThreadIdByHash($iIdTenant, $sThreadHash); if (0 < $iThreadID) { $oThread = $this->GetThreadById($oHelpdeskUser, $iThreadID); if ($oThread) { $sText = trim($oMessage->Html()); if (0 === strlen($sText)) { $sText = trim($oMessage->Plain()); } else { $sText = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sText); } $oPost = new \CHelpdeskPost(); $oPost->IdTenant = $oHelpdeskUser->IdTenant; $oPost->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oPost->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oPost->Type = \EHelpdeskPostType::Normal; $oPost->SystemType = \EHelpdeskPostSystemType::None; $oPost->Text = $sText; $aResultAttachment = array(); if (is_array($aAttachments) && 0 < count($aAttachments)) { foreach ($aAttachments as $oAttachment) { $sUploadName = $oAttachment->FileName(true); $sTempName = md5($sUploadName . rand(1000, 9999)); $oApiMail->MessageMimeStream($oAccount, function ($rResource, $sContentType, $sFileName, $sMimeIndex = '') use($oHelpdeskUser, &$sTempName, $oApiFileCache) { if (!$oApiFileCache->PutFile($oHelpdeskUser, $sTempName, $rResource)) { $sTempName = ''; } }, $oAttachment->Folder(), $oAttachment->Uid(), $oAttachment->MimeIndex()); $rData = 0 < \strlen($sTempName) ? $oApiFileCache->GetFile($oHelpdeskUser, $sTempName) : null; if ($rData) { $iFileSize = $oApiFileCache->FileSize($oHelpdeskUser, $sTempName); $sThreadID = (string) $oThread->IdHelpdeskThread; $sThreadID = str_pad($sThreadID, 2, '0', STR_PAD_LEFT); $sThreadIDSubFolder = substr($sThreadID, 0, 2); $sThreadFolderName = API_HELPDESK_PUBLIC_NAME . '/' . $sThreadIDSubFolder . '/' . $sThreadID; $oApiFilestorage->CreateFolder($oHelpdeskUser, \EFileStorageType::Corporate, '', $sThreadFolderName); $oApiFilestorage->CreateFile($oHelpdeskUser, \EFileStorageType::Corporate, $sThreadFolderName, $sUploadName, $rData, false); if (is_resource($rData)) { @fclose($rData); } $oAttachment = new \CHelpdeskAttachment(); $oAttachment->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oAttachment->IdHelpdeskPost = $oPost->IdHelpdeskPost; $oAttachment->IdOwner = $oHelpdeskUser->IdHelpdeskUser; $oAttachment->IdTenant = $oHelpdeskUser->IdTenant; $oAttachment->FileName = $sUploadName; $oAttachment->SizeInBytes = $iFileSize; $oAttachment->EncodeHash($oHelpdeskUser, $sThreadFolderName); $oApiFileCache->Clear($oHelpdeskUser, $sTempName); $aResultAttachment[] = $oAttachment; } } if (is_array($aResultAttachment) && 0 < count($aResultAttachment)) { $oPost->Attachments = $aResultAttachment; } } $this->CreatePost($oHelpdeskUser, $oThread, $oPost, false, false); } } } } } } unset($oMessage); } } } } } return true; }
public function AjaxHelpdeskPostCreate() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); /* @var $oAccount CAccount */ $iThreadId = (int) $this->getParamValue('ThreadId', 0); $sSubject = trim((string) $this->getParamValue('Subject', '')); $sText = trim((string) $this->getParamValue('Text', '')); $bIsInternal = '1' === (string) $this->getParamValue('IsInternal', '0'); $mAttachments = $this->getParamValue('Attachments', null); if (0 === strlen($sText) || 0 === $iThreadId && 0 === strlen($sSubject)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mResult = false; $bIsNew = false; $oThread = null; if (0 === $iThreadId) { $bIsNew = true; $oThread = new \CHelpdeskThread(); $oThread->IdTenant = $oUser->IdTenant; $oThread->IdOwner = $oUser->IdHelpdeskUser; $oThread->Type = \EHelpdeskThreadType::Pending; $oThread->Subject = $sSubject; if (!$this->ApiHelpdesk()->CreateThread($oUser, $oThread)) { $oThread = null; } } else { $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); } if ($oThread && 0 < $oThread->IdHelpdeskThread) { $oPost = new \CHelpdeskPost(); $oPost->IdTenant = $oUser->IdTenant; $oPost->IdOwner = $oUser->IdHelpdeskUser; $oPost->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oPost->Type = $bIsInternal ? \EHelpdeskPostType::Internal : \EHelpdeskPostType::Normal; $oPost->SystemType = \EHelpdeskPostSystemType::None; $oPost->Text = $sText; $aResultAttachment = array(); if (is_array($mAttachments) && 0 < count($mAttachments)) { foreach ($mAttachments as $sTempName => $sHash) { $aDecodeData = \CApi::DecodeKeyValues($sHash); if (!isset($aDecodeData['HelpdeskUserID'])) { continue; } $rData = $this->ApiFileCache()->GetFile($oUser, $sTempName); if ($rData) { $iFileSize = $this->ApiFileCache()->FileSize($oUser, $sTempName); $sThreadID = (string) $oThread->IdHelpdeskThread; $sThreadID = str_pad($sThreadID, 2, '0', STR_PAD_LEFT); $sThreadIDSubFolder = substr($sThreadID, 0, 2); $sThreadFolderName = API_HELPDESK_PUBLIC_NAME . '/' . $sThreadIDSubFolder . '/' . $sThreadID; $this->oApiFilestorage->CreateFolder($oUser, \EFileStorageTypeStr::Corporate, '', $sThreadFolderName); $sUploadName = isset($aDecodeData['Name']) ? $aDecodeData['Name'] : $sTempName; $this->oApiFilestorage->CreateFile($oUser, \EFileStorageTypeStr::Corporate, $sThreadFolderName, $sUploadName, $rData, false); $oAttachment = new \CHelpdeskAttachment(); $oAttachment->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oAttachment->IdHelpdeskPost = $oPost->IdHelpdeskPost; $oAttachment->IdOwner = $oUser->IdHelpdeskUser; $oAttachment->IdTenant = $oUser->IdTenant; $oAttachment->FileName = $sUploadName; $oAttachment->SizeInBytes = $iFileSize; $oAttachment->EncodeHash($oUser, $sThreadFolderName); $aResultAttachment[] = $oAttachment; } } if (is_array($aResultAttachment) && 0 < count($aResultAttachment)) { $oPost->Attachments = $aResultAttachment; } } $mResult = $this->ApiHelpdesk()->CreatePost($oUser, $oThread, $oPost, $bIsNew); if ($mResult) { $mResult = $oThread->IdHelpdeskThread; } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); }