Files
itflow/plugins/vendor/directorytree/imapengine/src/FileMessage.php
johnnyq 2204bd52f4 Rewrite email parser using ImapEngine, harden processing loop
Replace webklex/php-imap with directorytree/imapengine in the ticket
email parser. ImapEngine is pure PHP over sockets.

Parser improvements:
- Wrap per-message processing in try/catch so one malformed email
  can't abort the run; failures are flagged and logged with UID
- Query unseen + unflagged so previously-failed (flagged) messages
  are no longer re-processed on every cron run
- Skip vacation/auto-responder emails (RFC 3834) to prevent mail
  loops with the ticket auto-reply
- Cap messages per run (50) and attachment size (15MB); inline
  images over 2MB are stored as attachments instead of base64-embedded
  in ticket details
- Atomic lock file creation
- preg_quote() the ticket prefix in subject matching
- Dedupe CC watchers and exclude the sender
- Map webklex 'tls' encryption setting to STARTTLS for compatibility

NDR/DSN parsing now walks MIME parts via the underlying
zbateson parser instead of relying on attachment extraction.
2026-06-12 16:56:39 -04:00

100 lines
1.9 KiB
PHP

<?php
namespace DirectoryTree\ImapEngine;
use BackedEnum;
use BadMethodCallException;
class FileMessage implements MessageInterface
{
use HasFlags, HasMessageAccessors, HasParsedMessage;
/**
* Constructor.
*/
public function __construct(
protected string $contents
) {}
/**
* {@inheritDoc}
*/
public function uid(): int
{
throw new BadMethodCallException('FileMessage does not support a UID');
}
/**
* {@inheritDoc}
*/
public function size(): ?int
{
return strlen($this->contents);
}
/**
* {@inheritDoc}
*/
public function flag(BackedEnum|string $flag, string $operation, bool $expunge = false): void
{
throw new BadMethodCallException('FileMessage does not support flagging');
}
/**
* Get the string representation of the message.
*/
public function __toString(): string
{
return $this->contents;
}
/**
* Determine if this message is equal to another.
*/
public function is(MessageInterface $message): bool
{
return $message instanceof self
&& $this->contents === $message->contents;
}
/**
* Get the message flags.
*/
public function flags(): array
{
return [];
}
/**
* {@inheritDoc}
*/
public function bodyStructure(): ?BodyStructureCollection
{
return null;
}
/**
* {@inheritDoc}
*/
public function hasBodyStructure(): bool
{
return false;
}
/**
* {@inheritDoc}
*/
public function bodyPart(string $partNumber, bool $peek = true): ?string
{
throw new BadMethodCallException('FileMessage does not support fetching body parts');
}
/**
* Determine if the message is empty.
*/
public function isEmpty(): bool
{
return empty($this->contents);
}
}