Commit c4da20f01cf2dcb0a7429577c38d9e607c51b419
1 parent
8f043ab6
temp commit - testing mail parser
Showing
9 changed files
with
242 additions
and
80 deletions
Show diff stats
backend/components/base/BaseActiveRecord.php
| @@ -9,4 +9,17 @@ | @@ -9,4 +9,17 @@ | ||
| 9 | namespace backend\components\base; | 9 | namespace backend\components\base; |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | -class BaseActiveRecord extends \yii\db\ActiveRecord {} | ||
| 13 | \ No newline at end of file | 12 | \ No newline at end of file |
| 13 | +use yii\base\ErrorException; | ||
| 14 | + | ||
| 15 | +class BaseActiveRecord extends \yii\db\ActiveRecord { | ||
| 16 | + | ||
| 17 | + public function throwStringErrorException(){ | ||
| 18 | + | ||
| 19 | + $errors_str = ''; | ||
| 20 | + foreach ($this->getErrors() as $error) { | ||
| 21 | + $errors_str .= implode( array_values($error) ); | ||
| 22 | + } | ||
| 23 | + throw new ErrorException( $errors_str ); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | +} | ||
| 14 | \ No newline at end of file | 27 | \ No newline at end of file |
backend/controllers/ParserController.php
| 1 | <?php | 1 | <?php |
| 2 | namespace backend\controllers; | 2 | namespace backend\controllers; |
| 3 | 3 | ||
| 4 | +use common\components\archives\ArchiveCreator; | ||
| 5 | +use common\components\mail\ImapMailReader; | ||
| 6 | +use common\components\mail\MailAttachmentsSaver; | ||
| 4 | use common\components\parsers\MailParser; | 7 | use common\components\parsers\MailParser; |
| 5 | use Yii; | 8 | use Yii; |
| 6 | use yii\data\ActiveDataProvider; | 9 | use yii\data\ActiveDataProvider; |
| @@ -53,8 +56,8 @@ class ParserController extends BaseController | @@ -53,8 +56,8 @@ class ParserController extends BaseController | ||
| 53 | 56 | ||
| 54 | public function actionIndex($mode = 0) | 57 | public function actionIndex($mode = 0) |
| 55 | { | 58 | { |
| 59 | + $this->mailTest(); | ||
| 56 | $model = new UploadFileParsingForm(); | 60 | $model = new UploadFileParsingForm(); |
| 57 | - // $mail = new MailParser(); | ||
| 58 | // установим режим, 0 - ручная загрузка, 1 - автозагрузка | 61 | // установим режим, 0 - ручная загрузка, 1 - автозагрузка |
| 59 | $model->mode = $mode; | 62 | $model->mode = $mode; |
| 60 | return $this->render('index', ['model' => $model]); | 63 | return $this->render('index', ['model' => $model]); |
| @@ -126,11 +129,12 @@ class ParserController extends BaseController | @@ -126,11 +129,12 @@ class ParserController extends BaseController | ||
| 126 | 129 | ||
| 127 | } else { | 130 | } else { |
| 128 | // не прошла валидация форма загрузки файлов | 131 | // не прошла валидация форма загрузки файлов |
| 129 | - $errors_str = ''; | ||
| 130 | - foreach ($model->getErrors() as $error) { | ||
| 131 | - $errors_str .= implode( array_values($error) ); | ||
| 132 | - } | ||
| 133 | - throw new ErrorException( $errors_str ); | 132 | +// $errors_str = ''; |
| 133 | +// foreach ($model->getErrors() as $error) { | ||
| 134 | +// $errors_str .= implode( array_values($error) ); | ||
| 135 | +// } | ||
| 136 | +// throw new ErrorException( $errors_str ); | ||
| 137 | + $model->throwStringErrorException(); | ||
| 134 | } | 138 | } |
| 135 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные | 139 | // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные |
| 136 | } else if (Yii::$app->getCache()->get('parser_data')) { | 140 | } else if (Yii::$app->getCache()->get('parser_data')) { |
| @@ -287,5 +291,71 @@ class ParserController extends BaseController | @@ -287,5 +291,71 @@ class ParserController extends BaseController | ||
| 287 | // $csv->actionParseCsv(); | 291 | // $csv->actionParseCsv(); |
| 288 | } | 292 | } |
| 289 | 293 | ||
| 294 | + private function mailTest(){ | ||
| 295 | + | ||
| 296 | + $mail_reader = new ImapMailReader( '{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000' ); | ||
| 297 | + $mailboxes = $mail_reader->getListMailboxes(); | ||
| 298 | + $files = []; | ||
| 299 | + foreach ( $mailboxes as $custom_label ) { | ||
| 300 | + $words = explode(" ",str_replace( array($mail_reader->getHostname(),"!"),"",imap_utf7_decode($custom_label)) ); | ||
| 301 | + $importer_id = (int)preg_replace("/[^A-Z0-9]+/","", strtoupper($words[0])); | ||
| 302 | + | ||
| 303 | + $mail_reader->reOpen( $custom_label ); | ||
| 304 | + $saver = new MailAttachmentsSaver( $mail_reader ); | ||
| 305 | + if ( $importer_id ) { | ||
| 306 | + $saver->setFileNamePrefix( $importer_id . '~!~' ); | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + if( $saver->saveAttachmentsTo(\Yii::getAlias('@temp_upload'), 'UNSEEN') ){ | ||
| 310 | + $files = array_merge( $files, $saver->getSavedFilesArr() ); | ||
| 311 | + }else{ | ||
| 312 | + continue; | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + if ( !$files ) { | ||
| 318 | + return; | ||
| 319 | + } | ||
| 320 | + | ||
| 321 | + $arch_creator = new ArchiveCreator(); | ||
| 322 | + $arch_extensions = $arch_creator->getHandleExtension(); | ||
| 323 | + $arch_files = array_intersect( $files , $arch_extensions ); | ||
| 324 | + foreach ($arch_files as $arch_name => $arch_ext) { | ||
| 325 | + $arch_reader = $arch_creator->create( $arch_name, $arch_ext ); | ||
| 326 | + $arch_reader->extractTo(\Yii::getAlias('@temp_upload')); | ||
| 327 | + unset( $files[$arch_name] ); | ||
| 328 | + $files = array_merge( $files, $arch_reader->getExtractedFiles()); | ||
| 329 | + } | ||
| 330 | + | ||
| 331 | + $new_destination = \Yii::getAlias('@auto_upload') . '/'; | ||
| 332 | + foreach ( $files as $name => $ext ) { | ||
| 333 | + | ||
| 334 | + $file_name = pathinfo($name, PATHINFO_FILENAME) . '.' . $ext; | ||
| 335 | + if( $ext = 'csv' ){ | ||
| 336 | + $files_model = new ImportersFiles(); | ||
| 337 | + $files_model->importer_id = $importer_id; | ||
| 338 | + if ($files_model->save()) { | ||
| 339 | + | ||
| 340 | + $file_name = \Yii::$app->db->getLastInsertID() . '.csv'; | ||
| 341 | + | ||
| 342 | + } else{ | ||
| 343 | + | ||
| 344 | + $files_model->throwStringErrorException(); | ||
| 345 | + } | ||
| 346 | + | ||
| 347 | + } | ||
| 348 | + $new_destination .= $file_name; | ||
| 349 | + if( rename( $name, $new_destination ) ){ | ||
| 350 | + | ||
| 351 | + CustomVarDamp::dump('1111111'); | ||
| 352 | + | ||
| 353 | + } else{ | ||
| 354 | + new \ErrorException("Нет возможности переписать файл {$name}"); | ||
| 355 | + } | ||
| 356 | + | ||
| 357 | + } | ||
| 358 | + | ||
| 359 | + } | ||
| 290 | 360 | ||
| 291 | } | 361 | } |
common/components/archive_reader/ArchiveCreator.php deleted
| 1 | -<?php | ||
| 2 | -/** | ||
| 3 | - * Created by PhpStorm. | ||
| 4 | - * User: Tsurkanov | ||
| 5 | - * Date: 03.11.2015 | ||
| 6 | - * Time: 14:51 | ||
| 7 | - */ | ||
| 8 | - | ||
| 9 | -namespace common\components\archive_reader; | ||
| 10 | - | ||
| 11 | - | ||
| 12 | -class ArchiveCreator { | ||
| 13 | - | ||
| 14 | - protected $handleExtension = []; | ||
| 15 | - | ||
| 16 | - public function create( $file, $ext ){ | ||
| 17 | - if ( isHandableExtension( $ext )) { | ||
| 18 | - $arh_class = ucfirst( $ext ) . 'ArchiveReader'; | ||
| 19 | - if ( class_exists( $arh_class ) ) { | ||
| 20 | - | ||
| 21 | - $arh_reader = new $arh_class(); | ||
| 22 | - | ||
| 23 | - if ($arh_reader instanceof ArchiveReader ) { | ||
| 24 | - $arh_reader->open($file); | ||
| 25 | - return $arh_reader; | ||
| 26 | - } | ||
| 27 | - | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - } | ||
| 31 | - // не найден подходящий обработчик | ||
| 32 | - throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" ); | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - protected function isHandableExtension( $ext ){ | ||
| 36 | - | ||
| 37 | - $this->setHandleExtension( ); | ||
| 38 | - return (bool) array_search( $ext, $this->handleExtension); | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - protected function setHandleExtension( ){ | ||
| 42 | - if ( !$this->handleExtension ) { | ||
| 43 | - foreach (get_declared_classes() as $class) { | ||
| 44 | - if (is_subclass_of( $class, ArchiveReader::class )) | ||
| 45 | - | ||
| 46 | - $this->handleExtension[] = $class::getExtension(); | ||
| 47 | - | ||
| 48 | - } | ||
| 49 | - } | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - public function getHandleExtension( ){ | ||
| 53 | - | ||
| 54 | - return $this->handleExtension; | ||
| 55 | - | ||
| 56 | - } | ||
| 57 | - | ||
| 58 | - | ||
| 59 | -} | ||
| 60 | \ No newline at end of file | 0 | \ No newline at end of file |
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * Created by PhpStorm. | ||
| 4 | + * User: Tsurkanov | ||
| 5 | + * Date: 03.11.2015 | ||
| 6 | + * Time: 14:51 | ||
| 7 | + */ | ||
| 8 | + | ||
| 9 | +namespace common\components\archives; | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +class ArchiveCreator { | ||
| 13 | + | ||
| 14 | + protected $handleExtension = ['rar', 'zip']; | ||
| 15 | + | ||
| 16 | + public function create( $file, $ext ){ | ||
| 17 | +// if ( $this->isHandleableExtension( $ext )) { | ||
| 18 | +// $arh_class = ucfirst( $ext ) . 'ArchiveReader'; | ||
| 19 | +// if ( class_exists( $arh_class ) ) { | ||
| 20 | +// | ||
| 21 | +// $arh_reader = new $arh_class(); | ||
| 22 | +// | ||
| 23 | +// if ($arh_reader instanceof ArchiveReader ) { | ||
| 24 | +// $arh_reader->open($file); | ||
| 25 | +// return $arh_reader; | ||
| 26 | +// } | ||
| 27 | +// | ||
| 28 | +// } | ||
| 29 | +// | ||
| 30 | +// } | ||
| 31 | + if ( $ext = 'zip' ) { | ||
| 32 | + $arh_reader = new ZipArchiveReader(); | ||
| 33 | + }else{ | ||
| 34 | + $arh_reader = new RarArchiveReader(); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + $arh_reader->open($file); | ||
| 38 | + return $arh_reader; | ||
| 39 | + // не найден подходящий обработчик | ||
| 40 | + throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" ); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + protected function isHandleableExtension( $ext ){ | ||
| 44 | + | ||
| 45 | + // $this->setHandleExtension( ); | ||
| 46 | + return (bool) array_search( $ext, $this->handleExtension); | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | +// protected function setHandleExtension( ){ | ||
| 50 | +// if ( !$this->handleExtension ) { | ||
| 51 | +// foreach (get_declared_classes() as $class) { | ||
| 52 | +// if (is_subclass_of( $class, ArchiveReader::class )) | ||
| 53 | +// | ||
| 54 | +// $this->handleExtension[] = $class::getExtension(); | ||
| 55 | +// | ||
| 56 | +// } | ||
| 57 | +// } | ||
| 58 | +// } | ||
| 59 | + | ||
| 60 | + public function getHandleExtension( ){ | ||
| 61 | + | ||
| 62 | + // $this->setHandleExtension( ); | ||
| 63 | + return $this->handleExtension; | ||
| 64 | + | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + | ||
| 68 | +} | ||
| 0 | \ No newline at end of file | 69 | \ No newline at end of file |
common/components/archive_reader/ArchiveReader.php renamed to common/components/archives/ArchiveReader.php
common/components/archive_reader/RarArchiveReader.php renamed to common/components/archives/RarArchiveReader.php
| @@ -6,19 +6,31 @@ | @@ -6,19 +6,31 @@ | ||
| 6 | * Time: 15:12 | 6 | * Time: 15:12 |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | -namespace common\components\archive_reader; | 9 | +namespace common\components\archives; |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | class RarArchiveReader extends ArchiveReader { | 12 | class RarArchiveReader extends ArchiveReader { |
| 13 | 13 | ||
| 14 | + protected $resource; | ||
| 14 | public function open( $file, $password = '' ){ | 15 | public function open( $file, $password = '' ){ |
| 15 | - $rar_arch = \RarArchive::open( $file, $password ); | ||
| 16 | - if ($rar_arch === FALSE) | ||
| 17 | - die("Failed opening file"); | 16 | + |
| 17 | + $this->resource = rar_open( $file, $password ); | ||
| 18 | + if ($this->resource === FALSE) | ||
| 19 | + throw new \Exception("Failed opening rar file"); | ||
| 18 | } | 20 | } |
| 19 | 21 | ||
| 20 | public function extractTo( $destination){ | 22 | public function extractTo( $destination){ |
| 23 | + $list = rar_list($this->resource); | ||
| 24 | + | ||
| 25 | + foreach($list as $file) { | ||
| 26 | + $entry = rar_entry_get($this->resource, $file); | ||
| 27 | + $entry->extract($destination); | ||
| 28 | + | ||
| 29 | + $this->setExtractedFiles($entry->getName(), pathinfo($entry->getName(), PATHINFO_EXTENSION)); | ||
| 30 | + | ||
| 31 | + } | ||
| 21 | 32 | ||
| 33 | + rar_close($this->resource); | ||
| 22 | } | 34 | } |
| 23 | public static function getExtension(){ | 35 | public static function getExtension(){ |
| 24 | return 'rar'; | 36 | return 'rar'; |
| 1 | +<?php | ||
| 2 | +/** | ||
| 3 | + * Created by PhpStorm. | ||
| 4 | + * User: Tsurkanov | ||
| 5 | + * Date: 03.11.2015 | ||
| 6 | + * Time: 15:12 | ||
| 7 | + */ | ||
| 8 | + | ||
| 9 | +namespace common\components\archives; | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +class ZipArchiveReader extends ArchiveReader { | ||
| 13 | + | ||
| 14 | + protected $resource; | ||
| 15 | + public function open( $file, $password = '' ){ | ||
| 16 | + $zip = new \ZipArchive; | ||
| 17 | + $this->resource = $zip->open( $file ); | ||
| 18 | + if ($this->resource === FALSE) | ||
| 19 | + throw new \Exception("Failed opening zip file"); | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public function extractTo( $destination){ | ||
| 23 | + | ||
| 24 | + $this->resource->extractTo($destination); | ||
| 25 | + | ||
| 26 | + for ($i = 0; $i < $this->resource->numFiles; $i++) { | ||
| 27 | + $filename = $this->resource->getNameIndex($i); | ||
| 28 | + $this->setExtractedFiles($filename, pathinfo($filename, PATHINFO_EXTENSION)); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + $this->resource->close(); | ||
| 32 | + } | ||
| 33 | + public static function getExtension(){ | ||
| 34 | + return 'rar'; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + | ||
| 38 | + | ||
| 39 | + | ||
| 40 | +} | ||
| 0 | \ No newline at end of file | 41 | \ No newline at end of file |
common/components/mail/MailAttachmentsSaver.php
| @@ -38,23 +38,33 @@ class MailAttachmentsSaver | @@ -38,23 +38,33 @@ class MailAttachmentsSaver | ||
| 38 | /** | 38 | /** |
| 39 | * @var - префикс который будет прибавлен к оригинальному имени сохраняемого файла | 39 | * @var - префикс который будет прибавлен к оригинальному имени сохраняемого файла |
| 40 | */ | 40 | */ |
| 41 | - public $file_name_prefix; | 41 | + protected $file_name_prefix; |
| 42 | 42 | ||
| 43 | - public function __construct(MailReader $mail_reader, $massage_type) | 43 | + |
| 44 | + | ||
| 45 | + public function __construct(MailReader $mail_reader) | ||
| 44 | { | 46 | { |
| 45 | $this->mail_reader = $mail_reader; | 47 | $this->mail_reader = $mail_reader; |
| 46 | - $this->massage_type = $massage_type; | 48 | + |
| 47 | $this->saved_files_arr = []; | 49 | $this->saved_files_arr = []; |
| 48 | 50 | ||
| 49 | } | 51 | } |
| 50 | 52 | ||
| 53 | + /** | ||
| 54 | + * @param mixed $file_name_prefix | ||
| 55 | + */ | ||
| 56 | + public function setFileNamePrefix($file_name_prefix) | ||
| 57 | + { | ||
| 58 | + $this->file_name_prefix = $file_name_prefix; | ||
| 59 | + } | ||
| 51 | 60 | ||
| 52 | - public function saveAttachmentsTo( $destination ) | 61 | + public function saveAttachmentsTo( $destination, $massage_type ) |
| 53 | { | 62 | { |
| 63 | + $this->massage_type = $massage_type; | ||
| 54 | $emails = $this->mail_reader->getEmails($this->massage_type); | 64 | $emails = $this->mail_reader->getEmails($this->massage_type); |
| 55 | 65 | ||
| 56 | /* if emails are returned, cycle through each... */ | 66 | /* if emails are returned, cycle through each... */ |
| 57 | - | 67 | + $result = false; |
| 58 | if ($emails) { | 68 | if ($emails) { |
| 59 | 69 | ||
| 60 | /* begin output var */ | 70 | /* begin output var */ |
| @@ -116,6 +126,7 @@ class MailAttachmentsSaver | @@ -116,6 +126,7 @@ class MailAttachmentsSaver | ||
| 116 | mb_internal_encoding("UTF-8"); | 126 | mb_internal_encoding("UTF-8"); |
| 117 | file_put_contents($name, $val['attachment']); | 127 | file_put_contents($name, $val['attachment']); |
| 118 | $this->setSavedFile( $name , $ext ); | 128 | $this->setSavedFile( $name , $ext ); |
| 129 | + $result = true; | ||
| 119 | } | 130 | } |
| 120 | 131 | ||
| 121 | } | 132 | } |
| @@ -127,6 +138,7 @@ class MailAttachmentsSaver | @@ -127,6 +138,7 @@ class MailAttachmentsSaver | ||
| 127 | 138 | ||
| 128 | } | 139 | } |
| 129 | 140 | ||
| 141 | + return $result; | ||
| 130 | } | 142 | } |
| 131 | 143 | ||
| 132 | /** | 144 | /** |
console/controllers/ParserController.php
| @@ -150,12 +150,18 @@ class ParserController extends Controller | @@ -150,12 +150,18 @@ class ParserController extends Controller | ||
| 150 | $files = array_merge( $files, $arch_reader->getExtractedFiles()); | 150 | $files = array_merge( $files, $arch_reader->getExtractedFiles()); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | - foreach ( $files as $file => $key ) { | 153 | + foreach ( $files as $name => $ext ) { |
| 154 | + $file_name = ''; | ||
| 155 | + if( $ext = 'csv' ){ | ||
| 156 | + $files_model = new ImportersFiles(); | ||
| 157 | + $files_model->importer_id = $importer_id; | ||
| 158 | + if ($files_model->save()) { | ||
| 159 | + $file_name = \Yii::$app->db->getLastInsertID(); | ||
| 160 | + } // обработчик ошибки !!!!! | ||
| 154 | 161 | ||
| 162 | + } | ||
| 155 | 163 | ||
| 156 | - // $files_model = new ImportersFiles(); | ||
| 157 | -// $files_model->importer_id = $importer_id; | ||
| 158 | - // $db->lastInsertId() | 164 | + // переписываем файл в автолоад папку, и переименовываем если указано имя |
| 159 | } | 165 | } |
| 160 | 166 | ||
| 161 | } | 167 | } |