Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-09-04 18:05:19 +0300
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-09-05 14:45:50 +0300
commitd18ef16578dc34ffd67e48bc5c61654e55461ce9 (patch)
tree0fb85d03cba26c56be550b2cba5072dd6aca4e91 /lib/Account.php
parenteec81c6c38259c0edc843018581a1f1bd1ab280a (diff)
Move message sending and draft saving code
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'lib/Account.php')
-rw-r--r--lib/Account.php334
1 files changed, 0 insertions, 334 deletions
diff --git a/lib/Account.php b/lib/Account.php
index 78421c0d2..a27c44bff 100644
--- a/lib/Account.php
+++ b/lib/Account.php
@@ -176,96 +176,6 @@ class Account implements JsonSerializable {
}
/**
- * Send a new message or reply to an existing message
- *
- * @param IMessage $message
- * @param Horde_Mail_Transport $transport
- * @param int|null $draftUID
- * @return int message UID
- */
- public function sendMessage(IMessage $message, Horde_Mail_Transport $transport, $draftUID) {
- // build mime body
- $headers = [
- 'From' => $message->getFrom()->first()->toHorde(),
- 'To' => $message->getTo()->toHorde(),
- 'Cc' => $message->getCC()->toHorde(),
- 'Bcc' => $message->getBCC()->toHorde(),
- 'Subject' => $message->getSubject(),
- ];
-
- if (!is_null($message->getRepliedMessage())) {
- $headers['In-Reply-To'] = $message->getRepliedMessage()->getMessageId();
- }
-
- $mail = new Horde_Mime_Mail();
- $mail->addHeaders($headers);
- $mail->setBody($message->getContent());
-
- // Append cloud attachments
- foreach ($message->getCloudAttachments() as $attachment) {
- $mail->addMimePart($attachment);
- }
- // Append local attachments
- foreach ($message->getLocalAttachments() as $attachment) {
- $mail->addMimePart($attachment);
- }
-
- // Send the message
- $mail->send($transport, false, false);
-
- // Save the message in the sent folder
- $sentFolder = $this->getSentFolder();
- $raw = stream_get_contents($mail->getRaw());
- $uid = $sentFolder->saveMessage($raw, [
- Horde_Imap_Client::FLAG_SEEN
- ]);
-
- // Delete draft if one exists
- if (!is_null($draftUID)) {
- $this->deleteDraft($draftUID);
- }
-
- return $uid;
- }
-
- /**
- * @param IMessage $message
- * @param int|null $previousUID
- * @return int
- */
- public function saveDraft(IMessage $message, $previousUID) {
- // build mime body
- $headers = [
- 'From' => $message->getFrom()->first()->toHorde(),
- 'To' => $message->getTo()->toHorde(),
- 'Cc' => $message->getCC()->toHorde(),
- 'Bcc' => $message->getBCC()->toHorde(),
- 'Subject' => $message->getSubject(),
- 'Date' => Horde_Mime_Headers_Date::create(),
- ];
-
- $mail = new Horde_Mime_Mail();
- $mail->addHeaders($headers);
- $mail->setBody($message->getContent());
- $mail->addHeaderOb(Horde_Mime_Headers_MessageId::create());
-
- // "Send" the message
- $transport = new Horde_Mail_Transport_Null();
- $mail->send($transport, false, false);
- // save the message in the drafts folder
- $draftsFolder = $this->getDraftsFolder();
- $raw = stream_get_contents($mail->getRaw());
- $newUid = $draftsFolder->saveDraft($raw);
-
- // delete old version if one exists
- if (!is_null($previousUID)) {
- $this->deleteDraft($previousUID);
- }
-
- return $newUid;
- }
-
- /**
* @param string $mailBox
*/
public function deleteMailbox($mailBox) {
@@ -328,21 +238,6 @@ class Account implements JsonSerializable {
}
/**
- * Get a list of all mailboxes in this account
- *
- * @return Mailbox[]
- */
- public function getMailboxes() {
- if ($this->mailboxes === null) {
- $this->mailboxes = $this->listMailboxes();
- $this->sortMailboxes();
- $this->localizeSpecialMailboxes();
- }
-
- return $this->mailboxes;
- }
-
- /**
* @return array
*/
public function jsonSerialize() {
@@ -350,231 +245,6 @@ class Account implements JsonSerializable {
}
/**
- * Lists special use folders for this account.
- *
- * The special uses returned are the "best" one for each special role,
- * picked amongst the ones returned by the server, as well
- * as the one guessed by our code.
- *
- * @param bool $base64_encode
- * @return array In the form [<special use>=><folder id>, ...]
- */
- public function getSpecialFoldersIds($base64_encode=true) {
- $folderRoles = ['inbox', 'sent', 'drafts', 'trash', 'archive', 'junk', 'flagged', 'all'];
- $specialFoldersIds = [];
-
- foreach ($folderRoles as $role) {
- $folders = $this->getSpecialFolder($role, true);
- $specialFoldersIds[$role] = (count($folders) === 0) ? null : $folders[0]->getFolderId();
- if ($specialFoldersIds[$role] !== null && $base64_encode === true) {
- $specialFoldersIds[$role] = base64_encode($specialFoldersIds[$role]);
- }
- }
- return $specialFoldersIds;
- }
-
- /**
- * Get the "drafts" mailbox
- *
- * @return Mailbox The best candidate for the "drafts" inbox
- */
- public function getDraftsFolder() {
- // check for existence
- $draftsFolder = $this->getSpecialFolder('drafts', true);
- if (count($draftsFolder) === 0) {
- // drafts folder does not exist - let's create one
- // TODO: also search for translated drafts mailboxes
- $this->createMailbox('Drafts', [
- 'special_use' => ['drafts'],
- ]);
- return $this->guessBestMailBox($this->listMailboxes('Drafts'));
- }
- return $draftsFolder[0];
- }
-
- /**
- * @return Mailbox|null
- */
- public function getInbox() {
- $folders = $this->getSpecialFolder('inbox', false);
- return count($folders) > 0 ? $folders[0] : null;
- }
-
- /**
- * Get the "sent mail" mailbox
- *
- * @return Mailbox The best candidate for the "sent mail" inbox
- */
- public function getSentFolder() {
- //check for existence
- $sentFolders = $this->getSpecialFolder('sent', true);
- if (count($sentFolders) === 0) {
- //sent folder does not exist - let's create one
- //TODO: also search for translated sent mailboxes
- $this->createMailbox('Sent', [
- 'special_use' => ['sent'],
- ]);
- return $this->guessBestMailBox($this->listMailboxes('Sent'));
- }
- return $sentFolders[0];
- }
-
- /**
- * @param int $messageId
- */
- private function deleteDraft($messageId) {
- $draftsFolder = $this->getDraftsFolder();
- $draftsFolder->setMessageFlag($messageId, Horde_Imap_Client::FLAG_DELETED, true);
-
- $draftsMailBox = new Horde_Imap_Client_Mailbox($draftsFolder->getFolderId(), false);
- $this->getImapConnection()->expunge($draftsMailBox);
- }
-
- /**
- * Get 'best' mailbox guess
- *
- * For now the best candidate is the one with
- * the most messages in it.
- *
- * @param array $folders
- * @return Mailbox
- */
- protected function guessBestMailBox(array $folders) {
- $maxMessages = -1;
- $bestGuess = null;
- foreach ($folders as $folder) {
- /** @var Mailbox $folder */
- if ($folder->getTotalMessages() > $maxMessages) {
- $maxMessages = $folder->getTotalMessages();
- $bestGuess = $folder;
- }
- }
- return $bestGuess;
- }
-
- /**
- * Get mailbox(es) that have the given special use role
- *
- * With this method we can get a list of all mailboxes that have been
- * determined to have a specific special use role. It can also return
- * the best candidate for this role, for situations where we want
- * one single folder.
- *
- * @param string $role Special role of the folder we want to get ('sent', 'inbox', etc.)
- * @param bool $guessBest If set to true, return only the folder with the most messages in it
- *
- * @return Mailbox[] if $guessBest is false, or Mailbox if $guessBest is true. Empty [] if no match.
- */
- protected function getSpecialFolder($role, $guessBest=true) {
-
- $specialFolders = [];
- foreach ($this->getMailboxes() as $mailbox) {
- if ($role === $mailbox->getSpecialRole()) {
- $specialFolders[] = $mailbox;
- }
- }
-
- if ($guessBest === true && count($specialFolders) > 1) {
- return [$this->guessBestMailBox($specialFolders)];
- } else {
- return $specialFolders;
- }
- }
-
- /**
- * Localizes the name of the special use folders
- *
- * The display name of the best candidate folder for each special use
- * is localized to the user's language
- */
- protected function localizeSpecialMailboxes() {
-
- $l = OC::$server->getL10N('mail');
- $map = [
- // TRANSLATORS: translated mail box name
- 'inbox' => $l->t('Inbox'),
- // TRANSLATORS: translated mail box name
- 'sent' => $l->t('Sent'),
- // TRANSLATORS: translated mail box name
- 'drafts' => $l->t('Drafts'),
- // TRANSLATORS: translated mail box name
- 'archive' => $l->t('Archive'),
- // TRANSLATORS: translated mail box name
- 'trash' => $l->t('Trash'),
- // TRANSLATORS: translated mail box name
- 'junk' => $l->t('Junk'),
- // TRANSLATORS: translated mail box name
- 'all' => $l->t('All'),
- // TRANSLATORS: translated mail box name
- 'flagged' => $l->t('Favorites'),
- ];
- $mailboxes = $this->getMailboxes();
- $specialIds = $this->getSpecialFoldersIds(false);
- foreach ($mailboxes as $i => $mailbox) {
- if (in_array($mailbox->getFolderId(), $specialIds) === true) {
- if (isset($map[$mailbox->getSpecialRole()])) {
- $translatedDisplayName = $map[$mailbox->getSpecialRole()];
- $mailboxes[$i]->setDisplayName((string)$translatedDisplayName);
- }
- }
- }
- }
-
- /**
- * Sort mailboxes
- *
- * Sort the array of mailboxes with
- * - special use folders coming first in this order: all, inbox, flagged, drafts, sent, archive, junk, trash
- * - 'normal' folders coming after that, sorted alphabetically
- */
- protected function sortMailboxes() {
-
- $mailboxes = $this->getMailboxes();
- usort($mailboxes, function($a, $b) {
- /**
- * @var Mailbox $a
- * @var Mailbox $b
- */
- $roleA = $a->getSpecialRole();
- $roleB = $b->getSpecialRole();
- $specialRolesOrder = [
- 'all' => 0,
- 'inbox' => 1,
- 'flagged' => 2,
- 'drafts' => 3,
- 'sent' => 4,
- 'archive' => 5,
- 'junk' => 6,
- 'trash' => 7,
- ];
- // if there is a flag unknown to us, we ignore it for sorting :
- // the folder will be sorted by name like any other 'normal' folder
- if (array_key_exists($roleA, $specialRolesOrder) === false) {
- $roleA = null;
- }
- if (array_key_exists($roleB, $specialRolesOrder) === false) {
- $roleB = null;
- }
-
- if ($roleA === null && $roleB !== null) {
- return 1;
- } elseif ($roleA !== null && $roleB === null) {
- return -1;
- } elseif ($roleA !== null && $roleB !== null) {
- if ($roleA === $roleB) {
- return strcasecmp($a->getdisplayName(), $b->getDisplayName());
- } else {
- return $specialRolesOrder[$roleA] - $specialRolesOrder[$roleB];
- }
- }
- // we get here if $roleA === null && $roleB === null
- return strcasecmp($a->getDisplayName(), $b->getDisplayName());
- });
-
- $this->mailboxes = $mailboxes;
- }
-
- /**
* Convert special security mode values into Horde parameters
*
* @param string $sslMode
@@ -623,8 +293,4 @@ class Account implements JsonSerializable {
return new ReplyMessage();
}
- public function getLastMailboxSync(): int {
- return (int) $this->account->getLastMailboxSync();
- }
-
}