setMailboxes($mailboxService); $this->setMessageRepository($messageRepository); $this->setAttachmentsFolder($attachments_folder); } protected Message $messageRepository; protected Mailboxes $mailboxService; protected string $attachments_folder; public function getMailboxes(): Mailboxes { return $this->mailboxService; } public function getMessageRepository(): Message { return $this->messageRepository; } public function getAttachmentsFolder(): string { return $this->attachments_folder; } public function setMailboxes(Mailboxes $mailboxService): Emails { $this->mailboxService = $mailboxService; return $this; } public function setMessageRepository(Message $messageRepository): Emails { $this->messageRepository = $messageRepository; return $this; } public function setAttachmentsFolder(string $folder): Emails { $this->attachments_folder = $folder; return $this; } //---------------------------------------------------------------- // Messages public function getMessages(MailboxInterface $mailbox, int $start = 0, ?int $amount = null): array { $output = []; $cnt = 0; $messages = $this->getMessageRepository()->fetchByMailboxAndPosition($mailbox->getName(), $start, $amount ?? 1); if ($messages) { foreach ($messages as $message) { $output []= $message; $cnt ++; } } if ($amount === null or $cnt < $amount) { $messages = $this->getMailboxes()->getMessages($mailbox, $cnt + $start, $amount ?? $mailbox->count()); foreach ($messages as $m) { $message = $this->saveMessage($mailbox, $m, $cnt + $start); $cnt ++; if ($message === null) { continue; } $output []= $message; } } return $output; } public function saveMessage(MailboxInterface $mailbox, MessageInterface $message, int $position): ?\ProVM\Emails\Model\Message { $data = [ 'mailbox_id' => $mailbox->getId(), 'position' => $position, 'uid' => $message->getNumber(), 'subject' => $message->getSubject(), 'from' => $message->getFrom()->getFullAddress(), 'date_time' => $message->getDate()->format('Y-m-d H:i:s'), ]; return $this->getMessageRepository()->create($data); } public function getValidMessages(MailboxInterface $mailbox, int $start = 0, ?int $amount = null): array { $messages = $this->getMessages($mailbox, $start, $amount); $output = array_filter($messages, function(\ProVM\Emails\Model\Message $message) { return ($message->hasAttachments() and $message->hasValidAttachments()); }); if ($amount === null or count($output) >= $amount) { return $output; } $cnt = $start + $amount; while (count($output) < $amount) { \Safe\ini_set('max_execution_time', ((int) \Safe\ini_get('max_execution_time')) + $amount * 5); $messages = $this->getMailboxes()->getMessages($mailbox, $start + $amount, $amount); foreach ($messages as $m) { $message = $this->saveMessage($mailbox, $m, $cnt + $start); $cnt ++; if ($message === null) { continue; } if ($message->hasAttachments() and $message->hasValidAttachments() and count($output) < $amount) { $output []= $message; } } } return $output; } // Attachments public function saveAttachments(MessageInterface $message, ?string $extension = null): array { if (!$message->hasAttachments()) { return []; } $attachments = []; foreach ($message->getAttachments() as $attachment) { $this->getLogger()->debug($attachment->getFilename()); if ($extension !== null) { $extension = trim($extension, '.'); if (!str_contains($attachment->getFilename(), ".{$extension}")) { continue; } } $filename = implode(DIRECTORY_SEPARATOR, [ $this->getAttachmentsFolder(), "{$message->getSubject()} - {$message->getDate()->format('Y-m-d')} - {$attachment->getFilename()}" ]); $this->getLogger()->debug($filename); \Safe\file_put_contents($filename, $attachment->getDecodedContent()); $attachments []= $filename; } return $attachments; } public function getAttachments(?string $mailbox = null, int $start = 0, ?int $amount = null, ?string $extension = null): array { if ($mailbox === null) { $mailbox = '/'; } $mb = $this->getMailboxes()->get($mailbox); $messages = $this->getMessages($mb, $start, $amount); $attachments = []; foreach ($messages as $message) { $attachments = array_merge($attachments, $this->saveAttachments($message, $extension)); } return $attachments; } }