smart/emailreader

由 Gearman 驱动的电子邮件阅读器和分发器

0.1.2 2019-01-21 21:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:58:49 UTC


README

Build Status Latest Stable Version Total Downloads License

此库将读取特定邮箱的电子邮件,解析它们,最后将它们派发到处理器。如何安装

此库用于读取电子邮件(您可以通过实现 DriverInterface 注入自己的实现):https://github.com/tedious/Fetch

在我们的 Fetch 驱动程序内部,我们使用此库解析最后一封电子邮件回复:https://github.com/willdurand/EmailReplyParser

##它是如何工作的?

  1. 此库包含一个命令,它将检查您的邮箱中的所有新电子邮件并将其交给 gearman。1封新邮件=1个 gearman 新任务。
  2. gearman 任务将读取电子邮件,解析它,然后将它派发到您的应用程序。
  3. 一旦 gearman 完成处理这封电子邮件,电子邮件将被移动到另一个文件夹以标记为已处理。

##配置

###示例

use Smart\EmailReader\Config\EmailServerConfig;

$configs = (EmailServerConfig())
    ->setDomain('imap.gmail.com')
    ->setPort(993)
    ->setService(EmailServerConfig::IMAP)
    ->setUsername('my.email@gmail.com')
    ->setPassword('my_plain_text_password')
    ->setMainMailbox('INDEX')
    ->setProcessedMailbox('Processed');

##分发

此库附带一个分发器基类,允许您处理不同类型的电子邮件。分发器上的处理器就像电子邮件主题上的路由器。

###示例

假设我们有一个应用上的支持票务系统。我们希望客户能够直接回复电子邮件以将他们的回复添加到我们的票务系统中。

use Smart\EmailReader\Dispatcher\Dispatcher;

class DispatcherApp extends Dispatcher
{
    public function __construct()
    {
        $this->addDispatcher(new SupportEmailDispatcher());
        //you can add as many dispatchers as you want....
    }
}
use Smart\EmailReader\Dispatcher\Dispatcher;
use Smart\EmailReader\EmailEntity;

class SupportEmailDispatcher extends Dispatcher
{
    public function __construct()
    {
        $this->addHandler('#\[support\-(?<id>[0-9]+)\]#i', [$this, 'handleNewReply']);
    }
    
    public function handleNewReply($matches, EmailEntity $email)
    {
        $ticketId = isset($matches['id']) ? (int)$matches['id'] : null;
        $newReply = $email->getLastReply();
        //your logic here...
    }
}

###关于分发器

  • 分发器不会在第一个匹配项停止,不同的正则表达式可以相互重叠。
  • 如果您在分发器上返回 false,则分发器将停止并完成任务。
  • 目前,您只能根据主题分发电子邮件。

##安装

###依赖项

这应该放置在您的应用程序容器中

$emailReader = new Fetch(
    new EmailServerConfig() //check the configuration section
); 

$emailLoggerLogger = new EmailReaderLogger(
    '/log/path_to_your_log_file'
);

###Gearman 任务

我们使用 Sinergi gearman:https://github.com/sinergi/gearman

//add this in sinergi gearman :

new EmailReaderDispatchJob(
    $emailReader,
    new DispatcherApp(), //your own dispatcher
    $emailLoggerLogger
);

###注册命令

我们使用 symfony 控制台:https://github.com/symfony/Console

$consoleApp = new ConsoleApplication();
$gearmanDispatcher = '...'; //get your gearman dispatcher

$consoleApp->add(
    new EmailReaderSendCommand(
        $gearmanDispatcher,
        $emailReader
    )
);

最后,您只需在每几分钟内添加一个 cron 命令来读取传入的电子邮件并将它们派发到您的应用程序中。