fix setting answered and forwarded flags on answering/forwarding mails

This commit is contained in:
Klaus Leithoff 2014-01-23 11:56:34 +00:00
parent f0710fbecb
commit bc2689c3ae
3 changed files with 175 additions and 89 deletions

View File

@ -2693,21 +2693,19 @@ class mail_bo
$msglist = '';
$oldMailbox = '';
if (is_null($_folder) || empty($_folder)) $_folder = $this->sessionData['mailbox'];
if(!is_array($_messageUID) || count($_messageUID) === 0)
if (empty($_messageUID))
{
if ($_messageUID=='all')
{
$_messageUID= null;
}
else
{
if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
return false;
}
if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
return false;
}
elseif ($_messageUID==='all')
{
$_messageUID= null;
}
else
{
$uidsToDelete = new Horde_Imap_Client_Ids();
if (!(is_object($_messageUID) || is_array($_messageUID))) $_messageUID = (array)$_messageUID;
$uidsToDelete->add($_messageUID);
}
$deleteOptions = $_forceDeleteMethod; // use forceDeleteMethod if not "no", or unknown method
@ -2724,10 +2722,11 @@ class mail_bo
$oldMailbox = $this->icServer->getCurrentMailbox();
$this->icServer->openMailbox($_folder);
}
//error_log(__METHOD__.__LINE__.'->'.array2string($_messageUID).','.$_folder.'/'.$this->sessionData['mailbox'].' Option:'.$deleteOptions);
$updateCache = false;
switch($deleteOptions) {
case "move_to_trash":
//error_log(__METHOD__.__LINE__);
$updateCache = true;
if(!empty($trashFolder)); {
if (self::$debug) error_log(__METHOD__.__LINE__.implode(' : ', $_messageUID));
@ -2738,6 +2737,7 @@ class mail_bo
break;
case "mark_as_deleted":
//error_log(__METHOD__.__LINE__);
// mark messages as deleted
if (is_null($_messageUID)) $_messageUID='all';
foreach((array)$_messageUID as $key =>$uid)
@ -2757,12 +2757,20 @@ class mail_bo
break;
case "remove_immediately":
//error_log(__METHOD__.__LINE__);
$updateCache = true;
if (is_null($_messageUID)) $_messageUID='all';
foreach((array)$_messageUID as $key =>$uid)
if (is_object($_messageUID))
{
//flag messages, that are flagged for deletion as seen too
$this->flagMessages('delete', $uid, $_folder);
$this->flagMessages('delete', $_messageUID, $_folder);
}
else
{
foreach((array)$_messageUID as $key =>$uid)
{
//flag messages, that are flagged for deletion as seen too
$this->flagMessages('delete', $uid, $_folder);
}
}
// delete the messages finaly
$this->icServer->expunge($_folder);
@ -2785,7 +2793,8 @@ class mail_bo
function getFlags ($_messageUID) {
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_messageUID);
if (!(is_object($_messageUID) || is_array($_messageUID))) $_messageUID = (array)$_messageUID;
$uidsToFetch->add($_messageUID);
$_folderName = $this->icServer->getCurrentMailbox();
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->flags();
@ -2841,22 +2850,19 @@ class mail_bo
function flagMessages($_flag, $_messageUID,$_folder=NULL)
{
//error_log(__METHOD__.__LINE__.'->' .$_flag." ".array2string($_messageUID).",$_folder /".$this->sessionData['mailbox']);
if(!is_array($_messageUID)) {
#return false;
if ($_messageUID=='all')
{
//the empty array triggers the default for ctoring a flag for ALL messages
$uidsToModify = null;
}
else
{
$uidsToModify = new Horde_Imap_Client_Ids();
$uidsToModify->add($_messageUID);
}
if (empty($_messageUID))
{
if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
return false;
}
elseif ($_messageUID==='all')
{
$uidsToModify= null;
}
else
{
$uidsToModify = new Horde_Imap_Client_Ids();
if (!(is_object($_messageUID) || is_array($_messageUID))) $_messageUID = (array)$_messageUID;
$uidsToModify->add($_messageUID);
}
@ -2967,21 +2973,19 @@ class mail_bo
$msglist = '';
$deleteOptions = $GLOBALS['egw_info']["user"]["preferences"]["mail"]["deleteOptions"];
if(!is_array($_messageUID) || count($_messageUID) === 0)
if (empty($_messageUID))
{
if ($_messageUID=='all')
{
$uidsToMove= null;
}
else
{
if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
return false;
}
if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
return false;
}
elseif ($_messageUID==='all')
{
$uidsToMove= null;
}
else
{
$uidsToMove = new Horde_Imap_Client_Ids();
if (!(is_object($_messageUID) || is_array($_messageUID))) $_messageUID = (array)$_messageUID;
$uidsToMove->add($_messageUID);
}
$sourceFolder = (!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox']);
@ -3496,7 +3500,8 @@ class mail_bo
//error_log(__METHOD__.__LINE__.array2string($_folder).'/'.$this->icServer->getCurrentMailbox().'/'. $this->sessionData['mailbox']);
// querying contents of body part
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->bodyPart($_partID, array(
@ -3986,7 +3991,8 @@ class mail_bo
//error_log(__METHOD__.__LINE__.":$_uid,$_partID,$decode,$_folder");
if(empty($_partID)) {
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$envFields = new Horde_Mime_Headers();
@ -4097,7 +4103,8 @@ class mail_bo
//error_log(__METHOD__.__LINE__.':'.$_uid.', '.$_partID.', '.$decode.', '.$preserveUnSeen.', '.$_folder);
if (empty($_folder)) $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->headerText(array('peek'=>$preserveUnSeen));
@ -4153,7 +4160,8 @@ class mail_bo
return $rawHeaders[$this->icServer->ImapServerId][$_folder][$_uid][(empty($_partID)?'NIL':$_partID)];
}
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->headerText(array('peek'=>true));
@ -4267,7 +4275,8 @@ class mail_bo
}
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->fullText(array('peek'=>true));
@ -4297,7 +4306,8 @@ class mail_bo
}
}
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->fullText(array('peek'=>true));//always do that as peek -> no seen flag set
@ -4350,7 +4360,8 @@ class mail_bo
$_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
}
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
try
{
$_fquery = new Horde_Imap_Client_Fetch_Query();
@ -4552,7 +4563,8 @@ class mail_bo
$_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
$uidsToFetch = new Horde_Imap_Client_Ids();
$uidsToFetch->add((array)$_uid);
if (!(is_object($_uid) || is_array($_uid))) $_uid = (array)$_uid;
$uidsToFetch->add($_uid);
$fquery = new Horde_Imap_Client_Fetch_Query();
$fquery->structure();

View File

@ -411,6 +411,7 @@ class mail_compose
try
{
$_content['isDraft'] = 1;
$previouslyDrafted = $_content['lastdrafted'];
// save as draft
$folder = $this->mail_bo->getDraftFolder();
$this->mail_bo->reopen($folder);
@ -425,14 +426,34 @@ class mail_compose
}
// saving as draft, does not mean closing the message
$messageUid = ($messageUid===true ? $uidNext : $messageUid);
if ($this->mail_bo->getMessageHeader($messageUid))
//error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.'/'.gettype($messageUid).' in folder:'.$folder);
if ($this->mail_bo->getMessageHeader($messageUid, '',false, false, $folder))
{
//error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder);
$draftContent = $this->bocompose->getDraftData($this->mail_bo->icServer, $folder, $messageUid);
$draft_id = mail_ui::createRowID($folder, $messageUid);
error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$draft_id.'/'.$previouslyDrafted.' in folder:'.$folder);
if (isset($previouslyDrafted) && $previouslyDrafted!=$draft_id)
{
$dhA = mail_ui::splitRowID($previouslyDrafted);
$duid = $dhA['msgUID'];
$dmailbox = $dhA['folder'];
try
{
error_log(__METHOD__.__LINE__."->".print_r($duid,true).' folder:'.$dmailbox.' Method:'.'remove_immediately');
$this->mail_bo->deleteMessages($duid,$dmailbox,'remove_immediately');
}
catch (egw_exception $e)
{
$error = str_replace('"',"'",$e->getMessage());
error_log(__METHOD__.__LINE__.$error);
}
}
$_content['lastdrafted'] = $draft_id;
//$draftContent = $this->bocompose->getDraftData($this->mail_bo->icServer, $folder, $messageUid);
//$this->compose($draftContent,null,'to',true);
//return true;
}
}
catch (egw_exception_wrong_userinput $e)
{
@ -1254,6 +1275,9 @@ class mail_compose
$content['serverID'] = $this->mail_bo->profileID;
}
$preserv['serverID'] = $content['serverID'];
$preserv['lastdrafted'] = $content['lastdrafted'];
$preserv['processedmail_id'] = $content['processedmail_id'];
$preserv['mode'] = $content['mode'];
// convert it back to checkbox expectations
if($content['mimeType'] == 'html') {
$content['mimeType']=1;
@ -1312,7 +1336,8 @@ class mail_compose
case 'reply':
case 'reply_all':
$content = $this->getReplyData($from == 'reply' ? 'single' : 'all', $icServer, $folder, $msgUID, $part_id);
$content['processedmail_id'] = $mail_id;
$content['mode'] = 'reply';
$_focusElement = 'body';
$suppressSigOnTop = false;
$isReply = true;
@ -1328,6 +1353,8 @@ class mail_compose
$folder = $hA['folder'];
$content = $this->getForwardData($icServer, $folder, $msgUID, $part_id, $mode);
}
$content['processedmail_id'] = implode(',',$replyIds);
$content['mode'] = 'forward';
$isReply = ($mode?$mode=='inline':$this->preferencesArray['message_forwarding'] == 'inline');
$suppressSigOnTop = false;// ($mode && $mode=='inline'?true:false);// may be a better solution
$_focusElement = 'to';
@ -1625,9 +1652,10 @@ class mail_compose
//_debug_array($headers); exit;
// check for Re: in subject header
$this->sessionData['subject'] = "[FWD] " . $mail_bo->decode_header($headers['SUBJECT']);
$this->sessionData['sourceFolder']=$_folder;
$this->sessionData['forwardFlag']='forwarded';
$this->sessionData['forwardedUID']=$_uid;
// the three arrtibutes below are substituted by processedmail_id and mode
//$this->sessionData['sourceFolder']=$_folder;
//$this->sessionData['forwardFlag']='forwarded';
//$this->sessionData['forwardedUID']=$_uid;
if ($this->preferencesArray['message_forwarding'] == 'asmail') {
$this->sessionData['mimeType'] = $this->preferencesArray['composeOptions'];
if($headers['SIZE'])
@ -2271,6 +2299,33 @@ class mail_compose
$this->sessionData['mimeType'] = $_formData['mimeType'];
$this->sessionData['to_infolog'] = $_formData['to_infolog'];
$this->sessionData['to_tracker'] = $_formData['to_tracker'];
if (isset($_formData['lastdrafted']) && !empty($_formData['lastdrafted']))
{
$this->sessionData['lastdrafted'] = $_formData['lastdrafted'];
}
//error_log(__METHOD__.__LINE__.' Mode:'.$_formData['mode'].' PID:'.$_formData['processedmail_id']);
if (isset($_formData['mode']) && !empty($_formData['mode']))
{
if ($_formData['mode']=='forward' && !empty($_formData['processedmail_id']))
{
$this->sessionData['forwardFlag']='forwarded';
$_formData['processedmail_id'] = explode(',',$_formData['processedmail_id']);
$this->sessionData['uid']=array();
foreach ($_formData['processedmail_id'] as $k =>$rowid)
{
$fhA = mail_ui::splitRowID($rowid);
$this->sessionData['uid'][] = $fhA['msgUID'];
$this->sessionData['forwardedUID'][] = $fhA['msgUID'];
if (!empty($fhA['folder'])) $this->sessionData['sourceFolder'] = $fhA['folder'];
}
}
if ($_formData['mode']=='reply' && !empty($_formData['processedmail_id']))
{
$rhA = mail_ui::splitRowID($_formData['processedmail_id']);
$this->sessionData['uid'] = $rhA['msgUID'];
$this->sessionData['messageFolder'] = $rhA['folder'];
}
}
// if the body is empty, maybe someone pasted something with scripts, into the message body
// this should not happen anymore, unless you call send directly, since the check was introduced with the action command
if(empty($this->sessionData['body']))
@ -2468,12 +2523,26 @@ class mail_compose
$lastDrafted = false;
if (isset($this->sessionData['lastDrafted']))
{
$lastDrafted = $this->sessionData['lastDrafted'];
$lastDrafted=array();
$dhA = mail_ui::splitRowID($this->sessionData['lastdrafted']);
$lastDrafted['uid'] = $dhA['msgUID'];
$lastDrafted['folder'] = $dhA['folder'];
if (isset($lastDrafted['uid']) && !empty($lastDrafted['uid'])) $lastDrafted['uid']=trim($lastDrafted['uid']);
// manually drafted, do not delete
if (isset($lastDrafted['uid']) && (empty($lastDrafted['uid']) || $lastDrafted['uid'] == $this->sessionData['uid'])) $lastDrafted=false;
//error_log(__METHOD__.__LINE__.array2string($lastDrafted));
}
if ($lastDrafted && is_array($lastDrafted) && $mail_bo->isDraftFolder($lastDrafted['folder'])) $mail_bo->deleteMessages((array)$lastDrafted['uid'],$lastDrafted['folder'],"remove_immediately");
if ($lastDrafted && is_array($lastDrafted) && $mail_bo->isDraftFolder($lastDrafted['folder']))
{
try
{
$mail_bo->deleteMessages($lastDrafted['uid'],$lastDrafted['folder'],'remove_immediately');
}
catch (egw_exception $e)
{
$error = str_replace('"',"'",$e->getMessage());
}
}
unset($this->sessionData['lastDrafted']);
//error_log("handling draft messages, flagging and such");
@ -2481,17 +2550,19 @@ class mail_compose
|| (isset($this->sessionData['forwardFlag']) && isset($this->sessionData['sourceFolder']))) {
// mark message as answered
$mail_bo->openConnection();
$mail_bo->reopen($this->sessionData['messageFolder']);
$mail_bo->reopen(($this->sessionData['messageFolder']?$this->sessionData['messageFolder']:$this->sessionData['sourceFolder']));
// if the draft folder is a starting part of the messages folder, the draft message will be deleted after the send
// unless your templatefolder is a subfolder of your draftfolder, and the message is in there
if ($mail_bo->isDraftFolder($this->sessionData['messageFolder']) && !$mail_bo->isTemplateFolder($this->sessionData['messageFolder']))
{
$mail_bo->deleteMessages(array($this->sessionData['uid']),$this->sessionData['messageFolder']);
} else {
$mail_bo->flagMessages("answered", array($this->sessionData['uid']));
$mail_bo->flagMessages("answered", $this->sessionData['uid'],($this->sessionData['messageFolder']?$this->sessionData['messageFolder']:$this->sessionData['sourceFolder']));
//error_log(__METHOD__.__LINE__.array2string(array_keys($this->sessionData)).':'.array2string($this->sessionData['forwardedUID']).' F:'.$this->sessionData['sourceFolder']);
if (array_key_exists('forwardFlag',$this->sessionData) && $this->sessionData['forwardFlag']=='forwarded')
{
$mail_bo->flagMessages("forwarded", array($this->sessionData['forwardedUID']));
//error_log(__METHOD__.__LINE__.':'.array2string($this->sessionData['forwardedUID']).' F:'.$this->sessionData['sourceFolder']);
$mail_bo->flagMessages("forwarded", $this->sessionData['forwardedUID'],$this->sessionData['sourceFolder']);
}
}
//$mail_bo->closeConnection();

View File

@ -6,40 +6,40 @@
<vbox class="mailCompose mailComposeHeaderSection" width="99%">
<hbox class="et2_toolbar ui-widget-header ui-corner-all mail-compose_toolbar">
<button class="et2_button ui-button mail-compose_button" label="Send" id="button[send]"/>
<button class="et2_button ui-button mail-compose_button" label="Send" id="button[send]"/>
<description class="email-button-group save">
<buttononly class="et2_button ui-button" label="Save as Draft" value="saveAsDraft" id="button[saveAsDraft]" image="fileexport" onclick="app.mail.saveAsDraft"/>
<buttononly class="et2_button ui-button" label="Save as Draft and Print" value="saveAsDraftAndPrint" id="button[saveAsDraftAndPrint]" image="print" onclick="app.mail.saveAsDraftAndPrint"/>
</description>
<description class="email-button-group file">
<vfs-select class="$cont[vfsNotAvailable]" id="selectFromVFSForCompose" onchange="app.mail.vfsUploadForCompose"/>
<file class="mail-compose_fileselector" statustext="Select file to attach to message" multiple='true' progress='mailUploadProgress' onFinish="app.mail.uploadForCompose" id="uploadForCompose" drop_target ="mailUploadSection"/>
</description>
<description class="email-button-group egw">
<description class="$cont[noSaveAsAvailable]" value="Save:"/>
<hbox class="$cont[noInfologAvailable]">
<image class="et2_button ui-button et2_button_icon" label="Save as infolog on send" src="infolog/navbar" no_lang="1"/>
<checkbox statustext="check to save as infolog on send" id="to_infolog" options="on,off"/>
</hbox>
<hbox class="$cont[noTrackerAvailable]">
<image class="et2_button ui-button et2_button_icon" label="Save as tracker on send" src="tracker/navbar" no_lang="1"/>
<checkbox statustext="check to save as trackerentry on send" id="to_tracker" options="on,off"/>
</hbox>
</description>
<description class="email-button-group notification">
<description value="Recieve notification"/>
<checkbox statustext="check to recieve a notification when the message is read (note: not all clients support this and/or the reciever may not authorize the notification)" id="disposition" options="$cont[disposition]"/>
</description>
<description class="email-button-group save">
<buttononly class="et2_button ui-button" label="Save as Draft" value="saveAsDraft" id="button[saveAsDraft]" image="fileexport" onclick="app.mail.saveAsDraft"/>
<buttononly class="et2_button ui-button" label="Save as Draft and Print" value="saveAsDraftAndPrint" id="button[saveAsDraftAndPrint]" image="print" onclick="app.mail.saveAsDraftAndPrint"/>
</description>
<description class="email-button-group file">
<vfs-select class="$cont[vfsNotAvailable]" id="selectFromVFSForCompose" onchange="app.mail.vfsUploadForCompose"/>
<file class="mail-compose_fileselector" statustext="Select file to attach to message" multiple='true' progress='mailUploadProgress' onFinish="app.mail.uploadForCompose" id="uploadForCompose" drop_target ="mailUploadSection"/>
</description>
<description class="email-button-group egw">
<description class="$cont[noSaveAsAvailable]" value="Save:"/>
<hbox class="$cont[noInfologAvailable]">
<image class="et2_button ui-button et2_button_icon" label="Save as infolog on send" src="infolog/navbar" no_lang="1"/>
<checkbox statustext="check to save as infolog on send" id="to_infolog" options="on,off"/>
</hbox>
<hbox class="$cont[noTrackerAvailable]">
<image class="et2_button ui-button et2_button_icon" label="Save as tracker on send" src="tracker/navbar" no_lang="1"/>
<checkbox statustext="check to save as trackerentry on send" id="to_tracker" options="on,off"/>
</hbox>
</description>
<description class="email-button-group notification">
<description value="Recieve notification"/>
<checkbox statustext="check to recieve a notification when the message is read (note: not all clients support this and/or the reciever may not authorize the notification)" id="disposition" options="$cont[disposition]"/>
</description>
<description class="email-button-group priority">
<description value="Priority"/>
<menulist>
<menupopup id="priority"/>
</menulist>
</description>
<description class="email-button-group priority">
<description value="Priority"/>
<menulist>
<menupopup id="priority"/>
</menulist>
</description>
</hbox>
<grid width="100%">
<columns>
@ -57,6 +57,9 @@
</menulist>
<textbox class="mail-index_quotaDisplayNone" readonly="true" id="composeID"/>
<textbox class="mail-index_quotaDisplayNone" readonly="true" id="serverID"/>
<textbox class="mail-index_quotaDisplayNone" readonly="true" id="processedmail_id"/>
<textbox class="mail-index_quotaDisplayNone" readonly="true" id="mode"/>
<textbox class="mail-index_quotaDisplayNone" readonly="true" id="lastdrafted"/>
</hbox>
<taglist-email id="replyto" empty_label="Reply to" width="100%" maxSelection="1" onclick="app.mail.address_click"/>
<description/>