generated from Nodarx/template
refactor: remove remote service
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -17,8 +17,10 @@ use KTXF\Mail\Object\AddressInterface;
|
||||
use KTXF\Mail\Service\ServiceBaseInterface;
|
||||
use KTXF\Mail\Service\ServiceCollectionMutableInterface;
|
||||
use KTXF\Mail\Service\ServiceEntityMutableInterface;
|
||||
use KTXF\Mail\Service\ServiceEntitySubmitInterface;
|
||||
use KTXF\Mail\Service\ServiceConfigurableInterface;
|
||||
use KTXF\Mail\Service\ServiceMutableInterface;
|
||||
use KTXF\Mail\Submission\EntitySubmitResult;
|
||||
use KTXF\Resource\BinaryResource;
|
||||
use KTXF\Resource\Provider\ResourceServiceIdentityInterface;
|
||||
use KTXF\Resource\Provider\ResourceServiceLocationInterface;
|
||||
@@ -35,8 +37,8 @@ use KTXF\Resource\Sort\ISort;
|
||||
use KTXF\Resource\Sort\Sort;
|
||||
use KTXM\ProviderImap\Providers\ServiceIdentityBasic;
|
||||
use KTXM\ProviderImap\Providers\ServiceLocation;
|
||||
use KTXM\ProviderImap\Mime\MessageBuilder;
|
||||
use KTXM\ProviderImap\Service\Remote\RemoteMailService;
|
||||
use KTXM\ProviderImap\Service\Remote\RemoteService;
|
||||
use KTXM\ProviderImap\Providers\CollectionResource;
|
||||
use KTXF\Mail\Collection\CollectionRoles;
|
||||
use KTXF\Mail\Object\MessagePropertiesMutableInterface;
|
||||
@@ -44,7 +46,7 @@ use KTXF\Resource\Identifier\EntityIdentifierInterface;
|
||||
use KTXM\ProviderImap\Providers\EntityResource;
|
||||
use KTXM\ProviderImap\Client\Mailbox;
|
||||
|
||||
class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceConfigurableInterface, ServiceCollectionMutableInterface, ServiceEntityMutableInterface
|
||||
class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceConfigurableInterface, ServiceCollectionMutableInterface, ServiceEntityMutableInterface, ServiceEntitySubmitInterface
|
||||
{
|
||||
private const PROVIDER_IDENTIFIER = 'imap';
|
||||
|
||||
@@ -116,8 +118,7 @@ class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceC
|
||||
private function initialize(): void
|
||||
{
|
||||
if (!isset($this->remoteService)) {
|
||||
$wrapper = RemoteService::freshClient($this);
|
||||
$this->remoteService = RemoteService::mailService($this, $wrapper);
|
||||
$this->remoteService = new RemoteMailService($this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,6 +625,79 @@ class Service implements ServiceBaseInterface, ServiceMutableInterface, ServiceC
|
||||
return new EntityResource($this->provider(), $this->identifier());
|
||||
}
|
||||
|
||||
public function entitySubmit(AddressInterface $sender, EntityIdentifierInterface|null $source = null, MessagePropertiesMutableInterface|null $message = null): EntitySubmitResult
|
||||
{
|
||||
if ($message === null) {
|
||||
return new EntitySubmitResult(
|
||||
EntitySubmitResult::DISPOSITION_ERROR,
|
||||
errorCode: 'invalid_message',
|
||||
errorMessage: 'No message properties were provided for submission.',
|
||||
);
|
||||
}
|
||||
|
||||
// Outbound submission via SMTP — independent of the IMAP connection.
|
||||
try {
|
||||
$raw = (new MessageBuilder())->build($message);
|
||||
$recipients = MessageBuilder::recipients($message);
|
||||
if ($recipients === []) {
|
||||
throw new \RuntimeException('Message has no recipients.');
|
||||
}
|
||||
|
||||
$this->initialize();
|
||||
$smtp = $this->remoteService->submitClient();
|
||||
try {
|
||||
$queueId = $smtp->send(trim($sender->getAddress()), $recipients, $raw);
|
||||
} finally {
|
||||
$smtp->quit();
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
return new EntitySubmitResult(
|
||||
EntitySubmitResult::DISPOSITION_ERROR,
|
||||
errorCode: 'submission_failed',
|
||||
errorMessage: $e->getMessage(),
|
||||
);
|
||||
}
|
||||
|
||||
// Best-effort: store a copy in the Sent collection. A failure here must
|
||||
// not turn a successful delivery into an error.
|
||||
$sentEntity = null;
|
||||
try {
|
||||
$this->initialize();
|
||||
$sentCollection = $this->resolveSentCollection();
|
||||
if ($sentCollection !== null) {
|
||||
$uid = $this->remoteService->entityCreate($sentCollection, $raw, ['\\Seen']);
|
||||
if ($uid !== null && $uid > 0) {
|
||||
$sentEntity = new EntityIdentifier($this->provider(), $this->identifier(), $sentCollection, (string) $uid);
|
||||
}
|
||||
}
|
||||
} catch (\Throwable) {
|
||||
// ignore — the message was already delivered
|
||||
}
|
||||
|
||||
return new EntitySubmitResult(
|
||||
disposition: EntitySubmitResult::DISPOSITION_SENT,
|
||||
transportId: $queueId !== '' ? $queueId : null,
|
||||
sentEntity: $sentEntity,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the native name of the collection flagged with the Sent role.
|
||||
*/
|
||||
private function resolveSentCollection(): ?string
|
||||
{
|
||||
$filter = $this->collectionListFilter();
|
||||
$filter->condition('role', CollectionRoles::Sent->value);
|
||||
|
||||
/** @var Mailbox[] $mailboxes */
|
||||
$mailboxes = iterator_to_array($this->remoteService->collectionList(null, $filter, null));
|
||||
if ($mailboxes === []) {
|
||||
return null;
|
||||
}
|
||||
$mailbox = reset($mailboxes);
|
||||
return $mailbox === false ? null : $mailbox->name();
|
||||
}
|
||||
|
||||
public function entityCreate(CollectionIdentifier $target, MessagePropertiesMutableInterface $properties, array $options = []): EntityResource
|
||||
{
|
||||
throw new \RuntimeException('Entity creation is not supported in this service');
|
||||
|
||||
Reference in New Issue
Block a user