mirror of
https://github.com/itflow-org/itflow
synced 2026-08-05 15:17:17 +00:00
77 lines
2.0 KiB
PHP
77 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace DirectoryTree\ImapEngine;
|
|
|
|
use DirectoryTree\ImapEngine\Exceptions\RuntimeException;
|
|
use ZBateson\MailMimeParser\Header\IHeader;
|
|
use ZBateson\MailMimeParser\Header\IHeaderPart;
|
|
use ZBateson\MailMimeParser\Header\Part\AddressPart;
|
|
use ZBateson\MailMimeParser\Header\Part\ContainerPart;
|
|
use ZBateson\MailMimeParser\Header\Part\NameValuePart;
|
|
use ZBateson\MailMimeParser\IMessage;
|
|
|
|
trait HasParsedMessage
|
|
{
|
|
/**
|
|
* The parsed message.
|
|
*/
|
|
protected ?IMessage $message = null;
|
|
|
|
/**
|
|
* Get all headers from the message.
|
|
*/
|
|
public function headers(): array
|
|
{
|
|
return $this->parse()->getAllHeaders();
|
|
}
|
|
|
|
/**
|
|
* Get a header from the message.
|
|
*/
|
|
public function header(string $name, int $offset = 0): ?IHeader
|
|
{
|
|
return $this->parse()->getHeader($name, $offset);
|
|
}
|
|
|
|
/**
|
|
* Get addresses from the given header.
|
|
*
|
|
* @return Address[]
|
|
*/
|
|
public function addresses(string $header): array
|
|
{
|
|
$parts = $this->header($header)?->getParts() ?? [];
|
|
|
|
$addresses = array_map(fn (IHeaderPart $part) => match (true) {
|
|
$part instanceof AddressPart => new Address($part->getEmail(), $part->getName()),
|
|
$part instanceof NameValuePart => new Address($part->getName(), $part->getValue()),
|
|
$part instanceof ContainerPart => new Address($part->getValue(), ''),
|
|
default => null,
|
|
}, $parts);
|
|
|
|
return array_filter($addresses);
|
|
}
|
|
|
|
/**
|
|
* Parse the message into a MailMimeMessage instance.
|
|
*/
|
|
public function parse(): IMessage
|
|
{
|
|
if ($this->isEmpty()) {
|
|
throw new RuntimeException('Cannot parse an empty message');
|
|
}
|
|
|
|
return $this->message ??= MessageParser::parse((string) $this);
|
|
}
|
|
|
|
/**
|
|
* Determine if the message is empty.
|
|
*/
|
|
abstract public function isEmpty(): bool;
|
|
|
|
/**
|
|
* Get the string representation of the message.
|
|
*/
|
|
abstract public function __toString(): string;
|
|
}
|