insertBulk()). * * @param Message[] $messages * @param Mailbox $mailbox * @param Account $account * @param Tag $importantTag * @return void */ public function classifyNewMessages( array $messages, Mailbox $mailbox, Account $account, Tag $importantTag, ): void { if (!$this->classificationSettingsService->isClassificationEnabled($account->getUserId())) { return; } foreach (self::EXEMPT_FROM_CLASSIFICATION as $specialUse) { if ($mailbox->isSpecialUse($specialUse)) { // Nothing to do then return; } } // if this is a message that's been flagged / tagged as important before, we don't want to reclassify it again. $doNotReclassify = $this->tagMapper->getTaggedMessageIdsForMessages( $messages, $account->getUserId(), Tag::LABEL_IMPORTANT ); $messages = array_filter($messages, static fn ($message) => $message->getFlagImportant() === false || in_array($message->getMessageId(), $doNotReclassify, true)); try { $predictions = $this->classifier->classifyImportance( $account, $messages, $this->logger ); foreach ($messages as $message) { $prediction = $predictions[$message->getUid()] ?? false; $this->logger->info("Message {$message->getUid()} ({$message->getPreviewText()}) is " . ($prediction ? 'important' : 'not important')); if ($prediction) { $message->setFlagImportant(true); $this->mailManager->flagMessage($account, $mailbox->getName(), $message->getUid(), Tag::LABEL_IMPORTANT, true); $this->mailManager->tagMessage($account, $mailbox->getName(), $message, $importantTag, true); } } } catch (ServiceException $e) { $this->logger->error('Could not classify incoming message importance: ' . $e->getMessage(), [ 'exception' => $e, ]); } catch (ClientException $e) { $this->logger->error('Could not persist incoming message importance to IMAP: ' . $e->getMessage(), [ 'exception' => $e, ]); } } }