3xw/cakephp-mailparser
Composer 安装命令:
composer require 3xw/cakephp-mailparser
包简介
CakePHP mail parser
README 文档
README
Use this plugin to connect a mail account retrieve mail(s) & related attachment(s). A base Parser class is present in order to parse csv/xls files and store data in your db via your models.this plugin comes with very usefull libs:
"dereuromark/cakephp-queue": "^3.4",
"php-imap/php-imap": "~2.0",
"league/csv": "^8.2",
"phpoffice/phpexcel": "^1.8"
Installation
You can install this plugin into your CakePHP application using composer.
The recommended way to install composer packages is:
composer require 3xw/cakephp-mailparser
Load it in your config/boostrap.php
not needed
Workers
SaveMailAttachments queue task
based on dereuromark/cakephp-queue you can directly use the SaveMailAttachments task. You can add the task to workers list:
$this->QueuedJobs->createJob('SaveMailAttachments', [
'name' => 'Save mail attachments',
'data' => [
'username' => 'username',
'password' => 'password',
'mailbox' => '{imap.example.org:993/imap/ssl}INBOX',
'mailObjectNeedles' => ['test','exemple'], // mail objects array to look for
'fileNeedles' => ['.*\.xlsx'], // file serach strings array based on cakephp's Folder::find() fct
'folder' => TMP.'MailAttachments/' // folder to copy files in. ( be sure folder exists if php is not allowed to create the very folder )
]
]);
Extends the SaveMailAttachments queue task
Find here a exemple task that extends SaveMailAttachments Task:
<?
namespace App\Shell\Task;
use App\Parser\CsvToModelParser; // a custom parser that extends Trois\MailParser\Parser\Parser
use Trois\MailParser\Shell\Task\QueueSaveMailAttachmentsTask;
class QueueGetLastCsvTask extends QueueSaveMailAttachmentsTask
{
public $defaults = [
'username' => 'xxx',
'password' => 'xx',
'mailbox' => '{mail.xxx.com:993/imap/ssl}INBOX',
'mailObjectNeedles' => ['Object 1','Object 2'],
'fileNeedles' => ['.*\.csv'],
'folder' => TMP.'foo/' // needed even if not used...
];
public $parser = null;
public function run(array $data, $id)
{
$this->_connect();
$this->parser = new CsvToModelParser();
$count = 0;
$rows = 0;
$success = 0;
foreach($this->defaults['mailObjectNeedles'] as $needle)
{
$files = $this->_getMailAttachments($needle);
foreach($files as $key => $file)
{
$count++;
$this->out('proccessing file: '.$key.' -> '.$file->name);
$results = $this->parser->save($file);
if(empty($results))
{
$this->err('Error parsing file -> No record saved');
}else{
$rows += count($results);
$this->info(count($results).' positions were successfully stored!');
$success++;
}
}
$this->_clean();
}
// inform
$status = $success.' files were successfully parsed on '.$count.', '.$rows.' positions were stored in db';
return $this->_finish($status, $id);
}
}
You can now add this task directly:
bin/cake Queue add GetLastCsv
And run the worker:
bin/cake Queue runworker
Parsers
The class Trois\MailParser\Parser\Parser will help you parse files. It implements Trois\MailParser\Parser\iParser interface that is as folow:
<?
namespace Trois\MailParser\Parser;
use Cake\Filesystem\File;
interface iParser
{
public function fileToEntities(File $file);
public function save(File $file);
}
Parser class
This class will init models for you and save parsed entities using the main model. Its concept is: file against model:
<?
namespace Trois\MailParser\Parser;
use Cake\ORM\TableRegistry;
use Cake\Filesystem\File;
use Cake\Core\InstanceConfigTrait;
class Parser implements iParser
{
use InstanceConfigTrait;
public $reader = null;
protected $_defaultConfig = [
'model' => 'ExempleModelTable',
'extraModels' => []
];
public function __construct(array $config = [])
{
$this->setConfig($config);
$this->initialize($config);
}
public function initialize(array $config)
{
$model = $this->config('model');
$models = $this->config('extraModels');
if($models && is_array($models))
{
$models[] = $model;
}else
{
$models = [$model];
}
foreach($models as $model)
{
$this->{$model} = TableRegistry::get($model);
}
}
public function fileToEntities(File $file)
{
return [];
}
public function save(File $file)
{
$entities = $this->fileToEntities($file);
if($entities){
return $this->{$this->config('model')}->saveMany($entities);
}
return [];
}
}
Extends the Parser class
Find below an exemple to parse a csv file using league/csv:
<?
namespace App\Parser;
use League\Csv\Reader;
use Cake\Filesystem\File;
use Trois\MailParser\Parser\Parser;
class CsvToModelParser extends Parser
{
protected $_defaultConfig = [
'model' => 'ModelOne',
'extraModels' => []
];
public function fileToEntities(File $file)
{
$reader = Reader::createFromPath($file->path)->setDelimiter(';');
$headers = $reader->fetchOne();
$entities = [];
foreach($reader->setOffset(1)->fetchAssoc($headers) as $row)
{
$entities[] = $row;
}
return $this->ModelOne->newEntities($entities); // ModelOne was created for you using $_defaultConfig
}
}
As you can see in Extends the SaveMailAttachments queue task, the herited method:
$this->/*parser->*/save($file);
will return the result of
$YourModel->saveMany($entities);
3xw/cakephp-mailparser 适用场景与选型建议
3xw/cakephp-mailparser 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 43 次下载、GitHub Stars 达 0, 最近一次更新时间为 2017 年 07 月 04 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「mail」 「excel」 「xls」 「xlsx」 「csv」 「plugin」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 3xw/cakephp-mailparser 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 3xw/cakephp-mailparser 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 3xw/cakephp-mailparser 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
This Symfony bundle integrates PhpSpreadsheet into Symfony using Twig.
PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
Yii2 export extension
Courier offers a convenient and painless solution for creating emails tailored for your Kirby website.
PHP Excel Library
统计信息
- 总下载量: 43
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-07-04