/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/helpers/EwsHelper.php
301 строка
12 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\helpers; use jamesiarmes\PhpEws\ArrayType\ArrayOfRecipientsType; use jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAllItemsType; use jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfBaseFolderIdsType; use jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfBaseItemIdsType; use jamesiarmes\PhpEws\Client; use jamesiarmes\PhpEws\Enumeration\BodyTypeType; use jamesiarmes\PhpEws\Enumeration\DefaultShapeNamesType; use jamesiarmes\PhpEws\Enumeration\DistinguishedFolderIdNameType; use jamesiarmes\PhpEws\Enumeration\MessageDispositionType; use jamesiarmes\PhpEws\Enumeration\ResponseClassType; use jamesiarmes\PhpEws\Enumeration\UnindexedFieldURIType; use jamesiarmes\PhpEws\Request\CreateItemType; use jamesiarmes\PhpEws\Request\FindItemType; use jamesiarmes\PhpEws\Request\GetItemType; use jamesiarmes\PhpEws\Request\SendItemType; use jamesiarmes\PhpEws\Response\ItemInfoResponseMessageType; use jamesiarmes\PhpEws\Type\AndType; use jamesiarmes\PhpEws\Type\BodyType; use jamesiarmes\PhpEws\Type\ConstantValueType; use jamesiarmes\PhpEws\Type\DistinguishedFolderIdType; use jamesiarmes\PhpEws\Type\EmailAddressType; use jamesiarmes\PhpEws\Type\FieldURIOrConstantType; use jamesiarmes\PhpEws\Type\IsGreaterThanOrEqualToType; use jamesiarmes\PhpEws\Type\IsLessThanOrEqualToType; use jamesiarmes\PhpEws\Type\ItemIdType; use jamesiarmes\PhpEws\Type\ItemResponseShapeType; use jamesiarmes\PhpEws\Type\MessageType; use jamesiarmes\PhpEws\Type\PathToUnindexedFieldType; use jamesiarmes\PhpEws\Type\RestrictionType; use jamesiarmes\PhpEws\Type\SingleRecipientType; use jamesiarmes\PhpEws\Type\TargetFolderIdType; use yii\helpers\VarDumper; use Yii; /** * Дополнительные функции для работы с датой/временем * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2025 */ class EwsHelper { /** * Получить список сообщений * * @param $credentials * @return array * @throws \Exception */ public static function getMessage($credentials) { $version = Client::VERSION_2016; $start_date = new \DateTime(DateHelper::now(time() - DateHelper::DAY)); $end_date = new \DateTime(DateHelper::now()); $timezone = 'Eastern Standard Time'; $result = []; // Настройки подключения $client = new Client($credentials['server'], $credentials['username'], $credentials['password'], $version); $client->setTimezone($timezone); $request = new FindItemType(); $request->ParentFolderIds = new NonEmptyArrayOfBaseFolderIdsType(); // Build the start date restriction. $greater_than = new IsGreaterThanOrEqualToType(); $greater_than->FieldURI = new PathToUnindexedFieldType(); $greater_than->FieldURI->FieldURI = UnindexedFieldURIType::ITEM_DATE_TIME_RECEIVED; $greater_than->FieldURIOrConstant = new FieldURIOrConstantType(); $greater_than->FieldURIOrConstant->Constant = new ConstantValueType(); $greater_than->FieldURIOrConstant->Constant->Value = $start_date->format('c'); // Build the end date restriction; $less_than = new IsLessThanOrEqualToType(); $less_than->FieldURI = new PathToUnindexedFieldType(); $less_than->FieldURI->FieldURI = UnindexedFieldURIType::ITEM_DATE_TIME_RECEIVED; $less_than->FieldURIOrConstant = new FieldURIOrConstantType(); $less_than->FieldURIOrConstant->Constant = new ConstantValueType(); $less_than->FieldURIOrConstant->Constant->Value = $end_date->format('c'); // Build the restriction. $request->Restriction = new RestrictionType(); $request->Restriction->And = new AndType(); $request->Restriction->And->IsGreaterThanOrEqualTo = $greater_than; $request->Restriction->And->IsLessThanOrEqualTo = $less_than; // Return all message properties. $request->ItemShape = new ItemResponseShapeType(); $request->ItemShape->BaseShape = DefaultShapeNamesType::ALL_PROPERTIES; // Search in the user's inbox. $folder_id = new DistinguishedFolderIdType(); $folder_id->Id = DistinguishedFolderIdNameType::INBOX; $request->ParentFolderIds->DistinguishedFolderId[] = $folder_id; try { $response = $client->FindItem($request); Yii::debug(VarDumper::dumpAsString([ 'find_message' => $request ])); $response_messages = $response->ResponseMessages->FindItemResponseMessage; foreach ($response_messages as $response_message) { // Iterate over the messages that were found, printing the subject for each. $items = $response_message->RootFolder->Items->Message; foreach ($items as $item) { $subject = $item->Subject; $id = $item->ItemId->Id; $the_request = new GetItemType(); $the_request->ItemIds = new NonEmptyArrayOfBaseItemIdsType(); $the_request->ItemIds->ItemId[] = $item->ItemId; $the_request->ItemShape = new ItemResponseShapeType(); $the_request->ItemShape->BaseShape = DefaultShapeNamesType::ALL_PROPERTIES; $response_body = $client->GetItem($the_request); /** @var ItemInfoResponseMessageType $body_message */ $body_message = $response_body->ResponseMessages->GetItemResponseMessage[0]; $body = $body_message->Items->Message[0]->Body->_; $result [] = [ 'id' => $id, 'sent' => $item->DateTimeSent, 'from' => $item->From->Mailbox->EmailAddress, 'name' => $item->From->Mailbox->Name, 'subject' => $subject, 'body' => $body, ]; } } } catch (\Exception $e) { Yii::debug(VarDumper::dumpAsString([ 'message' => $e->getMessage(), 'credentials' => $credentials ])); } return $result; } /** * Создание сообщение в почтовом сервере * * @param $credentials * @param $options * @return array * @throws \Exception */ public static function createMessage($credentials, $options = []) { $version = Client::VERSION_2016; $timezone = 'Eastern Standard Time'; // Настройки подключения $client = new Client($credentials['server'], $credentials['username'], $credentials['password'], $version); $client->setTimezone($timezone); $subject = ArrayHelper::getValue($options, 'subject'); $name_from = ArrayHelper::getValue($options, 'name_from'); $email_from = ArrayHelper::getValue($options, 'email_from'); $name_to = ArrayHelper::getValue($options, 'name_to'); $email_to = ArrayHelper::getValue($options, 'email_to'); $message_body = ArrayHelper::getValue($options, 'message_body'); // Build the request, $request = new CreateItemType(); $request->Items = new NonEmptyArrayOfAllItemsType(); // Save the message, but do not send it. $request->MessageDisposition = MessageDispositionType::SAVE_ONLY; // Create the message. $message = new MessageType(); $message->Subject = $subject; $message->ToRecipients = new ArrayOfRecipientsType(); // Set the sender. $message->From = new SingleRecipientType(); $message->From->Mailbox = new EmailAddressType(); $message->From->Mailbox->EmailAddress = $email_from; $message->From->Mailbox->Name = $name_from; // Set the recipient. $recipient = new EmailAddressType(); $recipient->Name = $name_to; $recipient->EmailAddress = $email_to; $message->ToRecipients->Mailbox[] = $recipient; // Set the message body. $message->Body = new BodyType(); $message->Body->BodyType = BodyTypeType::TEXT; $message->Body->_ = $message_body; // Add the message to the request. $request->Items->Message[] = $message; $result = []; try { $response = $client->CreateItem($request); Yii::debug(VarDumper::dumpAsString([ 'create_message' => $options ])); // Iterate over the results, printing any error messages or message ids. $response_messages = $response->ResponseMessages->CreateItemResponseMessage; foreach ($response_messages as $response_message) { // Make sure the request succeeded. if ($response_message->ResponseClass == ResponseClassType::SUCCESS) { // Iterate over the created messages, printing the id for each. foreach ($response_message->Items->Message as $item) { $result = [ 'message_id' => $item->ItemId->Id, 'change_key' => $item->ItemId->ChangeKey ]; } } } } catch (\Exception $e) { Yii::debug(VarDumper::dumpAsString([ 'message' => $e->getMessage() ])); } return $result; } /** * Отправить сообщение * * @param $credentials * @param $options * @return array|void * @throws \Exception */ public static function sendMessage($credentials, $options = []) { // Replace with the id and change key of the message to be sent. $message_id = ArrayHelper::getValue($options, 'message_id'); $change_key = ArrayHelper::getValue($options, 'change_key'); // Set connection information. $version = Client::VERSION_2016; $client = new Client($credentials['server'], $credentials['username'], $credentials['password'], $version); // Build the request. $request = new SendItemType(); $request->SaveItemToFolder = true; $request->ItemIds = new NonEmptyArrayOfBaseItemIdsType(); // Add the message to the request. $item = new ItemIdType(); $item->Id = $message_id; $item->ChangeKey = $change_key; $request->ItemIds->ItemId[] = $item; // Configure the folder to save the sent message to. $send_folder = new TargetFolderIdType(); $send_folder->DistinguishedFolderId = new DistinguishedFolderIdType(); $send_folder->DistinguishedFolderId->Id = DistinguishedFolderIdNameType::SENT; $request->SavedItemFolderId = $send_folder; $result = []; try { $response = $client->SendItem($request); Yii::debug(VarDumper::dumpAsString([ 'send_message' => $options ])); // Iterate over the results, printing any error messages. $response_messages = $response->ResponseMessages->SendItemResponseMessage; foreach ($response_messages as $response_message) { // Make sure the request succeeded. if ($response_message->ResponseClass != ResponseClassType::SUCCESS) { $code = $response_message->ResponseCode; $message = $response_message->MessageText; return [ 'code' => $code, 'message' => $message ]; } } } catch (\Exception $e) { Yii::debug(VarDumper::dumpAsString([ 'message' => $e->getMessage() ])); } return $result; } }