Files
provider_imap/lib/Service/Remote/RemoteService.php
Sebastian Krupinski e51c65bf19 feat: initial version
Signed-off-by: Sebastian Krupinski <root@LAPTOP-7DVOR6NC>
2026-02-20 21:44:49 +00:00

64 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace KTXM\ProviderImapMail\Service\Remote;
use Gricob\IMAP\Client;
use KTXC\Logger\PlainFileLogger;
use KTXM\ProviderImapMail\Providers\Service;
/**
* Static factory for IMAP remote service objects.
*
* - freshClient() → builds a imap client from service config
* - mailService() → constructs a RemoteMailService from the wrapper
*/
class RemoteService
{
/**
* Build a fully-configured imap client from a Service's location and identity.
*
* Handles STARTTLS: connects on plain TCP, sends STARTTLS, upgrades to TLS,
* then authenticates — all before returning the wrapper.
*/
public static function freshClient(Service $service, string $logDir): ImapClientWrapper
{
$location = $service->getLocation();
$identity = $service->getIdentity();
// Build a file logger when debug mode is enabled, otherwise pass null
$logger = null;
if ($service->getDebug()) {
$logger = new PlainFileLogger($logDir . '/imap', $service->identifier());
}
$client = Client::create($location->toConfiguration(), $logger);
$client->connect();
if ($location->getEncryption() === 'starttls') {
$client->startTls();
}
$client->logIn($identity->getIdentity(), $identity->getSecret());
return new ImapClientWrapper($client);
}
/**
* Build a RemoteMailService from a Service and a pre-authenticated wrapper.
*
* The provider identifier and service ID are taken directly from the Service
* object so the caller does not have to repeat them.
*/
public static function mailService(Service $service, ImapClientWrapper $wrapper): RemoteMailService
{
return new RemoteMailService($wrapper, $service->provider(), $service->identifier());
}
}