Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
feature(Felamimail/Message): save message copy in selected imap folder
Browse files Browse the repository at this point in the history
  • Loading branch information
ccheng-dev committed Aug 31, 2022
1 parent 69bb9de commit 5154c8b
Show file tree
Hide file tree
Showing 13 changed files with 295 additions and 116 deletions.
25 changes: 0 additions & 25 deletions tests/e2etests/src/test/Felamimail/message.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,31 +108,6 @@ describe('message', () => {
});
});

describe.skip('email note preference', () => {
test('open Felamimail settings and set note=yes', async () => {
await expect(page).toClick('span', {text: process.env.TEST_BRANDING_TITLE});
await expect(page).toClick('.x-menu-item-text', {text: 'E-Mail'});
await page.waitForTimeout(2000);
await lib.setPreference(page,'E-Mail', 'autoAttachNote', 'ja');
});
test('open compose dialog and check button pressed', async () => {
await page.waitForTimeout(3000);
let popupWindow = await lib.getEditDialog('Verfassen');
await popupWindow.waitForSelector('.x-btn.x-btn-text-icon.x-btn-pressed');
await popupWindow.close();
});
test.skip('open Felamimail settings and set note=no', async () => {
await page.waitForTimeout(2000);
await lib.setPreference(page,'E-Mail', 'autoAttachNote', 'nein');
});
test.skip('open editDialog and check button unpressed', async () => {
await page.waitForTimeout(2000);
let popupWindow = await lib.getEditDialog('Verfassen');
if (await popupWindow.$('.x-btn.x-btn-text-icon.x-btn-pressed') !== null) return Promise.reject('Error: The button is pressed');
await popupWindow.close();
});
});

afterAll(async () => {
browser.close();
});
1 change: 1 addition & 0 deletions tine20/Felamimail/Controller/Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -1006,6 +1006,7 @@ protected function _beforeUpdateSystemAccount($_record, $_oldRecord)
'migration_approved',
'from',
'organization',
'message_sent_copy_behavior',
);
$diff = $_record->diff($_oldRecord)->diff;
foreach ($diff as $key => $value) {
Expand Down
89 changes: 51 additions & 38 deletions tine20/Felamimail/Controller/Message/Send.php
Original file line number Diff line number Diff line change
Expand Up @@ -326,10 +326,10 @@ public function createMailForSending(Felamimail_Model_Message $_message,
* @param boolean $_saveInSent
* @param Felamimail_Model_Message $_message
*/
protected function _sendMailViaTransport(Zend_Mail $_mail,
protected function _sendMailViaTransport(Zend_Mail $_mail,
Felamimail_Model_Account $_account,
Felamimail_Model_Message $_message = null,
$_saveInSent = false)
bool $_saveInSent = false)
{
$smtpConfig = $_account->getSmtpConfig();
if (empty($smtpConfig) || ! isset($smtpConfig['hostname'])) {
Expand All @@ -341,12 +341,21 @@ protected function _sendMailViaTransport(Zend_Mail $_mail,
Tinebase_Smtp::getInstance()->sendMessage($_mail, $transport);
if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
. ' Sending successful.');

if ($_message) {
if (!isset($_message['sent_copy_folder']) && $_account->message_sent_copy_behavior !== Felamimail_Model_Account::MESSAGE_COPY_FOLDER_SKIP) {
$sentFolder = Felamimail_Controller_Account::getInstance()->getSystemFolder($_account, Felamimail_Model_Folder::FOLDER_SENT);
$_message['sent_copy_folder'] = [$sentFolder->getId()];
}

if ($_saveInSent) {
$sentFolder = $this->_saveInSent($transport, $_account, $this->_getAdditionalHeaders($_message));
$this->_fileSentMessage($_message, $sentFolder);
if (isset($_message['sent_copy_folder']) && sizeof($_message['sent_copy_folder']) > 0) {
$folders = $this->_saveMessageCopyToImapFolders($transport, $_account, $_message);
if ($folders[0]) {
$this->_fileSentMessage($_message, $folders[0]);
}
}
}

// add reply/forward flags if set
if ($_message && ! empty($_message->flags)
&& ($_message->flags == Zend_Mail_Storage::FLAG_ANSWERED || $_message->flags == Zend_Mail_Storage::FLAG_PASSED)
Expand Down Expand Up @@ -414,41 +423,45 @@ protected function _fileSentMessage($_message, $_sentFolder)
*
* @param Felamimail_Transport $_transport
* @param Felamimail_Model_Account $_account
* @param array $_additionalHeaders
* @return Felamimail_Model_Folder
* @param Felamimail_Model_Message $_message
* @throws Felamimail_Exception_IMAPInvalidCredentials
* @throws Zend_Mail_Transport_Exception
*/
protected function _saveInSent(Felamimail_Transport_Interface $_transport, Felamimail_Model_Account $_account, $_additionalHeaders = array())
protected function _saveMessageCopyToImapFolders(Felamimail_Transport_Interface $_transport, Felamimail_Model_Account $_account, Felamimail_Model_Message $_message)
{
try {
$mailAsString = $_transport->getRawMessage(NULL, $_additionalHeaders);
$sentFolder = Felamimail_Controller_Account::getInstance()->getSystemFolder($_account, Felamimail_Model_Folder::FOLDER_SENT);

if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .
' About to save message in sent folder (' . $sentFolder->globalname . ') ...');

Felamimail_Backend_ImapFactory::factory($_account)->appendMessage(
$mailAsString,
Felamimail_Model_Folder::encodeFolderName($sentFolder->globalname)
);

Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
. ' Saved sent message in "' . $sentFolder->globalname . '".'
);
} catch (Zend_Mail_Protocol_Exception $zmpe) {
Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__
. ' Could not save sent message in "' . $sentFolder->globalname . '".'
. ' Please check if a folder with this name exists.'
. '(' . $zmpe->getMessage() . ')'
);
} catch (Zend_Mail_Storage_Exception $zmse) {
Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__
. ' Could not save sent message in "' . $sentFolder->globalname . '".'
. ' Please check if a folder with this name exists.'
. '(' . $zmse->getMessage() . ')'
);
$additionalHeaders = $this->_getAdditionalHeaders($_message);
$mailAsString = $_transport->getRawMessage(NULL, $additionalHeaders);
$imapFolderIds = $_message['sent_copy_folder'];
$folders = Felamimail_Controller_Folder::getInstance()->getMultiple($imapFolderIds);

foreach ($folders as $targetFolder) {
try {
if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .
' About to save message in folder (' . $targetFolder->globalname . ') ...');

Felamimail_Backend_ImapFactory::factory($_account)->appendMessage(
$mailAsString,
Felamimail_Model_Folder::encodeFolderName($targetFolder->globalname)
);
Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__
. ' Saved sent message in "' . $targetFolder->globalname . '".'
);
} catch (Zend_Mail_Protocol_Exception $zmpe) {
Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__
. ' Could not save sent message in "' . $targetFolder->globalname . '".'
. ' Please check if a folder with this name exists.'
. '(' . $zmpe->getMessage() . ')'
);
} catch (Zend_Mail_Storage_Exception $zmse) {
Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__
. ' Could not save sent message in "' . $targetFolder->globalname . '".'
. ' Please check if a folder with this name exists.'
. '(' . $zmse->getMessage() . ')'
);
}
}

