diff --git a/lib/Client/Message.php b/lib/Client/Message.php index 9bf362c..9fbb58e 100644 --- a/lib/Client/Message.php +++ b/lib/Client/Message.php @@ -15,6 +15,7 @@ final class Message * @param list $cc * @param list $bcc * @param array $bodySections + * @param list $references message ids from the References header, without angle brackets */ public function __construct( private readonly int $sequence, @@ -35,6 +36,7 @@ final class Message private readonly array $bcc, private readonly ?MessagePart $bodyStructure, private readonly array $bodySections, + private readonly array $references = [], ) {} public function sequence(): int @@ -90,6 +92,14 @@ final class Message return $this->inReplyTo; } + /** + * @return list + */ + public function references(): array + { + return $this->references; + } + /** * @return list */ @@ -185,6 +195,7 @@ final class Message $this->bcc, $bodyStructure, $bodySections, + $this->references, ); } } \ No newline at end of file diff --git a/lib/Client/Protocol/Parser/FetchMessageParser.php b/lib/Client/Protocol/Parser/FetchMessageParser.php index 91cb858..76c09df 100644 --- a/lib/Client/Protocol/Parser/FetchMessageParser.php +++ b/lib/Client/Protocol/Parser/FetchMessageParser.php @@ -46,7 +46,7 @@ final class FetchMessageParser self::decodeMimeHeader(self::envelopeString($envelope, 1)), self::envelopeString($envelope, 0), self::trimAngles(self::envelopeString($envelope, 9)), - self::envelopeString($envelope, 8), + self::trimAngles(self::envelopeString($envelope, 8)), self::parseAddressList($envelope[2] ?? null), self::parseAddressList($envelope[3] ?? null), self::parseAddressList($envelope[4] ?? null), @@ -55,6 +55,7 @@ final class FetchMessageParser self::parseAddressList($envelope[7] ?? null), $bodyStructure, $bodySections, + self::extractReferences($headers), ); } @@ -351,6 +352,24 @@ final class FetchMessageParser return $parsed; } + /** + * Extract the message ids listed in the References header, without angle brackets. + * + * @param array> $headers + * @return list + */ + private static function extractReferences(array $headers): array + { + $references = []; + foreach ($headers['references'] ?? [] as $value) { + if (preg_match_all('/<([^<>\s]+)>/', $value, $matches) > 0) { + array_push($references, ...$matches[1]); + } + } + + return array_values(array_unique($references)); + } + /** * @param array> $headers */