From 1625e722a202b9224ce079e8066598b445d7b40a Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 13 Oct 2022 14:07:04 +0200 Subject: [PATCH] Added option to save email in Nextcloud for #96 and @Mer0me https://help.nextcloud.com/t/best-way-to-archive-mails-into-nextcloud-folders/144252 --- plugins/nextcloud/index.php | 40 ++++++++++++-- .../js/{attachments.js => message.js} | 53 +++++++++---------- 2 files changed, 62 insertions(+), 31 deletions(-) rename plugins/nextcloud/js/{attachments.js => message.js} (67%) diff --git a/plugins/nextcloud/index.php b/plugins/nextcloud/index.php index 543d0bfd7..39fae6da3 100644 --- a/plugins/nextcloud/index.php +++ b/plugins/nextcloud/index.php @@ -4,8 +4,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin { const NAME = 'Nextcloud', - VERSION = '2.1', - RELEASE = '2022-10-10', + VERSION = '2.2', + RELEASE = '2022-10-13', CATEGORY = 'Integrations', DESCRIPTION = 'Integrate with Nextcloud v20+', REQUIRED = '2.18.6'; @@ -18,8 +18,9 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin $this->addHook('main.fabrica', 'MainFabrica'); $this->addHook('filter.app-data', 'FilterAppData'); + $this->addJs('js/message.js'); $this->addHook('json.attachments', 'DoAttachmentsActions'); - $this->addJs('js/attachments.js'); + $this->addJsonHook('NextcloudSaveMsg', 'NextcloudSaveMsg'); } } @@ -55,6 +56,39 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin } */ + public function NextcloudSaveMsg() : array + { + $aValues = \RainLoop\Utils::DecodeKeyValuesQ($this->jsonParam('msgHash', '')); + if (!empty($aValues['Folder']) && !empty($aValues['Uid'])) { + $oActions = \RainLoop\Api::Actions(); + $oMailClient = $oActions->MailClient(); + if (!$oMailClient->IsLoggined()) { + $oAccount = $oActions->getAccountFromToken(); + $oAccount->ImapConnectAndLoginHelper($oActions->Plugins(), $oMailClient, $oActions->Config()); + } + + $sSaveFolder = $this->Config()->Get('plugin', 'save_folder', '') ?: 'Emails'; + $oFiles = \OCP\Files::getStorage('files'); + if ($oFiles && \method_exists($oFiles, 'file_put_contents')) { + $oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder); + } + $sFilename = $sSaveFolder . '/' . ($this->jsonParam('filename', '') ?: \date('YmdHis')) . '.eml'; + + $oMailClient->MessageMimeStream( + function ($rResource) use ($oFiles, $sFilename) { + if (\is_resource($rResource)) { + $oFiles->file_put_contents($sFilename, $rResource); + } + }, + (string) $aValues['Folder'], + (int) $aValues['Uid'], + isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : '' + ); + } + + return $this->jsonResponse(__FUNCTION__, true); + } + public function DoAttachmentsActions(\SnappyMail\AttachmentsAction $data) { if (static::isLoggedIn() && 'nextcloud' === $data->action) { diff --git a/plugins/nextcloud/js/attachments.js b/plugins/nextcloud/js/message.js similarity index 67% rename from plugins/nextcloud/js/attachments.js rename to plugins/nextcloud/js/message.js index 1b438324e..74fcd2821 100644 --- a/plugins/nextcloud/js/attachments.js +++ b/plugins/nextcloud/js/message.js @@ -30,45 +30,42 @@ }); } }; + + view.nextcloudSaveMsg = () => { + let msg = view.message(); + rl.pluginRemoteRequest( + (iError, data) => { + console.dir({ + iError:iError, + data:data + }); + }, + 'NextcloudSaveMsg', + { + 'msgHash': msg.requestHash, + 'filename': msg.subject() + } + ); + }; } }); let template = document.getElementById('MailMessageView'); + const attachmentsControls = template.content.querySelector('.attachmentsControls'); if (attachmentsControls) { attachmentsControls.append(Element.fromHTML('' + '' + '💾' - + 'Save Nextcloud' + + '' + '')); } - - /** TODO: File browser to attach files in composer */ -/* - let cfg = rl.settings.get('Nextcloud'); - fetch(cfg.WebDAV . '/files/' . cfg.UID, { - method: 'PROPFIND', - mode: 'same-origin', - cache: 'no-cache', - redirect: 'error', - credentials: 'same-origin', - headers: { - 'Content-Type': 'application/xml; charset=utf-8', - }, - body: '' - + '' - + '' - + '' - }) - .then(response => response.text()) - .then(text => { - console.dir({response:text}); - parser = new DOMParser(); - xmlDoc = parser.parseFromString(text, "text/xml"); - }) - .catch(error => console.error(error)); -*/ - + const msgMenu = template.content.querySelector('#more-view-dropdown-id + menu'); + if (msgMenu) { + msgMenu.append(Element.fromHTML('
  • ' + + '' + + '
  • ')); + } })(window.rl);