我想获取收件箱中的所有电子邮件并实时存储它们,但我这样做的方式有点错误:它是这样的:
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
。