158 lines
5.6 KiB
PHP
158 lines
5.6 KiB
PHP
<?php
|
|
namespace ProVM\Common\Service;
|
|
|
|
use Iterator;
|
|
use Generator;
|
|
use ProVM\Common\Exception\EmptyMailbox;
|
|
use Ddeboer\Imap\MailboxInterface;
|
|
use Ddeboer\Imap\MessageInterface;
|
|
use ProVM\Emails\Repository\Message;
|
|
|
|
class Emails extends Base
|
|
{
|
|
public function __construct(Mailboxes $mailboxService, Message $messageRepository, string $attachments_folder)
|
|
{
|
|
$this->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;
|
|
}
|
|
} |