diff --git a/lib/Contracts/IMailManager.php b/lib/Contracts/IMailManager.php index 134871189d..b4e27b41a9 100644 --- a/lib/Contracts/IMailManager.php +++ b/lib/Contracts/IMailManager.php @@ -45,12 +45,13 @@ public function getMailboxes(Account $account): array; /** * @param Account $account * @param string $name + * @param string[] $specialUse * * @return Mailbox * * @throws ServiceException */ - public function createMailbox(Account $account, string $name): Mailbox; + public function createMailbox(Account $account, string $name, array $specialUse = []): Mailbox; /** * @param Mailbox $mailbox diff --git a/lib/IMAP/FolderMapper.php b/lib/IMAP/FolderMapper.php index fae9090418..9a81618158 100644 --- a/lib/IMAP/FolderMapper.php +++ b/lib/IMAP/FolderMapper.php @@ -71,9 +71,10 @@ public function getFolders(Account $account, Horde_Imap_Client_Socket $client, ), $toPersist); } - public function createFolder(Horde_Imap_Client_Socket $client, - string $name): Folder { - $client->createMailbox($name); + public function createFolder(Horde_Imap_Client_Socket $client, string $name, array $specialUse = []): Folder { + $client->createMailbox($name, [ + 'special_use' => $specialUse, + ]); $list = $client->listMailboxes($name, Horde_Imap_Client::MBOX_ALL_SUBSCRIBED, [ 'delimiter' => true, diff --git a/lib/Service/MailManager.php b/lib/Service/MailManager.php index f4ce9dcf43..9647c0ad7b 100644 --- a/lib/Service/MailManager.php +++ b/lib/Service/MailManager.php @@ -141,18 +141,11 @@ public function getMailboxes(Account $account): array { return $this->mailboxMapper->findAll($account); } - /** - * @param Account $account - * @param string $name - * - * @return Mailbox - * @throws ServiceException - */ #[\Override] - public function createMailbox(Account $account, string $name): Mailbox { + public function createMailbox(Account $account, string $name, array $specialUse = []): Mailbox { $client = $this->imapClientFactory->getClient($account); try { - $folder = $this->folderMapper->createFolder($client, $name); + $folder = $this->folderMapper->createFolder($client, $name, $specialUse); $this->folderMapper->fetchFolderAcls([$folder], $client); } catch (Horde_Imap_Client_Exception $e) { throw new ServiceException( diff --git a/lib/Service/MailTransmission.php b/lib/Service/MailTransmission.php index c914bcb85b..d6154bb78c 100644 --- a/lib/Service/MailTransmission.php +++ b/lib/Service/MailTransmission.php @@ -28,6 +28,7 @@ use OCA\Mail\Account; use OCA\Mail\Address; use OCA\Mail\AddressList; +use OCA\Mail\Contracts\IMailManager; use OCA\Mail\Contracts\IMailTransmission; use OCA\Mail\Db\LocalMessage; use OCA\Mail\Db\Mailbox; @@ -67,6 +68,7 @@ public function __construct( private PerformanceLogger $performanceLogger, private AliasesService $aliasesService, private TransmissionService $transmissionService, + private IMailManager $mailManager, ) { } @@ -231,12 +233,7 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void { $transport = new Horde_Mail_Transport_Null(); $mail->send($transport, false, false); $perfLogger->step('create IMAP draft message'); - // save the message in the drafts folder - $draftsMailboxId = $account->getMailAccount()->getDraftsMailboxId(); - if ($draftsMailboxId === null) { - throw new ClientException('No drafts mailbox configured'); - } - $draftsMailbox = $this->mailboxMapper->findById($draftsMailboxId); + $draftsMailbox = $this->findOrCreateDraftsMailbox($account); $this->messageMapper->save( $client, $draftsMailbox, @@ -258,6 +255,20 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void { $perfLogger->end(); } + private function findOrCreateDraftsMailbox(Account $account): Mailbox { + $draftsMailboxId = $account->getMailAccount()->getDraftsMailboxId(); + + if ($draftsMailboxId === null) { + return $this->mailManager->createMailbox( + $account, + 'Drafts', + [Horde_Imap_Client::SPECIALUSE_DRAFTS] + ); + } + + return $this->mailboxMapper->findById($draftsMailboxId); + } + /** * @param NewMessageData $message * @param Message|null $previousDraft