return $sentFolder;
return $folders;
}

/**
Expand Down
41 changes: 40 additions & 1 deletion tine20/Felamimail/Model/Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
* @property string $sieve_notification_move_folder
* @property string $sieve_hostname
* @property string $migration_approved
* @property string $message_sent_copy_behavior
* @property Tinebase_Model_EmailUser $email_imap_user
* @property Tinebase_Model_EmailUser $email_smtp_user
* @property Tinebase_Record_RecordSet $aliases (Tinebase_Model_EmailUser_Alias)
Expand Down Expand Up @@ -88,6 +89,28 @@ class Felamimail_Model_Account extends Tinebase_EmailUser_Model_Account
* @var string
*/
const SIEVE_NOTIFICATION_MOVE_INACTIVE = 'INACTIVE';

/**
*
* copy message to configured sent folder, only available when compose/reply/forward message
*
* @var string
*/
const MESSAGE_COPY_FOLDER_SENT = 'sent';

/**
* copy message to folder of source mail, only available when compose/reply/forward message
*
* @var string
*/
const MESSAGE_COPY_FOLDER_SOURCE = 'source';

/**
* skip copy message to folder
*
* @var string
*/
const MESSAGE_COPY_FOLDER_SKIP = 'skip';

/**
* Holds the model configuration (must be assigned in the concrete class)
Expand Down Expand Up @@ -647,7 +670,23 @@ class Felamimail_Model_Account extends Tinebase_EmailUser_Model_Account
],
'validators' => [Zend_Filter_Input::ALLOW_EMPTY => true],
self::NULLABLE => true,
]
],
'message_sent_copy_behavior' => [
self::TYPE => self::TYPE_STRING,
self::SYSTEM => true,
self::VALIDATORS => [
Zend_Validate_InArray::class => [
self::MESSAGE_COPY_FOLDER_SKIP,
self::MESSAGE_COPY_FOLDER_SENT,
self::MESSAGE_COPY_FOLDER_SOURCE,
],
Zend_Filter_Input::ALLOW_EMPTY => false,
Zend_Filter_Input::DEFAULT_VALUE => self::MESSAGE_COPY_FOLDER_SENT
],
self::INPUT_FILTERS => [
Zend_Filter_Empty::class => self::MESSAGE_COPY_FOLDER_SENT,
],
],
]
];

Expand Down
3 changes: 3 additions & 0 deletions tine20/Felamimail/Model/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
* @property boolean $massMailingFlag true if message should be treated as mass mailing
* @property array $fileLocations file locations of this message
* @property boolean $is_spam_suspicions true if is spam suspicions
* @property array $sent_copy_folder target folder ids when save copy message to source folder
*/
class Felamimail_Model_Message extends Tinebase_Record_Abstract implements Tinebase_BL_DataInterface
{
Expand Down Expand Up @@ -177,6 +179,7 @@ class Felamimail_Model_Message extends Tinebase_Record_Abstract implements Tineb
'fileLocations' => array(Zend_Filter_Input::ALLOW_EMPTY => true),
'is_spam_suspicions' => array(Zend_Filter_Input::ALLOW_EMPTY => true),
'tags' => array(Zend_Filter_Input::ALLOW_EMPTY => true), // originally categories handled by Tinebase_Tags
'sent_copy_folder' => array(Zend_Filter_Input::ALLOW_EMPTY => true),
);

