Rev 299 | Rev 334 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Db\Adapter\AdapterInterface;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\Log\LoggerInterface;use Laminas\View\Model\ViewModel;use LeadersLinked\Library\Functions;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Model\User;use LeadersLinked\Mapper\UserBlockedMapper;use LeadersLinked\Mapper\CompanyMapper;use LeadersLinked\Mapper\CompanyUserMapper;use LeadersLinked\Library\Image;use Laminas\View\Model\JsonModel;use Laminas\Mvc\I18n\Translator;use LeadersLinked\Mapper\AbuseReportMapper;use LeadersLinked\Model\AbuseReport;use LeadersLinked\Library\ExternalCredentials;use LeadersLinked\Library\Storage;use LeadersLinked\Form\InMail\SendForm;use PHPMailer\PHPMailer\PHPMailer;use LeadersLinked\Library\S3Files;class InMailController extends AbstractActionController{const _SIZE_PAGE = 10;/**** @var \Laminas\Db\Adapter\AdapterInterface*/private $adapter;/**** @var \LeadersLinked\Cache\CacheInterface*/private $cache;/**** @var \Laminas\Log\LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @var \Laminas\Mvc\I18n\Translator*/private $translator;/**** @param \Laminas\Db\Adapter\AdapterInterface $adapter* @param \LeadersLinked\Cache\CacheInterface $cache* @param \Laminas\Log\LoggerInterface LoggerInterface $logger* @param array $config* @param \Laminas\Mvc\I18n\Translator $translator*/public function __construct($adapter, $cache, $logger, $config, $translator){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;$this->translator = $translator;}/**** Generación del listado de conversationes** [* success: true,* data:[* messages :* [* uuid: uuid con quien se tiene la conversación,* name: nombre de con quien se tiene la conversacion,* image: imagen de con quien se tiene la conversación,* subject: asunto del mensaje* date: fecha del ultimo mensaje,* seen: true|false,* send_link: url para enviar el mensaje,* open_link : url para leer el mensaje,* delete_link : url para leer el mensaje,* ],* 'total_messages' : total de mensajes,* 'total_pages' : total de páginas 10 en 10,* 'current_page' : página actual* ]*** @return \Laminas\View\Model\JsonModel*/public function indexAction(){$request = $this->getRequest();if ($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$page = intval($this->params()->fromQuery('page', 0), 10);$storage = Storage::getInstance($this->config);$externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);$externalCredentials->getUserBy($currentUser->id);$host = trim($this->config['leaderslinked.inmail.host']);$port = intval($this->config['leaderslinked.inmail.port_imap'], 10);$mailbox = trim($this->config['leaderslinked.inmail.mailbox']);$username = $externalCredentials->getUsernameInmail();$password = $externalCredentials->getPasswordInmail();$userMapper = \LeadersLinked\Mapper\UserMapper::getInstance($this->adapter);try {\Eden\Core\Control::i();$client = eden('mail')->imap($host,$username,$password,$port,false);$client->setActiveMailbox($mailbox);//$emails = $imap->getEmails(0, 3);$maxMessages = $client->getEmailTotal();if($maxMessages > self::_SIZE_PAGE) {$maxPages = (int) $maxMessages / self::_SIZE_PAGE;if(($maxPages * self::_SIZE_PAGE) < $maxMessages) {$maxPages++;}} else {$maxPages = 1;$page = 1;}$page = $page > 0 ? $page : 1;$page = $page > $maxPages ? $maxPages : $page;if($page == 1) {$low = 0;$high = self::_SIZE_PAGE - 1;} else {$low = ($page - 1) * self::_SIZE_PAGE;$high = $low + ( self::_SIZE_PAGE - 1);}$users = [];$messages = [];if( $maxMessages ) {$emails = $client->getEmails($low, $high);foreach($emails as $email){$from = $email['from']['email'];if(isset($users[ $from ])) {$user = $users[ $from ];} else {$user = $userMapper->fetchOneByUsernameInmailAndNetworkId($from, $currentUser->network_id);$users[ $from ] = $user;}$seen = false;if(is_array($email['flags'])) {foreach($email['flags'] as $flag){if($flag == 'seen') {$seen = 1;break;}}}$message = ['uuid' => $user->uuid,'name' => $user->first_name . ' ' . $user->last_name,'image' => $storage->getUserImage($user),'subject' => $email['subject'],'date' => date('Y-m-d h:i a', $email['date']),'seen' => $seen,'email_id' => $email['uid'],'block_link' => $this->url()->fromRoute('inmail/user/block',[ 'id' => $user->uuid ], ['force_canonical' => true]),'send_link' => $this->url()->fromRoute('inmail/message/send',[ 'id' => $user->uuid ], ['force_canonical' => true]),'get_link' => $this->url()->fromRoute('inmail/message/get',[ 'id' => $email['uid'] ], ['force_canonical' => true]),'delete_link'=> $this->url()->fromRoute('inmail/message/delete',[ 'id' => $email['uid'] ], ['force_canonical' => true]),];array_push($messages, $message);}}$client->disconnect();$data = ['success' => true,'data' => ['messages' => $messages,'total_messages' => $maxMessages,'total_pages' => $maxPages,'current_page' => $page,]];return new JsonModel($data);} catch (\Exception $e) {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE']);}/*** ([0] => Array([id] => <6f27ed6a-d554-4f0b-b9ee-7c708cca8b33@inmail.leaderslinked.com>[parent] =>[topic] => Test 1[mailbox] => INBOX[uid] => 8[date] => 1721906994[subject] => Test 1[from] => Array([name] => Efrain Yanez[email] => efrain.yanez@inmail.leaderslinked.com)[flags] => Array([0] => seen)[to] => Array([0] => Array([name] =>[email] => santiago.olivera@inmail.leaderslinked.com))[cc] => Array()[bcc] => Array()[attachment] => 1)([id] => <6f27ed6a-d554-4f0b-b9ee-7c708cca8b33@inmail.leaderslinked.com>[parent] =>[topic] => Test 1[mailbox] => INBOX[uid] => 8[date] => 1721906994[subject] => Test 1[from] => Array([name] => Efrain Yanez[email] => efrain.yanez@inmail.leaderslinked.com)[flags] => Array([0] => seen)[to] => Array([0] => Array([name] =>[email] => santiago.olivera@inmail.leaderslinked.com))[cc] => Array()[bcc] => Array()[body] => 'esto es una pryeba',[attachment] => Array([POST 1080X1080-03-37.png] => Array([image/png] => �PNG[futbol-720p-230714 - Copy (1).mp4] => Array([video/mp4]**Array([0] => __construct[1] => connect[2] => disconnect[3] => getActiveMailbox[4] => getEmails[5] => getEmailTotal[6] => getNextUid[7] => getMailboxes[8] => getUniqueEmails[9] => move[10] => copy[11] => remove[12] => expunge[13] => search[14] => searchTotal[15] => setActiveMailbox[16] => i[17] => __call[18] => __invoke[19] => __toString[20] => addMethod[21] => callArray[22] => inspect[23] => loadState[24] => loop[25] => off[26] => on[27] => saveState[28] => trigger[29] => when)*/} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function getAttachmentAction(){$request = $this->getRequest();if ($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$id = intval($this->params()->fromRoute('id'), 10);$attachment = intval($this->params()->fromRoute('attachment'), 10);$externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);$externalCredentials->getUserBy($currentUser->id);$host = trim($this->config['leaderslinked.inmail.host']);$port = intval($this->config['leaderslinked.inmail.port_imap'], 10);$mailbox = trim($this->config['leaderslinked.inmail.mailbox']);$username = $externalCredentials->getUsernameInmail();$password = $externalCredentials->getPasswordInmail();try {\Eden\Core\Control::i();$client = eden('mail')->imap($host,$username,$password,$port,false);$client->setActiveMailbox($mailbox);$email = $client->getUniqueEmails($id, true);$client->disconnect();if($email['uid']) {$base64 = '';$contentType = '';$filename = '';if(!empty($email['attachment']) && is_array($email['attachment'])) {foreach($email['attachment'] as $filename => $data){$i = 0;foreach($data as $contentType => $value){if($i == $attachment) {$base64 = base64_encode($value);break;}$i++;}}}if($base64) {return new JsonModel(['success' => true,'data' => ['filename' => $filename,'mime-type' => $contentType,'base64' => $base64,]]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_ATTACHMENT_NOT_FOUND']);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_NOT_FOUND']);}} catch (\Exception $e) {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE']);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function getMessageAction(){$request = $this->getRequest();if ($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$id = intval($this->params()->fromRoute('id'), 10);$storage = Storage::getInstance($this->config);$externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);$externalCredentials->getUserBy($currentUser->id);$host = trim($this->config['leaderslinked.inmail.host']);$port = intval($this->config['leaderslinked.inmail.port_imap'], 10);$mailbox = trim($this->config['leaderslinked.inmail.mailbox']);$username = $externalCredentials->getUsernameInmail();$password = $externalCredentials->getPasswordInmail();try {\Eden\Core\Control::i();$client = eden('mail')->imap($host,$username,$password,$port,false);$client->setActiveMailbox($mailbox);$email = $client->getUniqueEmails($id, true);$client->disconnect();if($email['uid']) {$from = $email['from']['email'];$subject = $email['subject'];$body = empty($email['body']['text/html']) ? $email['body']['text/plain'] : $email['body']['text/html'];$userMapper = \LeadersLinked\Mapper\UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOneByUsernameInmailAndNetworkId($from, $currentUser->network_id);$seen = false;if(is_array($email['flags'])) {foreach($email['flags'] as $flag){if($flag == 'seen') {$seen = 1;break;}}}$extensions = ['mov', 'webm','mp4','mpeg','jpg','jpeg','png', 'pdf'];$contentTypes = ['video/quicktime', 'video/webm', 'video/mp4', 'video/mpeg', 'image/jpg', 'image/jpeg', 'image/png', 'application/pdf'];$storage = Storage::getInstance($this->config);$path = $storage->getPathMessage();$code = $currentUser->uuid;$attachments = [];if(!empty($email['attachment']) && is_array($email['attachment'])) {foreach($email['attachment'] as $filename => $attachment){$i = 0;foreach($attachment as $contentType => $value){$pos = strrpos($filename, '.');$extension = trim(substr($filename, $pos + 1));for($j = 0; $max = count($extensions), $j < $max; $j++){if($extension == $extensions[$j]) {$contentType = $contentTypes[$j];}}$remoteFilename = trim($email['uid'] . '-' . $filename);$url = $storage->getGenericFile($path, $code, $remoteFilename) ;if(!$url) {$tmp_file = sys_get_temp_dir() . '/' . $remoteFilename;file_put_contents($tmp_file, $value);if($storage->putFile($path, $code, $tmp_file)) {$url = $storage->getGenericFile($path, $code, $remoteFilename) ;} else {$url = '';}}// $this->url()->fromRoute('inmail/message/attachment',[ 'id' => $email['uid'], 'attachment' => $i ], ['force_canonical' => true]),array_push($attachments, ['filename' => $remoteFilename,'content-type' => $contentType,'attachment_link' => $url,]);$i++;}}}return new JsonModel(['success' => true,'data' => ['uuid' => $user->uuid,'name' => $user->first_name . ' ' . $user->last_name,'image' => $storage->getUserImage($user),'subject' => $subject,'body' => $body,'date' => date('Y-m-d h:i a', $email['date']),'seen' => $seen,'block_link' => $this->url()->fromRoute('inmail/user/block',[ 'id' => $user->uuid ], ['force_canonical' => true]),'send_link' => $this->url()->fromRoute('inmail/message/send',[ 'id' => $user->uuid ], ['force_canonical' => true]),'delete_link'=> $this->url()->fromRoute('inmail/message/delete',[ 'id' => $email['uid'] ], ['force_canonical' => true]),'attachments' => $attachments,]]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_NOT_FOUND']);}} catch (\Exception $e) {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE']);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function deleteMessageAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$id = intval($this->params()->fromRoute('id'), 10);$externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);$externalCredentials->getUserBy($currentUser->id);$host = trim($this->config['leaderslinked.inmail.host']);$port = intval($this->config['leaderslinked.inmail.port_imap'], 10);$mailbox = trim($this->config['leaderslinked.inmail.mailbox']);$username = $externalCredentials->getUsernameInmail();$password = $externalCredentials->getPasswordInmail();try {\Eden\Core\Control::i();$client = eden('mail')->imap($host,$username,$password,$port,false);$client->setActiveMailbox($mailbox);$storage = Storage::getInstance($this->config);$path = $storage->getPathMessage();$code = $currentUser->uuid;$storage->deleteDirectory($path, $code);$email = $client->getUniqueEmails($id, true);if($email['uid']) {if(!empty($email['attachment']) && is_array($email['attachment'])) {$filenames = array_keys($email['attachment']);foreach($filenames as $filename){$remoteFilename = trim($email['uid'] . '-' . $filename);$storage->deleteFile($path, $code, $remoteFilename);}}}$response = $client->remove($id, true);$client->disconnect();if($response) {return new JsonModel(['success' => true,'data' => 'LABEL_INMAIL_MESSAGE_DELETED']);} else {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_NOT_DELETE']);}} catch (\Exception $e) {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE']);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function sendMessageAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$userMapper = UserMapper::getInstance($this->adapter);$id = $this->params()->fromRoute('id');if (!$id) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_REQUEST_IS_INVALID']);}$externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);$externalCredentials->getUserBy($currentUser->id);$host = trim($this->config['leaderslinked.inmail.host']);$port = intval($this->config['leaderslinked.inmail.port_smtp'], 10);$username = $externalCredentials->getUsernameInmail();$password = $externalCredentials->getPasswordInmail();$data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());$form = new SendForm();$form->setData($data);if ($form->isValid()) {$dataPost = (array) $form->getData();try {$subject = $dataPost['subject'];$message = $dataPost['body'];$encoding = mb_detect_encoding($subject);if($encoding != 'UTF-8') {$subject = mb_convert_encoding($subject, 'UTF-8', $encoding);}$encoding = mb_detect_encoding($message);if($encoding != 'UTF-8') {$message = mb_convert_encoding($message, 'UTF-8', $encoding);}$phpMailer = new PHPMailer();$phpMailer->isSMTP();$phpMailer->addAddress($user->username_inmail, ($user->first_name . ' ' . $user->last_name));/*if($cc) {foreach($cc as $address => $name) {$phpMailer->addCC($address, $name);}}if($bcc) {foreach($bcc as $address => $name) {$phpMailer->addBCC($address, $name);}}*/$phpMailer->setFrom($currentUser->username_inmail, ($currentUser->first_name . ' ' . $currentUser->last_name));$phpMailer->SMTPDebug = false;$phpMailer->Host = $host;$phpMailer->Port = $port;$phpMailer->IsHTML(true);$phpMailer->SMTPAuth = true;//$phpMailer->SMTPSecure = 'tls';$phpMailer->SMTPAutoTLS = false;$phpMailer->SMTPSecure = ''; // PHPMailer::ENCRYPTION_SMTPS;$phpMailer->Username = $username;$phpMailer->Password = $password;$phpMailer->Subject = $subject;$phpMailer->Body = $message;$phpMailer->AltBody = $message;$phpMailer->CharSet = 'UTF-8';$files = $this->getRequest()->getFiles()->toArray();if (isset($files['filename']) && empty($files['filename']['error'])) {$phpMailer->addAttachment($files['filename']['tmp_name'], $files['filename']['name'] );}if($phpMailer->send()) {return new JsonModel(['success' => true,'data' => 'LABEL_INMAIL_MESSAGE_SENT']);} else {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_NOT_SENT']);}/*\Eden\Core\Control::i();$smtp = eden('mail')->smtp($host,$username,$password,$port,false);$smtp->setSubject( $dataPost['subject']);$smtp->setBody( $dataPost['body'], true);$smtp->setBody($dataPost['body']);$smtp->addTo($user->username_inmail);$files = $this->getRequest()->getFiles()->toArray();if (isset($files['filename']) && empty($files['filename']['error'])) {$smtp->addAttachment($files['filename']['name'], $files['filename']['tmp_name']);}$smtp->send();$smtp->disconnect(); */return new JsonModel(['success' => true,'data' => 'LABEL_INMAIL_MESSAGE_SENT']);} catch (\Exception $e) {return new JsonModel(['success' => false,'data' => 'ERROR_INMAIL_MESSAGE_NOT_SENT']);}} else {$messages = [];$form_messages = (array) $form->getMessages();foreach ($form_messages as $fieldname => $field_messages) {$messages[$fieldname] = array_values($field_messages);}return new JsonModel(['success' => false,'data' => $messages]);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}}