/** * Получить данные из текста письма */ public function testGetDataFromMailPart() { // Создаем отправителя $source = new EmailSource(); $source->setName($this->_source); $source->setEmailList("anytest@test.tst, " . $this->_from); $source->save(); $sourceId = $source->getId(); // Создаем парсер $parser = new EmailParser(); $parser->setEmailSourceId($sourceId); $parser->setName($this->_subject); $parser->setSubjectRegexp("описание операции \\(Снятие наличных\\/Платеж\\)"); $parser->setAccountRegexp("Номер карты: (\\d\\d\\d\\d)"); $parser->setTotalRegexp("списано средств: ([\\d\\.,]+) "); $parser->setDescriptionRegexp("Описание: (.+)"); $parser->setType($this->_type); $parser->save(); $email = new myCreateEmailImport($this->_getEmailData()); $email->addPart('qwerty'); $mailArray = myParseEmailImport::getEmailData((string) $email); $getEmail = new myParseEmailImport($mailArray['body'], $parser, $mailArray['to']); $this->assertEquals($this->_getParseData(), $getEmail->getData($this->_operationId)); // Проверим, работает ли регексп чистки суммы $this->_amount = '123,-400x.a00'; $parser->setTotalRegexp("списано средств: ([\\d\\.,a-zA-Z\\-]+) "); $parser->save(); $email = new myCreateEmailImport($this->_getEmailData()); $mailArray = myParseEmailImport::getEmailData((string) $email); $getEmail = new myParseEmailImport($mailArray['body'], $parser, $mailArray['to']); $data = $getEmail->getData($this->_operationId); $this->assertEquals('123400.00', $data['amount']); }
/** * Run */ public function execute($arguments = array(), $options = array()) { // From file if ($arguments['file']) { if (!is_readable($arguments['file'])) { $this->logSection('import', "Failed to read file `{$arguments['file']}`", null, 'ERROR'); return self::ERROR_INVALID_INPUT; } $input = file_get_contents($arguments['file']); // STDIN } else { $input = ''; while ($row = fgets(STDIN)) { $input .= $row; } $input = trim($input); } if (!$input) { $this->logging("Expected not empty input", $input); $this->logMessage(null, 'Нет данных на входе', 'При парсинге входящего письма не получили данных.'); return self::ERROR_EMPTY_INPUT; } $mail = myParseEmailImport::getEmailData($input); if (false == $mail) { $this->logging("Not a valid .eml file format", $input); $this->logMessage(null, 'Письмо не может быть распознано', 'Входящее письмо не может быть распознано, т.к. формат не соответствует стандарту.', $input); return self::ERROR_EMAIL_FORMAT; } $from = $mail['from']; $subject = $mail['subject']; // Инициализировать соединение с БД $databaseManager = new sfDatabaseManager($this->configuration); if ($from == self::AMT_SOURCE_EMAIL) { // Для парсинга AMT $importClass = "myParseEmailAmtImport"; $importForm = "OperationImportAmtForm"; $parser = null; } else { $importClass = "myParseEmailImport"; $importForm = "OperationImportForm"; // Получаем отправителя $source = Doctrine_Core::getTable("EmailSource")->getByEmail($from); if (false === $source) { $this->logging("Unknown sender", $from); $this->logMessage(null, 'Неизвестный отправитель', 'В нашей БД отсутствует отправитель (БАНК).', sprintf("Отправлено от: %s\nОтправлено для: %s\nТема письма: %s\nТело письма:\n%s", $from, $mail['to'], $mail['subject'], $mail['body'])); $this->forwardMail($mail['to'], $mail['subject'], $mail['body']); return self::ERROR_UNKNOWN_SENDER; } // Ищем подходящий парсер $parser = $source->getParserBySubject($subject); if (!is_object($parser) || !$parser instanceof EmailParser) { $this->logging("Can't find any suitable parser for subject", $subject); $this->logMessage(null, 'Нет парсера для обработки письма', 'Невозможно подобрать парсер, необходимый для обработки письма, по его теме.', sprintf("Отправлено от: %s\nОтправлено для: %s\nТема письма: %s\nТело письма:\n%s", $from, $mail['to'], $mail['subject'], $mail['body'])); $this->forwardMail($mail['to'], $mail['subject'], $mail['body']); return self::ERROR_NO_PARSER; } $input = $mail['body']; } // Парсинг данных try { $getEmail = new $importClass($input, $parser, $mail['to']); $operationData = $getEmail->getData(); } catch (Exception $e) { $this->logging($e->getMessage(), $input); $this->logMessage(null, 'Парсер не смог обработать письмо', sprintf('Обработка данных письма вызвала ошибку "%s" при обработке тела письма', $e->getMessage()), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input)); return self::ERROR_PARSER_EXCEPTION; } // Форма/Сохранить операцию $form = new $importForm(); $form->bind($operationData); if ($form->isValid()) { $form->save(); } else { $this->logging($form->getErrorSchema(), $input); $this->logMessage(null, 'Сохранение операции', sprintf("Попытка сохранения операции не удалась.\nВозникшие ошибки при валидации данных: %s", $form->getErrorSchema()), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input)); return self::ERROR_IMPORT_OPERATION; } $this->logMessage('info', 'Сохранение операции', sprintf('Операция успешно создана.'), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input), null, $form->getObject()->getId()); $this->logSection('import', 'Done'); return self::OK; }