/**
Expand Down
17 changes: 0 additions & 17 deletions tine20/Felamimail/Preference.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,6 @@ class Felamimail_Preference extends Tinebase_Preference_Abstract
*
*/
const USEINADB = 'useInAdb';

/**
* use for default note
*
*/
const AUTOATTACHNOTE = 'autoAttachNote';

/**
* show delete confirmation
Expand Down Expand Up @@ -115,7 +109,6 @@ public function getAllApplicationPreferences()
self::MARKEMAILREAD,
self::UPDATEINTERVAL,
self::USEINADB,
self::AUTOATTACHNOTE,
self::CONFIRM_DELETE,
self::EML_FORWARD,
self::DEFAULT_FONT,
Expand Down Expand Up @@ -150,10 +143,6 @@ public function getTranslatedPreferences()
'label' => $translate->_('Use for mailto links'),
'description' => $translate->_('Use Felamimail in mailto links, otherwise use the default desktop client.'),
),
self::AUTOATTACHNOTE => array(
'label' => $translate->_('Use for NOTES'),
'description' => $translate->_('Save Note default Value.'),
),
self::CONFIRM_DELETE => array(
'label' => $translate->_('Confirm Delete'),
'description' => $translate->_('Show confirmation dialog when deleting mails.'),
Expand Down Expand Up @@ -212,12 +201,6 @@ public function getApplicationPreferenceDefaults($_preferenceName, $_accountId=N
}
$preference->options .= '</options>';
break;
case self::AUTOATTACHNOTE:
$preference->options = '<?xml version="1.0" encoding="UTF-8"?>
<options>
<special>' . Tinebase_Preference_Abstract::YES_NO_OPTIONS . '</special>
</options>';
break;
case self::CONFIRM_DELETE:
$preference->value = 1;
$preference->options = '<?xml version="1.0" encoding="UTF-8"?>
Expand Down
26 changes: 26 additions & 0 deletions tine20/Felamimail/Setup/Update/15.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Felamimail_Setup_Update_15 extends Setup_Update_Abstract
const RELEASE015_UPDATE000 = __CLASS__ . '::update000';
const RELEASE015_UPDATE001 = __CLASS__ . '::update001';
const RELEASE015_UPDATE002 = __CLASS__ . '::update002';
const RELEASE015_UPDATE003 = __CLASS__ . '::update003';

static protected $_allUpdates = [
self::PRIO_NORMAL_APP_UPDATE => [
Expand All @@ -33,6 +34,10 @@ class Felamimail_Setup_Update_15 extends Setup_Update_Abstract
self::CLASS_CONST => self::class,
self::FUNCTION_CONST => 'update002',
],
self::RELEASE015_UPDATE003 => [
self::CLASS_CONST => self::class,
self::FUNCTION_CONST => 'update003',
],
],
];

Expand Down Expand Up @@ -96,4 +101,25 @@ public function update002()

$this->addApplicationUpdate('Felamimail', '15.2',self::RELEASE015_UPDATE002);
}


public function update003()
{
if ($this->getTableVersion('felamimail_account') < 29) {
$declaration = new Setup_Backend_Schema_Field_Xml('
<field>
<name>message_sent_copy_behavior</name>
<type>text</type>
<length>255</length>
<default>sent</default>
</field>
');
$this->_backend->addCol('felamimail_account', $declaration);
$this->setTableVersion('felamimail_account', 29);
}
$db = $this->getDb();
$db->query('DELETE FROM ' . SQL_TABLE_PREFIX . 'preferences WHERE name = "autoAttachNote"');

$this->addApplicationUpdate('Felamimail', '15.3', self::RELEASE015_UPDATE003);
}
}
11 changes: 9 additions & 2 deletions tine20/Felamimail/Setup/setup.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<application>
<name>Felamimail</name>
<version>15.2</version>
<version>15.3</version>
<order>30</order>
<status>enabled</status>
<tables>
<table>
<name>felamimail_account</name>
<version>28</version>
<version>29</version>
<declaration>
<field>
<name>id</name>
Expand Down Expand Up @@ -78,6 +78,13 @@
<length>32</length>
<default>none</default>
</field>
<field>
<name>message_sent_copy_behavior</name>
<type>text</type>
<length>255</length>
<default>sent</default>
<notnull>true</notnull>
</field>
<field>
<name>sent_folder</name>
<type>text</type>
Expand Down
Loading

0 comments on commit 5154c8b

Please sign in to comment.