From c4da20f01cf2dcb0a7429577c38d9e607c51b419 Mon Sep 17 00:00:00 2001 From: Mihail Date: Wed, 4 Nov 2015 16:12:01 +0200 Subject: [PATCH] temp commit - testing mail parser --- backend/components/base/BaseActiveRecord.php | 15 ++++++++++++++- backend/controllers/ParserController.php | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ common/components/archive_reader/ArchiveCreator.php | 59 ----------------------------------------------------------- common/components/archive_reader/ArchiveReader.php | 27 --------------------------- common/components/archive_reader/RarArchiveReader.php | 30 ------------------------------ common/components/archives/ArchiveCreator.php | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/components/archives/ArchiveReader.php | 27 +++++++++++++++++++++++++++ common/components/archives/RarArchiveReader.php | 42 ++++++++++++++++++++++++++++++++++++++++++ common/components/archives/ZipArchiveReader.php | 40 ++++++++++++++++++++++++++++++++++++++++ common/components/mail/MailAttachmentsSaver.php | 22 +++++++++++++++++----- console/controllers/ParserController.php | 14 ++++++++++---- 11 files changed, 294 insertions(+), 132 deletions(-) delete mode 100644 common/components/archive_reader/ArchiveCreator.php delete mode 100644 common/components/archive_reader/ArchiveReader.php delete mode 100644 common/components/archive_reader/RarArchiveReader.php create mode 100644 common/components/archives/ArchiveCreator.php create mode 100644 common/components/archives/ArchiveReader.php create mode 100644 common/components/archives/RarArchiveReader.php create mode 100644 common/components/archives/ZipArchiveReader.php diff --git a/backend/components/base/BaseActiveRecord.php b/backend/components/base/BaseActiveRecord.php index 1fd05d1..1c41f6b 100644 --- a/backend/components/base/BaseActiveRecord.php +++ b/backend/components/base/BaseActiveRecord.php @@ -9,4 +9,17 @@ namespace backend\components\base; -class BaseActiveRecord extends \yii\db\ActiveRecord {} \ No newline at end of file +use yii\base\ErrorException; + +class BaseActiveRecord extends \yii\db\ActiveRecord { + + public function throwStringErrorException(){ + + $errors_str = ''; + foreach ($this->getErrors() as $error) { + $errors_str .= implode( array_values($error) ); + } + throw new ErrorException( $errors_str ); + } + +} \ No newline at end of file diff --git a/backend/controllers/ParserController.php b/backend/controllers/ParserController.php index f519020..c04f66e 100644 --- a/backend/controllers/ParserController.php +++ b/backend/controllers/ParserController.php @@ -1,6 +1,9 @@ mailTest(); $model = new UploadFileParsingForm(); - // $mail = new MailParser(); // установим режим, 0 - ручная загрузка, 1 - автозагрузка $model->mode = $mode; return $this->render('index', ['model' => $model]); @@ -126,11 +129,12 @@ class ParserController extends BaseController } else { // не прошла валидация форма загрузки файлов - $errors_str = ''; - foreach ($model->getErrors() as $error) { - $errors_str .= implode( array_values($error) ); - } - throw new ErrorException( $errors_str ); +// $errors_str = ''; +// foreach ($model->getErrors() as $error) { +// $errors_str .= implode( array_values($error) ); +// } +// throw new ErrorException( $errors_str ); + $model->throwStringErrorException(); } // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные } else if (Yii::$app->getCache()->get('parser_data')) { @@ -287,5 +291,71 @@ class ParserController extends BaseController // $csv->actionParseCsv(); } + private function mailTest(){ + + $mail_reader = new ImapMailReader( '{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000' ); + $mailboxes = $mail_reader->getListMailboxes(); + $files = []; + foreach ( $mailboxes as $custom_label ) { + $words = explode(" ",str_replace( array($mail_reader->getHostname(),"!"),"",imap_utf7_decode($custom_label)) ); + $importer_id = (int)preg_replace("/[^A-Z0-9]+/","", strtoupper($words[0])); + + $mail_reader->reOpen( $custom_label ); + $saver = new MailAttachmentsSaver( $mail_reader ); + if ( $importer_id ) { + $saver->setFileNamePrefix( $importer_id . '~!~' ); + } + + if( $saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload'), 'UNSEEN') ){ + $files = array_merge( $files, $saver->getSavedFilesArr() ); + }else{ + continue; + } + + } + + if ( !$files ) { + return; + } + + $arch_creator = new ArchiveCreator(); + $arch_extensions = $arch_creator->getHandleExtension(); + $arch_files = array_intersect( $files , $arch_extensions ); + foreach ($arch_files as $arch_name => $arch_ext) { + $arch_reader = $arch_creator->create( $arch_name, $arch_ext ); + $arch_reader->extractTo(\Yii::getAlias('@temp_upload')); + unset( $files[$arch_name] ); + $files = array_merge( $files, $arch_reader->getExtractedFiles()); + } + + $new_destination = \Yii::getAlias('@auto_upload') . '/'; + foreach ( $files as $name => $ext ) { + + $file_name = pathinfo($name, PATHINFO_FILENAME) . '.' . $ext; + if( $ext = 'csv' ){ + $files_model = new ImportersFiles(); + $files_model->importer_id = $importer_id; + if ($files_model->save()) { + + $file_name = \Yii::$app->db->getLastInsertID() . '.csv'; + + } else{ + + $files_model->throwStringErrorException(); + } + + } + $new_destination .= $file_name; + if( rename( $name, $new_destination ) ){ + + CustomVarDamp::dump('1111111'); + + } else{ + new \ErrorException("Нет возможности переписать файл {$name}"); + } + + } + + } } diff --git a/common/components/archive_reader/ArchiveCreator.php b/common/components/archive_reader/ArchiveCreator.php deleted file mode 100644 index 813a642..0000000 --- a/common/components/archive_reader/ArchiveCreator.php +++ /dev/null @@ -1,59 +0,0 @@ -open($file); - return $arh_reader; - } - - } - - } - // не найден подходящий обработчик - throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" ); - } - - protected function isHandableExtension( $ext ){ - - $this->setHandleExtension( ); - return (bool) array_search( $ext, $this->handleExtension); - } - - protected function setHandleExtension( ){ - if ( !$this->handleExtension ) { - foreach (get_declared_classes() as $class) { - if (is_subclass_of( $class, ArchiveReader::class )) - - $this->handleExtension[] = $class::getExtension(); - - } - } - } - - public function getHandleExtension( ){ - - return $this->handleExtension; - - } - - -} \ No newline at end of file diff --git a/common/components/archive_reader/ArchiveReader.php b/common/components/archive_reader/ArchiveReader.php deleted file mode 100644 index bb02faf..0000000 --- a/common/components/archive_reader/ArchiveReader.php +++ /dev/null @@ -1,27 +0,0 @@ -extracted_files; - } - public function setExtractedFiles($name, $ext){ - $this->extracted_files[$name] = $ext; - } - -} \ No newline at end of file diff --git a/common/components/archive_reader/RarArchiveReader.php b/common/components/archive_reader/RarArchiveReader.php deleted file mode 100644 index b487aff..0000000 --- a/common/components/archive_reader/RarArchiveReader.php +++ /dev/null @@ -1,30 +0,0 @@ -isHandleableExtension( $ext )) { +// $arh_class = ucfirst( $ext ) . 'ArchiveReader'; +// if ( class_exists( $arh_class ) ) { +// +// $arh_reader = new $arh_class(); +// +// if ($arh_reader instanceof ArchiveReader ) { +// $arh_reader->open($file); +// return $arh_reader; +// } +// +// } +// +// } + if ( $ext = 'zip' ) { + $arh_reader = new ZipArchiveReader(); + }else{ + $arh_reader = new RarArchiveReader(); + } + + $arh_reader->open($file); + return $arh_reader; + // не найден подходящий обработчик + throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" ); + } + + protected function isHandleableExtension( $ext ){ + + // $this->setHandleExtension( ); + return (bool) array_search( $ext, $this->handleExtension); + } + +// protected function setHandleExtension( ){ +// if ( !$this->handleExtension ) { +// foreach (get_declared_classes() as $class) { +// if (is_subclass_of( $class, ArchiveReader::class )) +// +// $this->handleExtension[] = $class::getExtension(); +// +// } +// } +// } + + public function getHandleExtension( ){ + + // $this->setHandleExtension( ); + return $this->handleExtension; + + } + + +} \ No newline at end of file diff --git a/common/components/archives/ArchiveReader.php b/common/components/archives/ArchiveReader.php new file mode 100644 index 0000000..7d36e9d --- /dev/null +++ b/common/components/archives/ArchiveReader.php @@ -0,0 +1,27 @@ +extracted_files; + } + public function setExtractedFiles($name, $ext){ + $this->extracted_files[$name] = $ext; + } + +} \ No newline at end of file diff --git a/common/components/archives/RarArchiveReader.php b/common/components/archives/RarArchiveReader.php new file mode 100644 index 0000000..ae3ab08 --- /dev/null +++ b/common/components/archives/RarArchiveReader.php @@ -0,0 +1,42 @@ +resource = rar_open( $file, $password ); + if ($this->resource === FALSE) + throw new \Exception("Failed opening rar file"); + } + + public function extractTo( $destination){ + $list = rar_list($this->resource); + + foreach($list as $file) { + $entry = rar_entry_get($this->resource, $file); + $entry->extract($destination); + + $this->setExtractedFiles($entry->getName(), pathinfo($entry->getName(), PATHINFO_EXTENSION)); + + } + + rar_close($this->resource); + } + public static function getExtension(){ + return 'rar'; + } + + + + +} \ No newline at end of file diff --git a/common/components/archives/ZipArchiveReader.php b/common/components/archives/ZipArchiveReader.php new file mode 100644 index 0000000..b34ec1e --- /dev/null +++ b/common/components/archives/ZipArchiveReader.php @@ -0,0 +1,40 @@ +resource = $zip->open( $file ); + if ($this->resource === FALSE) + throw new \Exception("Failed opening zip file"); + } + + public function extractTo( $destination){ + + $this->resource->extractTo($destination); + + for ($i = 0; $i < $this->resource->numFiles; $i++) { + $filename = $this->resource->getNameIndex($i); + $this->setExtractedFiles($filename, pathinfo($filename, PATHINFO_EXTENSION)); + } + + $this->resource->close(); + } + public static function getExtension(){ + return 'rar'; + } + + + + +} \ No newline at end of file diff --git a/common/components/mail/MailAttachmentsSaver.php b/common/components/mail/MailAttachmentsSaver.php index 34b028d..6c4ecf2 100644 --- a/common/components/mail/MailAttachmentsSaver.php +++ b/common/components/mail/MailAttachmentsSaver.php @@ -38,23 +38,33 @@ class MailAttachmentsSaver /** * @var - префикс который будет прибавлен к оригинальному имени сохраняемого файла */ - public $file_name_prefix; + protected $file_name_prefix; - public function __construct(MailReader $mail_reader, $massage_type) + + + public function __construct(MailReader $mail_reader) { $this->mail_reader = $mail_reader; - $this->massage_type = $massage_type; + $this->saved_files_arr = []; } + /** + * @param mixed $file_name_prefix + */ + public function setFileNamePrefix($file_name_prefix) + { + $this->file_name_prefix = $file_name_prefix; + } - public function saveAttachmentsTo( $destination ) + public function saveAttachmentsTo( $destination, $massage_type ) { + $this->massage_type = $massage_type; $emails = $this->mail_reader->getEmails($this->massage_type); /* if emails are returned, cycle through each... */ - + $result = false; if ($emails) { /* begin output var */ @@ -116,6 +126,7 @@ class MailAttachmentsSaver mb_internal_encoding("UTF-8"); file_put_contents($name, $val['attachment']); $this->setSavedFile( $name , $ext ); + $result = true; } } @@ -127,6 +138,7 @@ class MailAttachmentsSaver } + return $result; } /** diff --git a/console/controllers/ParserController.php b/console/controllers/ParserController.php index 8cc6b46..c3090b8 100644 --- a/console/controllers/ParserController.php +++ b/console/controllers/ParserController.php @@ -150,12 +150,18 @@ class ParserController extends Controller $files = array_merge( $files, $arch_reader->getExtractedFiles()); } - foreach ( $files as $file => $key ) { + foreach ( $files as $name => $ext ) { + $file_name = ''; + if( $ext = 'csv' ){ + $files_model = new ImportersFiles(); + $files_model->importer_id = $importer_id; + if ($files_model->save()) { + $file_name = \Yii::$app->db->getLastInsertID(); + } // обработчик ошибки !!!!! + } - // $files_model = new ImportersFiles(); -// $files_model->importer_id = $importer_id; - // $db->lastInsertId() + // переписываем файл в автолоад папку, и переименовываем если указано имя } } -- libgit2 0.21.4