在laravel中捕获PHP-IMAP中的新电子邮件事件



我想获取收件箱中的所有电子邮件并实时存储它们,但我这样做的方式有点错误:它是这样的:

class Kernel extends ConsoleKernel
...

$schedule->call(function () {
// connect using credentials
//get all emails
//copy emails
//delete emails when they get copied correctly

})->everyMinute(); // repeat

这保证数据库中的电子邮件不会被复制,因为这些电子邮件已不在收件箱中。但现在我们有一个需要保留这些消息的情况,所以我们用代替了它


// connect using credentials
//get all emails 
//filter only unseen
//copy emails
//mark these emails as seen

但所有这些解决方案的问题是我们会收到电子邮件。我们所做的解决方案是有效的,但又增加了一个反复重新加载相同电子邮件的问题。

我重读了文档,发现可能的解决方案:使用在整个包中触发的事件并捕获new事件,当收到新电子邮件时,开关会被触发。在这个例子中,我发现了一些有用的方法和类

class CustomMessageNewEvent extends WebklexPHPIMAPEventsMessageNewEvent {
/**
* Create a new event instance.
* @var WebklexPHPIMAPMessage[] $messages
* @return void
*/
public function __construct($messages) {
$this->message = $messages[0];
echo "New message: ".$this->message->subject."n";
}
}

但我不知道如何在Laravel中实现它们,只知道我应该在哪里以及如何注册/捕获这个"新"事件!
**特别是我们有多个客户端实例,而不是只有一个(foreach user…(**
非常感谢您阅读本文,希望人们能发现这个问题很有用

当我过去做过类似的任务时,我会使用电子邮件规范中定义的消息ID来唯一地识别每封电子邮件。

您可以使用IMAP库获取带有Message-ID的电子邮件列表,然后将这些Message-ID与您的数据库进行比较。只需确保在您的电子邮件模型中添加一个新字段(或您所称的任何字段(来存储Message-ID

最新更新