Initial commit
This commit is contained in:
264
lib/Providers/Mail/MessageProperties.php
Normal file
264
lib/Providers/Mail/MessageProperties.php
Normal file
@@ -0,0 +1,264 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: Sebastian Krupinski <krupinski01@gmail.com>
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace KTXM\ProviderJmapc\Providers\Mail;
|
||||
|
||||
use KTXF\Mail\Object\MessagePropertiesMutableAbstract;
|
||||
|
||||
/**
|
||||
* Mail Message Properties Implementation
|
||||
*/
|
||||
class MessageProperties extends MessagePropertiesMutableAbstract {
|
||||
|
||||
/**
|
||||
* Convert JMAP parameters array to mail message properties object
|
||||
*
|
||||
* @param array $parameters JMAP parameters array
|
||||
*/
|
||||
public function fromJmap(array $parameters): static {
|
||||
|
||||
if (isset($parameters['messageId'])) {
|
||||
$this->data['urid'] = $parameters['messageId'][0];
|
||||
}
|
||||
if (isset($parameters['size'])) {
|
||||
$this->data['size'] = $parameters['size'];
|
||||
}
|
||||
if (isset($parameters['receivedAt'])) {
|
||||
$this->data['receivedDate'] = $parameters['receivedAt'];
|
||||
}
|
||||
if (isset($parameters['sentAt'])) {
|
||||
$this->data['date'] = $parameters['sentAt'];
|
||||
}
|
||||
if (isset($parameters['inReplyTo'])) {
|
||||
$this->data['inReplyTo'] = $parameters['inReplyTo'];
|
||||
}
|
||||
if (isset($parameters['references'])) {
|
||||
$this->data['references'] = is_array($parameters['references']) ? $parameters['references'] : [];
|
||||
}
|
||||
if (isset($parameters['subject'])) {
|
||||
$this->data['subject'] = $parameters['subject'];
|
||||
}
|
||||
if (isset($parameters['preview'])) {
|
||||
$this->data['snippet'] = $parameters['preview'];
|
||||
}
|
||||
if (isset($parameters['sender'])) {
|
||||
$this->data['sender'] = $parameters['sender'];
|
||||
}
|
||||
if (isset($parameters['from']) && is_array($parameters['from']) && !empty($parameters['from'])) {
|
||||
$this->data['from'] = [
|
||||
'address' => $parameters['from'][0]['email'] ?? '',
|
||||
'label' => $parameters['from'][0]['name'] ?? null
|
||||
];
|
||||
}
|
||||
if (isset($parameters['to']) && is_array($parameters['to'])) {
|
||||
$this->data['to'] = [];
|
||||
foreach ($parameters['to'] as $addr) {
|
||||
$this->data['to'][] = [
|
||||
'address' => $addr['email'] ?? '',
|
||||
'label' => $addr['name'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($parameters['cc']) && is_array($parameters['cc'])) {
|
||||
$this->data['cc'] = [];
|
||||
foreach ($parameters['cc'] as $addr) {
|
||||
$this->data['cc'][] = [
|
||||
'address' => $addr['email'] ?? '',
|
||||
'label' => $addr['name'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($parameters['bcc']) && is_array($parameters['bcc'])) {
|
||||
$this->data['bcc'] = [];
|
||||
foreach ($parameters['bcc'] as $addr) {
|
||||
$this->data['bcc'][] = [
|
||||
'address' => $addr['email'] ?? '',
|
||||
'label' => $addr['name'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($parameters['replyTo']) && is_array($parameters['replyTo'])) {
|
||||
$this->data['replyTo'] = [];
|
||||
foreach ($parameters['replyTo'] as $addr) {
|
||||
$this->data['replyTo'][] = [
|
||||
'address' => $addr['email'] ?? '',
|
||||
'label' => $addr['name'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($parameters['keywords']) && is_array($parameters['keywords'])) {
|
||||
$this->data['flags'] = [];
|
||||
foreach ($parameters['keywords'] as $keyword => $value) {
|
||||
$flag = match($keyword) {
|
||||
'$seen' => 'read',
|
||||
'$flagged' => 'flagged',
|
||||
'$answered' => 'answered',
|
||||
'$draft' => 'draft',
|
||||
'$deleted' => 'deleted',
|
||||
default => $keyword
|
||||
};
|
||||
$this->data['flags'][$flag] = $value;
|
||||
}
|
||||
}
|
||||
if (isset($parameters['bodyStructure'])) {
|
||||
$this->data['body'] = $parameters['bodyStructure'];
|
||||
// Recursively add content from bodyValues to matching parts
|
||||
if (isset($parameters['bodyValues']) && is_array($parameters['bodyValues'])) {
|
||||
$addContentToParts = function(&$structure, $bodyValues) use (&$addContentToParts) {
|
||||
// If this part has a partId and matching bodyValue, add content
|
||||
if (isset($structure['partId']) && isset($bodyValues[$structure['partId']])) {
|
||||
$structure['content'] = $bodyValues[$structure['partId']]['value'] ?? null;
|
||||
}
|
||||
// Recursively process subParts
|
||||
if (isset($structure['subParts']) && is_array($structure['subParts'])) {
|
||||
foreach ($structure['subParts'] as &$subPart) {
|
||||
$addContentToParts($subPart, $bodyValues);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$addContentToParts($this->data['body'], $parameters['bodyValues']);
|
||||
}
|
||||
}
|
||||
if (isset($parameters['headers']) && is_array($parameters['headers'])) {
|
||||
$this->data['headers'] = $parameters['headers'];
|
||||
}
|
||||
if (isset($parameters['attachments'])) {
|
||||
$this->data['attachments'] = $parameters['attachments'];
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert mail message properties object to JMAP parameters array
|
||||
*/
|
||||
public function toJmap(): array {
|
||||
|
||||
$parameters = [];
|
||||
|
||||
if (isset($this->data['urid'])) {
|
||||
$parameters['messageId'] = [$this->data['urid']];
|
||||
}
|
||||
if (isset($this->data['size'])) {
|
||||
$parameters['size'] = $this->data['size'];
|
||||
}
|
||||
if (isset($this->data['receivedDate'])) {
|
||||
$parameters['receivedAt'] = $this->data['receivedDate'];
|
||||
}
|
||||
if (isset($this->data['date'])) {
|
||||
$parameters['sentAt'] = $this->data['date'];
|
||||
}
|
||||
if (isset($this->data['inReplyTo'])) {
|
||||
$parameters['inReplyTo'] = $this->data['inReplyTo'];
|
||||
}
|
||||
if (isset($this->data['references'])) {
|
||||
$parameters['references'] = $this->data['references'];
|
||||
}
|
||||
if (isset($this->data['subject'])) {
|
||||
$parameters['subject'] = $this->data['subject'];
|
||||
}
|
||||
if (isset($this->data['snippet'])) {
|
||||
$parameters['preview'] = $this->data['snippet'];
|
||||
}
|
||||
if (isset($this->data['sender'])) {
|
||||
$parameters['sender'] = $this->data['sender'];
|
||||
}
|
||||
if (isset($this->data['from'])) {
|
||||
$parameters['from'] = [[
|
||||
'email' => $this->data['from']['address'] ?? '',
|
||||
'name' => $this->data['from']['label'] ?? null
|
||||
]];
|
||||
}
|
||||
if (isset($this->data['to'])) {
|
||||
$parameters['to'] = [];
|
||||
foreach ($this->data['to'] as $addr) {
|
||||
$parameters['to'][] = [
|
||||
'email' => $addr['address'] ?? '',
|
||||
'name' => $addr['label'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($this->data['cc'])) {
|
||||
$parameters['cc'] = [];
|
||||
foreach ($this->data['cc'] as $addr) {
|
||||
$parameters['cc'][] = [
|
||||
'email' => $addr['address'] ?? '',
|
||||
'name' => $addr['label'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($this->data['bcc'])) {
|
||||
$parameters['bcc'] = [];
|
||||
foreach ($this->data['bcc'] as $addr) {
|
||||
$parameters['bcc'][] = [
|
||||
'email' => $addr['address'] ?? '',
|
||||
'name' => $addr['label'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($this->data['replyTo'])) {
|
||||
$parameters['replyTo'] = [];
|
||||
foreach ($this->data['replyTo'] as $addr) {
|
||||
$parameters['replyTo'][] = [
|
||||
'email' => $addr['address'] ?? '',
|
||||
'name' => $addr['label'] ?? null
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($this->data['flags'])) {
|
||||
$parameters['keywords'] = [];
|
||||
foreach ($this->data['flags'] as $flag => $value) {
|
||||
$keyword = match($flag) {
|
||||
'read' => '$seen',
|
||||
'flagged' => '$flagged',
|
||||
'answered' => '$answered',
|
||||
'draft' => '$draft',
|
||||
'deleted' => '$deleted',
|
||||
default => $flag
|
||||
};
|
||||
$parameters['keywords'][$keyword] = $value;
|
||||
}
|
||||
}
|
||||
if (isset($this->data['bodyStructure'])) {
|
||||
$parameters['bodyStructure'] = $this->data['bodyStructure'];
|
||||
}
|
||||
if (isset($this->data['body'])) {
|
||||
$parameters['bodyValues'] = [];
|
||||
|
||||
if (isset($this->data['body']['text']['content'])) {
|
||||
$parameters['bodyValues']['0'] = [
|
||||
'value' => $this->data['body']['text']['content'],
|
||||
'isEncodingProblem' => false,
|
||||
'isTruncated' => false
|
||||
];
|
||||
}
|
||||
|
||||
if (isset($this->data['body']['html']['content'])) {
|
||||
$parameters['bodyValues']['1'] = [
|
||||
'value' => $this->data['body']['html']['content'],
|
||||
'isEncodingProblem' => false,
|
||||
'isTruncated' => false
|
||||
];
|
||||
}
|
||||
}
|
||||
if (isset($this->data['headers'])) {
|
||||
$parameters['headers'] = $this->data['headers'];
|
||||
}
|
||||
if (isset($this->data['attachments'])) {
|
||||
$parameters['attachments'] = $this->data['attachments'];
|
||||
$parameters['hasAttachment'] = !empty($this->data['attachments']);
|
||||
} else {
|
||||
$parameters['hasAttachment'] = false;
|
||||
}
|
||||
|
||||
return $parameters;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user