implement import mail from file (upload)

This commit is contained in:
Klaus Leithoff 2013-09-05 14:52:11 +00:00
parent 1590d02816
commit 55880077ee
5 changed files with 1123 additions and 152 deletions

View File

@ -4592,6 +4592,42 @@ class mail_bo
return $attachmentData;
}
/**
* save a message in folder
* throws exception on failure
* @todo set flags again
*
* @param string _folderName the foldername
* @param string _header the header of the message
* @param string _body the body of the message
* @param string _flags the imap flags to set for the saved message
*
* @return the id of the message appended or exception
*/
function appendMessage($_folderName, $_header, $_body, $_flags)
{
$header = ltrim(str_replace("\n","\r\n",$_header));
$body = str_replace("\n","\r\n",$_body);
$messageid = $this->icServer->appendMessage("$header"."$body", $_folderName, $_flags);
if ( PEAR::isError($messageid)) {
if (self::$debug) error_log("Could not append Message:".print_r($messageid->message,true));
throw new egw_exception_wrong_userinput(lang("Could not append Message:".array2string($messageid->message)));
//return false;
}
//error_log(__METHOD__.__LINE__.' appended UID:'.$messageid);
//$messageid = true; // for debug reasons only
if ($messageid === true) // try to figure out the message uid
{
$list = $this->getHeaders($_folderName, $_startMessage=1, $_numberOfMessages=1, $_sort='INTERNALDATE', $_reverse=true, $_filter=array(),$_thisUIDOnly=null, $_cacheResult=false);
if ($list)
{
if (self::$debug) error_log(__METHOD__.__LINE__.' MessageUid:'.$messageid.' but found:'.array2string($list));
$messageid = $list['header'][0]['uid'];
}
}
return $messageid;
}
/**
* getRandomString - function to be used to fetch a random string and md5 encode that one
* @param none
@ -4823,6 +4859,873 @@ class mail_bo
return $rv;
}
/**
* checkFileBasics
* check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.)
*
* @param array $_formData passed by reference Array with information of name, type, file and size, mimetype may be adapted
* @param string $IDtoAddToFileName id to enrich the returned tmpfilename
* @param string $reqMimeType /(default message/rfc822, if set to false, mimetype check will not be performed
* @return mixed $fullPathtoFile or exception
*/
static function checkFileBasics(&$_formData, $IDtoAddToFileName='', $reqMimeType='message/rfc822')
{
//error_log(__METHOD__.__FILE__.array2string($_formData).' Id:'.$IDtoAddToFileName.' ReqMimeType:'.$reqMimeType);
$importfailed = $tmpFileName = false;
if ($_formData['size'] != 0 && (is_uploaded_file($_formData['file']) ||
realpath(dirname($_formData['file'])) == realpath($GLOBALS['egw_info']['server']['temp_dir']) ||
parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs'))
{
// ensure existance of eGW temp dir
// note: this is different from apache temp dir,
// and different from any other temp file location set in php.ini
if (!file_exists($GLOBALS['egw_info']['server']['temp_dir']))
{
@mkdir($GLOBALS['egw_info']['server']['temp_dir'],0700);
}
// if we were NOT able to create this temp directory, then make an ERROR report
if (!file_exists($GLOBALS['egw_info']['server']['temp_dir']))
{
$alert_msg .= 'Error:'.'<br>'
.'Server is unable to access phpgw tmp directory'.'<br>'
.$GLOBALS['egw_info']['server']['temp_dir'].'<br>'
.'Please check your configuration'.'<br>'
.'<br>';
}
// sometimes PHP is very clue-less about MIME types, and gives NO file_type
// rfc default for unknown MIME type is:
if ($reqMimeType == 'message/rfc822')
{
$mime_type_default = 'message/rfc';
}
else
{
$mime_type_default = $reqMimeType;
}
// check the mimetype by extension. as browsers seem to report crap
// maybe its application/octet-stream -> this may mean that we could not determine the type
// so we check for the suffix too
// trust vfs mime-types, trust the mimetype if it contains a method
if ((substr($_formData['file'],0,6) !== 'vfs://' || $_formData['type'] == 'application/octet-stream') && stripos($_formData['type'],'method=')===false)
{
$buff = explode('.',$_formData['name']);
$suffix = '';
if (is_array($buff)) $suffix = array_pop($buff); // take the last extension to check with ext2mime
if (!empty($suffix)) $sfxMimeType = mime_magic::ext2mime($suffix);
if (!empty($suffix) && !empty($sfxMimeType) &&
(strlen(trim($_formData['type']))==0 || (strtolower(trim($_formData['type'])) != $sfxMimeType)))
{
error_log(__METHOD__.__LINE__.' Data:'.array2string($_formData));
error_log(__METHOD__.__LINE__.' Form reported Mimetype:'.$_formData['type'].' but seems to be:'.$sfxMimeType);
$_formData['type'] = $sfxMimeType;
}
}
if (trim($_formData['type']) == '')
{
$_formData['type'] = 'application/octet-stream';
}
// if reqMimeType is set to false do not test for that
if ($reqMimeType)
{
// so if PHP did not pass any file_type info, then substitute the rfc default value
if (substr(strtolower(trim($_formData['type'])),0,strlen($mime_type_default)) != $mime_type_default)
{
if (!(strtolower(trim($_formData['type'])) == "application/octet-stream" && $sfxMimeType == $reqMimeType))
{
//error_log("Message rejected, no message/rfc. Is:".$_formData['type']);
$importfailed = true;
$alert_msg .= lang("File rejected, no %2. Is:%1",$_formData['type'],$reqMimeType);
}
if ((strtolower(trim($_formData['type'])) != $reqMimeType && $sfxMimeType == $reqMimeType))
{
$_formData['type'] = mime_magic::ext2mime($suffix);
}
}
}
// as FreeBSD seems to have problems with the generated temp names we append some more random stuff
$randomString = chr(rand(65,90)).chr(rand(48,57)).chr(rand(65,90)).chr(rand(48,57)).chr(rand(65,90));
$tmpFileName = $GLOBALS['egw_info']['server']['temp_dir'].
SEP.
$GLOBALS['egw_info']['user']['account_id'].
trim($IDtoAddToFileName).basename($_formData['file']).'_'.$randomString;
if (parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs')
{
$tmpFileName = $_formData['file']; // no need to store it somewhere
}
elseif (is_uploaded_file($_formData['file']))
{
move_uploaded_file($_formData['file'],$tmpFileName); // requirement for safe_mode!
}
else
{
rename($_formData['file'],$tmpFileName);
}
} else {
//error_log("Import of message ".$_formData['file']." failes to meet basic restrictions");
$importfailed = true;
$alert_msg .= lang("Processing of file %1 failed. Failed to meet basic restrictions.",$_formData['name']);
}
if ($importfailed == true)
{
throw new egw_exception_wrong_userinput($alert_msg);
}
else
{
if (parse_url($tmpFileName,PHP_URL_SCHEME) == 'vfs')
{
egw_vfs::load_wrapper('vfs');
}
return $tmpFileName;
}
}
/**
* processURL2InlineImages - parses a html text for images, and adds them as inline attachment
* we do not use the functionality of the phpmailer here, as phpmailers functionality requires
* files to be present within the filesystem, which we do not require as we make this happen
* (we load the file, and store it temporarily for the use of attaching it to the file send
* @param object $_mailObject instance of the egw_mailer/phpmailer Object to be used
* @param string $_html2parse the html to parse and to be altered, if conditions meet
* @return void
*/
static function processURL2InlineImages(&$_mailObject, &$_html2parse)
{
$imageC = 0;
preg_match_all("/(src|background)=\"(.*)\"/Ui", $_html2parse, $images);
if(isset($images[2])) {
foreach($images[2] as $i => $url) {
//$isData = false;
$basedir = '';
$needTempFile = true;
//error_log(__METHOD__.__LINE__.$url);
//error_log(__METHOD__.__LINE__.$GLOBALS['egw_info']['server']['webserver_url']);
//error_log(__METHOD__.__LINE__.array2string($GLOBALS['egw_info']['user']));
// do not change urls for absolute images (thanks to corvuscorax)
if (!(substr($url,0,strlen('data:'))=='data:')) {
//error_log(__METHOD__.__LINE__.' -> '.$i.': '.array2string($images[$i]));
$filename = basename($url);
$directory = dirname($url);
($directory == '.')?$directory='':'';
$cid = 'cid:' . md5($filename);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$mimeType = $_mailObject->_mime_types($ext);
if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; }
$myUrl = $directory.$filename;
if ($myUrl[0]=='/') // local path -> we only allow path's that are available via http/https (or vfs)
{
$basedir = ($_SERVER['HTTPS']?'https://':'http://'.$_SERVER['HTTP_HOST']);
}
// use vfs instead of url containing webdav.php
// ToDo: we should test if the webdav url is of our own scope, as we cannot handle foreign
// webdav.php urls as vfs
if (strpos($myUrl,'webdav.php') !== false) // we have a webdav link, so we build a vfs/sqlfs link of it.
{
egw_vfs::load_wrapper('vfs');
list($garbage,$vfspart) = explode('webdav.php',$myUrl,2);
$myUrl = $vfspart;
$basedir = 'vfs://default';
$needTempFile = false;
}
if ( strlen($basedir) > 1 && substr($basedir,-1) != '/' && $myUrl[0]!='/') { $basedir .= '/'; }
//error_log(__METHOD__.__LINE__.$basedir.$myUrl);
if ($needTempFile) $data = file_get_contents($basedir.urldecode($myUrl));
}
if (substr($url,0,strlen('data:'))=='data:')
{
//error_log(__METHOD__.__LINE__.' -> '.$i.': '.array2string($images[$i]));
// we only support base64 encoded data
$tmp = substr($url,strlen('data:'));
list($mimeType,$data) = explode(';base64,',$tmp);
list($what,$exactly) = explode('/',$mimeType);
$needTempFile = true;
$filename = ($what?$what:'data').$imageC++.'.'.$exactly;
$cid = 'cid:' . md5($filename);
$data = base64_decode($data);
//$isData = true;
}
if ($data || $needTempFile === false)
{
if ($needTempFile)
{
$attachment_file =tempnam($GLOBALS['egw_info']['server']['temp_dir'],$GLOBALS['egw_info']['flags']['currentapp']."_");
$tmpfile = fopen($attachment_file,'w');
fwrite($tmpfile,$data);
fclose($tmpfile);
}
else
{
$attachment_file = $basedir.urldecode($myUrl);
}
//error_log(__METHOD__.__LINE__.' '.$url.' -> '.$basedir.$myUrl. ' TmpFile:'.$tmpfile);
//error_log(__METHOD__.__LINE__.' '.$url.' -> '.$mimeType. ' TmpFile:'.$attachment_file);
if ( $_mailObject->AddEmbeddedImage($attachment_file, md5($filename), $filename, 'base64',$mimeType) )
{
//$_html2parse = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $_html2parse);
$_html2parse = str_replace($images[1][$i]."=\"".$url."\"", $images[1][$i]."=\"".$cid."\"", $_html2parse);
}
}
}
}
}
/**
* importMessageToMergeAndSend
*
* @param object &bo_merge bo_merge object
* @param string $document the full filename
* @param array $SendAndMergeTocontacts array of contact ids
* @param string $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if
* folder is modified
* @param string $importID ID for the imported message, used by attachments to identify them unambiguously
* @return mixed array of messages with success and failed messages or exception
*/
function importMessageToMergeAndSend(bo_merge $bo_merge, $document, $SendAndMergeTocontacts, &$_folder, $importID='')
{
$importfailed = false;
$processStats = array('success'=>array(),'failed'=>array());
if (empty($SendAndMergeTocontacts))
{
$importfailed = true;
$alert_msg .= lang("Import of message %1 failed. No Contacts to merge and send to specified.",$_formData['name']);
}
// check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.)
/* as the file is provided by bo_merge, we do not check
try
{
$tmpFileName = mail_bo::checkFileBasics($_formData,$importID);
}
catch (egw_exception_wrong_userinput $e)
{
$importfailed = true;
$alert_msg .= $e->getMessage();
}
*/
$tmpFileName = $document;
// -----------------------------------------------------------------------
if ($importfailed === false)
{
$mailObject = new egw_mailer();
try
{
$this->parseFileIntoMailObject($mailObject,$tmpFileName,$Header,$Body);
}
catch (egw_exception_assertion_failed $e)
{
$importfailed = true;
$alert_msg .= $e->getMessage();
}
//_debug_array($Body);
$this->openConnection();
if (empty($_folder))
{
$_folder = $this->getSentFolder();
}
$delimiter = $this->getHierarchyDelimiter();
if($_folder=='INBOX'.$delimiter) $_folder='INBOX';
if ($importfailed === false)
{
$Subject = $mailObject->Subject;
//error_log(__METHOD__.__LINE__.' Subject:'.$Subject);
$Body = $mailObject->Body;
//error_log(__METHOD__.__LINE__.' Body:'.$Body);
//error_log(__METHOD__.__LINE__.' BodyContentType:'.$mailObject->BodyContentType);
$AltBody = $mailObject->AltBody;
//error_log(__METHOD__.__LINE__.' AltBody:'.$AltBody);
//error_log(__METHOD__.__LINE__.array2string($mailObject->GetReplyTo()));
// Fetch ReplyTo - Address if existing to check if we are to replace it
$replyTo = $mailObject->GetReplyTo();
if (isset($replyTo['replace@import.action']))
{
$mailObject->ClearReplyTos();
$activeMailProfile = $this->mailPreferences->getIdentity($this->profileID, true);
$mailObject->AddReplyTo(self::$idna2->encode($activeMailProfile->emailAddress),$activeMailProfile->realName);
}
foreach ($SendAndMergeTocontacts as $k => $val)
{
$mailObject->ErrorInfo = $errorInfo = '';
//$mailObject->SMTPDebug = 5;
$mailObject->set('error_count',0);
$sendOK = $openComposeWindow = $openAsDraft = null;
//error_log(__METHOD__.__LINE__.' Id To Merge:'.$val);
if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook' &&
count($SendAndMergeTocontacts) > 1 &&
is_numeric($val) || $GLOBALS['egw']->accounts->name2id($val)) // do the merge
{
//error_log(__METHOD__.__LINE__.array2string($mailObject));
$contact = $bo_merge->contacts->read($val);
//error_log(__METHOD__.__LINE__.' ID:'.$val.' Data:'.array2string($contact));
$email = ($contact['email'] ? $contact['email'] : $contact['email_home']);
$nfn = ($contact['n_fn'] ? $contact['n_fn'] : $contact['n_given'].' '.$contact['n_family']);
$activeMailProfile = $this->mailPreferences->getIdentity($this->profileID, true);
//error_log(__METHOD__.__LINE__.array2string($activeMailProfile));
$mailObject->From = $activeMailProfile->emailAddress;
//$mailObject->From = $_identity->emailAddress;
$mailObject->FromName = $mailObject->EncodeHeader(self::generateIdentityString($activeMailProfile,false));
$mailObject->MessageID = '';
$mailObject->ClearAllRecipients();
$mailObject->ClearCustomHeaders();
$mailObject->AddAddress(self::$idna2->encode($email),$mailObject->EncodeHeader($nfn));
$mailObject->Subject = $bo_merge->merge_string($Subject, $val, $e, 'text/plain', array(), self::$displayCharset);
if (!empty($AltBody))
{
$mailObject->IsHTML(true);
}
elseif (empty($AltBody) && $mailObject->BodyContentType=='text/html')
{
$mailObject->IsHTML(true);
$AltBody = self::convertHTMLToText($Body,false,$stripalltags=true);
}
else
{
$mailObject->IsHTML(false);
}
//error_log(__METHOD__.__LINE__.' ContentType:'.$mailObject->BodyContentType);
if (!empty($Body)) $mailObject->Body = $bo_merge->merge_string($Body, $val, $e, $mailObject->BodyContentType, array(), self::$displayCharset);
//error_log(__METHOD__.__LINE__.' Result:'.$mailObject->Body.' error:'.array2string($e));
if (!empty($AltBody)) $mailObject->AltBody = $bo_merge->merge_string($AltBody, $val, $e, $mailObject->AltBodyContentType, array(), self::$displayCharset);
$ogServer = $this->mailPreferences->getOutgoingServer($this->profileID);
#_debug_array($ogServer);
$mailObject->Host = $ogServer->host;
$mailObject->Port = $ogServer->port;
// SMTP Auth??
if($ogServer->smtpAuth) {
$mailObject->SMTPAuth = true;
// check if username contains a ; -> then a sender is specified (and probably needed)
list($username,$senderadress) = explode(';', $ogServer->username,2);
if (isset($senderadress) && !empty($senderadress)) $mailObject->Sender = $senderadress;
$mailObject->Username = $username;
$mailObject->Password = $ogServer->password;
}
//error_log(__METHOD__.__LINE__.array2string($mailObject));
// set a higher timeout for big messages
@set_time_limit(120);
$sendOK = true;
try {
$mailObject->Send();
}
catch(phpmailerException $e) {
$sendOK = false;
$errorInfo = $e->getMessage();
if ($mailObject->ErrorInfo) // use the complete mailer ErrorInfo, for full Information
{
if (stripos($mailObject->ErrorInfo, $errorInfo)===false)
{
$errorInfo = 'Send Failed for '.$mailObject->Subject.' to '.$nfn.'<'.$email.'> Error:'.$mailObject->ErrorInfo.'<br>'.$errorInfo;
}
else
{
$errorInfo = $mailObject->ErrorInfo;
}
}
//error_log(__METHOD__.__LINE__.array2string($errorInfo));
}
}
elseif (!$k) // 1. entry, further entries will fail for apps other then addressbook
{
$openAsDraft = true;
$mailObject->MessageID = '';
$mailObject->ClearAllRecipients();
$mailObject->ClearCustomHeaders();
if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook' &&
is_numeric($val) || $GLOBALS['egw']->accounts->name2id($val)) // do the merge
{
$contact = $bo_merge->contacts->read($val);
//error_log(__METHOD__.__LINE__.array2string($contact));
$email = ($contact['email'] ? $contact['email'] : $contact['email_home']);
$nfn = ($contact['n_fn'] ? $contact['n_fn'] : $contact['n_given'].' '.$contact['n_family']);
$mailObject->AddAddress(self::$idna2->encode($email),$mailObject->EncodeHeader($nfn));
}
$mailObject->Subject = $bo_merge->merge_string($Subject, $val, $e, 'text/plain', array(), self::$displayCharset);
if (!empty($AltBody))
{
$mailObject->IsHTML(true);
}
elseif (empty($AltBody) && $mailObject->BodyContentType=='text/html')
{
$mailObject->IsHTML(true);
$AltBody = self::convertHTMLToText($Body,false,$stripalltags=true);
}
else
{
$mailObject->IsHTML(false);
}
//error_log(__METHOD__.__LINE__.' ContentType:'.$mailObject->BodyContentType);
if (!empty($Body)) $mailObject->Body = $bo_merge->merge_string($Body, $val, $e, $mailObject->BodyContentType, array(), self::$displayCharset);
//error_log(__METHOD__.__LINE__.' Result:'.$mailObject->Body.' error:'.array2string($e));
if (!empty($AltBody)) $mailObject->AltBody = $bo_merge->merge_string($AltBody, $val, $e, $mailObject->AltBodyContentType, array(), self::$displayCharset);
$_folder = $this->getDraftFolder();
}
if ($sendOK || $openAsDraft)
{
$BCCmail = '';
if ($this->folderExists($_folder,true))
{
if($this->isSentFolder($_folder))
{
$flags = '\\Seen';
} elseif($this->isDraftFolder($_folder)) {
$flags = '\\Draft';
} else {
$flags = '';
}
unset($mailObject->sentHeader);
unset($mailObject->sentBody);
$savefailed = false;
try
{
$messageUid =$this->appendMessage($_folder,
$BCCmail.$mailObject->getMessageHeader(),
$mailObject->getMessageBody(),
$flags);
}
catch (egw_exception_wrong_userinput $e)
{
$savefailed = true;
$alert_msg .= lang("Save of message %1 failed. Could not save message to folder %2 due to: %3",$Subject,$_folder,$e->getMessage());
}
// no send, save successful, and message_uid present
if ($savefailed===false && $messageUid && is_null($sendOK))
{
$openComposeWindow = true;
list($fm_width,$fm_height) = explode('x',egw_link::get_registry('felamimail','view_popup'));
$linkData = array
(
'menuaction' => 'felamimail.uicompose.composeFromDraft',
'uid' => $messageUid,
'folder' => base64_encode($_folder),
'icServer' => $this->profileID,
'method' => 'importMessageToMergeAndSend',
);
$composeUrl = $GLOBALS['egw']->link('/index.php',$linkData);
//error_log(__METHOD__.__LINE__.' ComposeURL:'.$composeUrl);
$GLOBALS['egw_info']['flags']['java_script_thirst'] .= '<script language="JavaScript">'.
//"egw_openWindowCentered('$composeUrl','composeAsDraft_".$messageUid."',".$fm_width.",".$fm_height.");".
"window.open('$composeUrl','_blank','dependent=yes,width=".$fm_width.",height=".$fm_height.",toolbar=no,scrollbars=no,status=no');".
"</script>";
$processStats['success'][] = lang("Saving of message %1 succeeded. Check Folder %2.",$Subject,$_folder);
}
}
else
{
$savefailed = true;
$alert_msg .= lang("Saving of message %1 failed. Destination Folder %2 does not exist.",$Subject,$_folder);
}
if ($sendOK)
{
$processStats['success'][$val] = 'Send succeeded to '.$nfn.'<'.$email.'>'.($savefailed?' but failed to store to Folder:'.$_folder:'');
}
else
{
if (!$openComposeWindow) $processStats['failed'][$val] = $errorInfo?$errorInfo:'Send failed to '.$nfn.'<'.$email.'> See error_log for details';
}
}
if (!is_null($sendOK) && $sendOK===false && is_null($openComposeWindow))
{
$processStats['failed'][$val] = $errorInfo?$errorInfo:'Send failed to '.$nfn.'<'.$email.'> See error_log for details';
}
}
}
unset($mailObject);
}
// set the url to open when refreshing
if ($importfailed == true)
{
throw new egw_exception_wrong_userinput($alert_msg);
}
else
{
//error_log(__METHOD__.__LINE__.array2string($processStats));
return $processStats;
}
}
/**
* functions to allow the parsing of message/rfc files
* used in felamimail to import mails, or parsev a message from file enrich it with addressdata (merge) and send it right away.
*/
/**
* parseFileIntoMailObject - parses a message/rfc mail from file to the mailobject and returns the header and body via reference
* throws egw_exception_assertion_failed when the required Pear Class is not found/loadable
* @param object $mailObject instance of the SMTP Mailer Object
* @param string $tmpFileName string that points/leads to the file to be imported
* @param string &$Header reference used to return the imported Mailheader
* @param string &$Body reference to return the imported Body
* @return void Mailheader and body is returned via Reference in $Header $Body
*/
function parseFileIntoMailObject($mailObject,$tmpFileName,&$Header,&$Body)
{
$message = file_get_contents($tmpFileName);
try
{
return $this->parseRawMessageIntoMailObject($mailObject,$message,$Header,$Body);
}
catch (egw_exception_assertion_failed $e)
{ // not sure that this is needed to pass on exeptions
throw new egw_exception_assertion_failed($e->getMessage());
}
}
/**
* parseRawMessageIntoMailObject - parses a message/rfc mail from file to the mailobject and returns the header and body via reference
* throws egw_exception_assertion_failed when the required Pear Class is not found/loadable
* @param object $mailObject instance of the SMTP Mailer Object
* @param string $message string containing the RawMessage
* @param string &$Header reference used to return the imported Mailheader
* @param string &$Body reference to return the imported Body
* @return void Mailheader and body is returned via Reference in $Header $Body
*/
function parseRawMessageIntoMailObject($mailObject,$message,&$Header,&$Body)
{
/**
* pear/Mail_mimeDecode requires package "pear/Mail_Mime" (version >= 1.4.0, excluded versions: 1.4.0)
* ./pear upgrade Mail_Mime
* ./pear install Mail_mimeDecode
*/
//echo '<pre>'.$message.'</pre>';
//error_log(__METHOD__.__LINE__.$message);
if (class_exists('Mail_mimeDecode',false)==false && (@include_once 'Mail/mimeDecode.php') === false) throw new egw_exception_assertion_failed(lang('Required PEAR class Mail/mimeDecode.php not found.'));
$mailDecode = new Mail_mimeDecode($message);
$structure = $mailDecode->decode(array('include_bodies'=>true,'decode_bodies'=>true,'decode_headers'=>true));
//error_log(__METHOD__.__LINE__.array2string($structure));
//_debug_array($structure);
//exit;
// now create a message to view, save it in Drafts and open it
$mailObject->PluginDir = EGW_SERVER_ROOT."/phpgwapi/inc/";
$mailObject->IsSMTP();
$mailObject->CharSet = self::$displayCharset; // some default, may be altered by BodyImport
if (isset($structure->ctype_parameters['charset'])) $mailObject->CharSet = trim($structure->ctype_parameters['charset']);
$mailObject->Encoding = 'quoted-printable'; // some default, may be altered by BodyImport
/*
$mailObject->AddAddress($emailAddress, $addressObject->personal);
$mailObject->AddCC($emailAddress, $addressObject->personal);
$mailObject->AddBCC($emailAddress, $addressObject->personal);
$mailObject->AddReplyto($emailAddress, $addressObject->personal);
*/
$result ='';
$contenttypecalendar = '';
$myReplyTo = '';
foreach((array)$structure->headers as $key => $val)
{
//error_log(__METHOD__.__LINE__.$key.'->'.$val);
foreach((array)$val as $i => $v)
{
if ($key!='content-type' && $key !='content-transfer-encoding' &&
$key != 'message-id' &&
$key != 'subject' &&
$key != 'from' &&
$key != 'to' &&
$key != 'cc' &&
$key != 'bcc' &&
$key != 'reply-to' &&
$key != 'x-priority') // the omitted values to that will be set at the end
{
$Header .= $mailObject->HeaderLine($key, trim($v));
}
}
switch ($key)
{
case 'x-priority':
$mailObject->Priority = $val;
break;
case 'message-id':
$mailObject->MessageID = $val; // ToDo: maybe we want to regenerate the message id all the time
break;
case 'sender':
$mailObject->Sender = $val;
break;
case 'to':
case 'cc':
case 'bcc':
case 'from':
case 'reply-to':
$address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($val):$val),'');
$i = 0;
foreach((array)$address_array as $addressObject)
{
$mb = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : '');
$pName = $addressObject->personal;
if ($key=='from')
{
$mailObject->From = $mb;
$mailObject->FromName = $pName;
}
${$key}[$i] = array($mb,$pName);
$i++;
}
if ($key=='reply-to')
{
$myReplyTo = ${$key};
//break; // break early as we add that later
}
$Header .= $mailObject->TextLine(trim($mailObject->AddrAppend(ucfirst($key),${$key})));
break;
case 'content-transfer-encoding':
$mailObject->Encoding = $val;
break;
case 'content-type':
//error_log(__METHOD__.__LINE__.' '.$key.'->'.$val);
if (stripos($val,'calendar')) $contenttypecalendar = $val;
break;
case 'subject':
$mailObject->Subject = $mailObject->EncodeHeader($mailObject->SecureHeader($val));
$Header .= $mailObject->HeaderLine('Subject',$mailObject->Subject);
break;
default:
// stuff like X- ...
//$mailObject->AddCustomHeader('X-Mailer: FeLaMiMail');
if (!strtolower(substr($key,0,2))=='x-') break;
//case 'priority': // priority is a cusom header field
// $mailObject->Priority = $val;
// break;
case 'disposition-notification-To':
case 'organization':
foreach((array)$val as $i => $v) $mailObject->AddCustomHeader($key.': '. $v);
break;
}
}
// handle reply-to, wich may be set, set the first one found
if (!empty($myReplyTo))
{
$mailObject->ClearReplyTos();
$mailObject->AddReplyTo($myReplyTo[0][0],$myReplyTo[0][1]);
}
$seemsToBePlainMessage = false;
if (strtolower($structure->ctype_primary)=='text' && $structure->body)
{
$mailObject->IsHTML(strtolower($structure->ctype_secondary)=='html'?true:false);
if (strtolower($structure->ctype_primary) == 'text' && strtolower($structure->ctype_secondary) == 'plain' &&
is_array($structure->ctype_parameters) && isset($structure->ctype_parameters['format']) &&
trim(strtolower($structure->ctype_parameters['format']))=='flowed'
)
{
if (self::$debug) error_log(__METHOD__.__LINE__." detected TEXT/PLAIN Format:flowed -> removing leading blank ('\r\n ') per line");
$structure->body = str_replace("\r\n ","\r\n", $structure->body);
}
$mailObject->Body = $structure->body;
$seemsToBePlainMessage = true;
}
$this->createBodyFromStructure($mailObject, $structure, $parenttype=null);
$mailObject->SetMessageType();
$mailObject->CreateHeader(); // this sets the boundary stufff
//echo "Boundary:".$mailObject->FetchBoundary(1).'<br>';
//$boundary ='';
//if (isset($structure->ctype_parameters['boundary'])) $boundary = ' boundary="'.$mailObject->FetchBoundary(1).'";';
if ($seemsToBePlainMessage && !empty($contenttypecalendar) && strtolower($mailObject->ContentType)=='text/plain')
{
$Header .= $mailObject->HeaderLine('Content-Transfer-Encoding', $mailObject->Encoding);
$Header .= $mailObject->HeaderLine('Content-type', $contenttypecalendar);
}
else
{
$Header .= $mailObject->GetMailMIME();
}
$Body = $mailObject->getMessageBody(); // this is a method of the egw_mailer/phpmailer class
//_debug_array($Header);
//_debug_array($Body);
//_debug_array($mailObject);
//exit;
}
/**
* createBodyFromStructure - fetches/creates the bodypart of the email as textual representation
* is called recursively to be able to fetch the stuctureparts of the mail parsed from Mail/mimeDecode
* @param object $mailObject instance of the SMTP Mailer Object
* @param array $structure array that represents structure and content of a mail parsed from Mail/mimeDecode
* @param string $parenttype type of the parent node
* @return void Parsed Information is passed to the mailObject to be processed there
*/
function createBodyFromStructure($mailObject, $structure, $parenttype=null, $decode=false)
{
static $attachmentnumber;
static $isHTML;
static $alternatebodyneeded;
if (is_null($isHTML)) $isHTML = strtolower($structure->ctype_secondary)=='html'?true:false;
if (is_null($attachmentnumber)) $attachmentnumber = 0;
if ($structure->parts && strtolower($structure->ctype_primary)=='multipart')
{
if (is_null($alternatebodyneeded)) $alternatebodyneeded = false;
foreach($structure->parts as $part)
{
//error_log(__METHOD__.__LINE__.' Structure Content Type:'.$structure->ctype_primary.'/'.$structure->ctype_secondary.' Decoding:'.($decode?'on':'off'));
//error_log(__METHOD__.__LINE__.' '.$structure->ctype_primary.'/'.$structure->ctype_secondary.' => '.$part->ctype_primary.'/'.$part->ctype_secondary);
//error_log(__METHOD__.__LINE__.' Part:'.array2string($part));
$partFetched = false;
//echo __METHOD__.__LINE__.$structure->ctype_primary.'/'.$structure->ctype_secondary.'<br>';
if ($part->headers['content-transfer-encoding']) $mailObject->Encoding = $part->headers['content-transfer-encoding'];
//$mailObject->IsHTML($part->ctype_secondary=='html'?true:false); // we do not set this here, as the default is text/plain
if (isset($part->ctype_parameters['charset'])) $mailObject->CharSet = trim($part->ctype_parameters['charset']);
if ((strtolower($structure->ctype_secondary)=='alternative'||
strtolower($structure->ctype_secondary)=='mixed' ||
// strtolower($structure->ctype_secondary)=='related' || // may hold text/plain directly ?? I doubt it ??
strtolower($structure->ctype_secondary)=='signed') && strtolower($part->ctype_primary)=='text' && strtolower($part->ctype_secondary)=='plain' && $part->body)
{
//echo __METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.'<br>';
//error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' already fetched Content is HTML='.$isHTML.' Body:'.$part->body);
$bodyPart = $part->body;
if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'));
/*
if (strtolower($part->ctype_primary) == 'text' && strtolower($part->ctype_secondary) == 'plain' &&
is_array($part->ctype_parameters) && isset($part->ctype_parameters['format']) &&
trim(strtolower($part->ctype_parameters['format']))=='flowed'
)
{
if (self::$debug) error_log(__METHOD__.__LINE__." detected TEXT/PLAIN Format:flowed -> removing leading blank ('\r\n ') per line");
$bodyPart = str_replace("\r\n ","\r\n", $bodyPart);
}
*/
$mailObject->Body = ($isHTML==false?$mailObject->Body:'').$bodyPart;
$mailObject->AltBody .= $bodyPart;
$partFetched = true;
}
if ((strtolower($structure->ctype_secondary)=='alternative'||
strtolower($structure->ctype_secondary)=='mixed' ||
strtolower($structure->ctype_secondary)=='related' || // may hold text/html directly
strtolower($structure->ctype_secondary)=='signed' ) &&
strtolower($part->ctype_primary)=='text' && strtolower($part->ctype_secondary)=='html' && $part->body)
{
//echo __METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.'<br>';
//error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' already fetched Content is HTML='.$isHTML.' Body:'.$part->body);
$bodyPart = $part->body;
if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'));
$mailObject->IsHTML(true); // we need/want that here, because looping through all message parts may mess up the message body mimetype
$mailObject->Body = ($isHTML?$mailObject->Body:'').$bodyPart;
$alternatebodyneeded = true;
$isHTML=true;
$partFetched = true;
}
if ((strtolower($structure->ctype_secondary)=='alternative'||
strtolower($structure->ctype_secondary)=='mixed' ||
strtolower($structure->ctype_secondary)=='signed' ) &&
strtolower($part->ctype_primary)=='text' && strtolower($part->ctype_secondary)=='calendar' && $part->body)
{
//error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' BodyPart:'.array2string($part));
$bodyPart = $part->body;
if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'));
$mailObject->AltExtended = $bodyPart;
// "text/calendar; charset=utf-8; name=meeting.ics; method=REQUEST"
// [ctype_parameters] => Array([charset] => utf-8[name] => meeting.ics[method] => REQUEST)
$mailObject->AltExtendedContentType = $part->ctype_primary.'/'.$part->ctype_secondary.';'.
($part->ctype_parameters['name']?' name='.$part->ctype_parameters['name'].';':'').
($part->ctype_parameters['method']?' method='.$part->ctype_parameters['method'].'':'');
$partFetched = true;
}
if ((strtolower($structure->ctype_secondary)=='mixed' ||
strtolower($structure->ctype_secondary)=='related' ||
strtolower($structure->ctype_secondary)=='alternative' ||
strtolower($structure->ctype_secondary)=='signed') && strtolower($part->ctype_primary)=='multipart')
{
//error_log( __METHOD__.__LINE__." Recursion to fetch subparts:".$part->ctype_primary.'/'.$part->ctype_secondary);
$this->createBodyFromStructure($mailObject, $part, $parenttype=null, $decode);
}
//error_log(__METHOD__.__LINE__.$structure->ctype_primary.'/'.$structure->ctype_secondary.' => '.$part->ctype_primary.'/'.$part->ctype_secondary.' Part:'.array2string($part));
if ($part->body && ((strtolower($structure->ctype_secondary)=='mixed' && strtolower($part->ctype_primary)!='multipart') ||
trim(strtolower($part->disposition)) == 'attachment' ||
trim(strtolower($part->disposition)) == 'inline' ||
isset($part->headers['content-id'])))
{
//error_log(__METHOD__.__LINE__.$structure->ctype_secondary.'=>'.$part->ctype_primary.'/'.$part->ctype_secondary.'->'.array2string($part));
$attachmentnumber++;
$filename = trim(($part->ctype_parameters['name']?$part->ctype_parameters['name']:$part->d_parameters['filename']));
if (strlen($filename)==0)
{
//error_log(__METHOD__.__LINE__.$structure->ctype_secondary.'=>'.$part->ctype_primary.'/'.$part->ctype_secondary.'->'.array2string($part));
foreach(array('content-type','content-disposition') as $k => $v)
{
foreach(array('filename','name') as $sk => $n)
{
if (stripos($part->headers[$v],$n)!== false)
{
$buff = explode($n,$part->headers[$v]);
//error_log(__METHOD__.__LINE__.array2string($buff));
$namepart = array_pop($buff);
//$disposition = array_pop($buff);
//error_log(__METHOD__.__LINE__.$namepart);
$fp = strpos($namepart,'"');
//error_log(__METHOD__.__LINE__.' Start:'.$fp);
if ($fp !== false)
{
$np = strpos($namepart,'"', $fp+1);
//error_log(__METHOD__.__LINE__.' End:'.$np);
if ($np !== false)
{
$filename = trim(substr($namepart,$fp+1,$np-$fp-1));
$filename = $mailObject->EncodeHeader($filename);
if (!empty($filename))
{
if (strpos($part->disposition,';')!==false)
{
//chance is, disposition is broken too
$dbuff = explode(';',$part->disposition);
$part->disposition = trim($dbuff[0]);
}
break 2;
}
}
}
}
}
}
}
if (strlen($filename)==0) $filename = 'noname_'.$attachmentnumber;
//error_log(__METHOD__.__LINE__.' '.$filename);
//echo $part->headers['content-transfer-encoding'].'#<br>';
if ($decode) $part->body = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'));
if ((trim(strtolower($part->disposition))=='attachment' || trim(strtolower($part->disposition)) == 'inline' || isset($part->headers['content-id'])) && $partFetched==false)
{
if (trim(strtolower($part->disposition)) == 'inline' || $part->headers['content-id'])
{
$part->headers['content-id'] = str_replace(array('<','>'),'',$part->headers['content-id']);
$dirname = $this->accountid.'_'.$this->profileID.'_'.$this->sessionData['mailbox'].$part->headers['content-id'];
if (self::$debug) error_log(__METHOD__.__LINE__.' Dirname:'.$dirname);
$dirname = md5($dirname);
$dir = $GLOBALS['egw_info']['server']['temp_dir']."/fmail_import/$dirname";
if (self::$debug) error_log(__METHOD__.__LINE__.' Dir to save attachment to:'.$dir);
if ( !file_exists( "$dir") )
{
@mkdir( $dir, 0700, true );
}
$rp = mail_bo::getRandomString();
file_put_contents( "$dir/$rp$filename", $part->body);
$path = "$dir/$rp$filename";
$mailObject->AddEmbeddedImage($path, $part->headers['content-id'], $filename, ($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'), $part->ctype_primary.'/'.$part->ctype_secondary);
}
else
{
//error_log(__METHOD__.__LINE__.' Add String '.($part->disposition=='attachment'?'Attachment':'Part').' of type:'.$part->ctype_primary.'/'.$part->ctype_secondary);
$mailObject->AddStringAttachment($part->body, //($part->headers['content-transfer-encoding']?base64_decode($part->body):$part->body),
$filename,
($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'),
$part->ctype_primary.'/'.$part->ctype_secondary
);
}
}
if (!(trim(strtolower($part->disposition))=='attachment' || trim(strtolower($part->disposition)) == 'inline' || isset($part->headers['content-id'])) && $partFetched==false)
{
//error_log(__METHOD__.__LINE__.' Add String '.($part->disposition=='attachment'?'Attachment':'Part').' of type:'.$part->ctype_primary.'/'.$part->ctype_secondary.' Body:'.$part->body);
$mailObject->AddStringPart($part->body, //($part->headers['content-transfer-encoding']?base64_decode($part->body):$part->body),
$filename,
($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'),
$part->ctype_primary.'/'.$part->ctype_secondary
);
}
}
}
if ($alternatebodyneeded == false) $mailObject->AltBody = '';
}
}
/**
* Hook stuff
*/

View File

@ -818,14 +818,14 @@ class mail_hooks
{
$file += array(
'_NewLine_' => '', // give a newline
'empty trash' => "javascript:egw_appWindow('".$appname."').mail_emptyTrash();",
'empty trash' => "javascript:app.mail.mail_emptyTrash();",
);
}
if($preferences->preferences['deleteOptions'] == 'mark_as_deleted')
{
$file += array(
'_NewLine_' => '', // give a newline
'compress folder' => "javascript:egw_appWindow('".$appname."').mail_compressFolder();",
'compress folder' => "javascript:app.mail.mail_compressFolder();",
);
}
// import Message link - only when the required library is available

View File

@ -1164,11 +1164,12 @@ unset($query['actions']);
*
* @param string $_folderName, used to ensure the uniqueness of the uid over all folders
* @param string $message_uid, the message_Uid to be used for creating the rowID
* @return string - a colon separated string in the form accountID:profileID:folder:message_uid
* @param boolean $_prependApp, flag to indicate that the app 'mail' is to be used for creating the rowID
* @return string - a colon separated string in the form [app:]accountID:profileID:folder:message_uid
*/
function createRowID($_folderName, $message_uid)
function createRowID($_folderName, $message_uid, $_prependApp=false)
{
return trim($GLOBALS['egw_info']['user']['account_id']).self::$delimiter.$this->mail_bo->profileID.self::$delimiter.base64_encode($_folderName).self::$delimiter.$message_uid;
return ($_prependApp?'mail'.self::$delimiter:'').trim($GLOBALS['egw_info']['user']['account_id']).self::$delimiter.$this->mail_bo->profileID.self::$delimiter.base64_encode($_folderName).self::$delimiter.$message_uid;
}
/**
@ -1181,6 +1182,12 @@ unset($query['actions']);
{
$res = explode(self::$delimiter,$_rowID);
// as a rowID is perceeded by app::, should be mail!
//error_log(__METHOD__.__LINE__.array2string($res).' [0] isInt:'.is_int($res[0]).' [0] isNumeric:'.is_numeric($res[0]).' [0] isString:'.is_string($res[0]));
if (count($res)==4 && is_numeric($res[0]) )
{
// we have an own created rowID; prepend app=mail
array_unshift($res,'mail');
}
return array('app'=>$res[0], 'accountID'=>$res[1], 'profileID'=>$res[2], 'folder'=>base64_decode($res[3]), 'msgUID'=>$res[4]);
}
@ -1542,11 +1549,17 @@ unset($query['actions']);
/**
* display messages
*
* all params are passed as GET Parameters
* all params are passed as GET Parameters, but can be passed via ExecMethod2 as array too
*/
function displayMessage()
function displayMessage($_requesteddata = null)
{
//_debug_array($_REQUEST);
//error_log(__METHOD__.__LINE__.array2string($_requesteddata));
//error_log(__METHOD__.__LINE__.array2string($_REQUEST));
if (!is_null($_requesteddata) && isset($_requesteddata['id']))
{
$rowID = $_requesteddata['id'];
//unset($_REQUEST);
}
if(isset($_GET['id'])) $rowID = $_GET['id'];
if(isset($_GET['part'])) $partID = $_GET['part'];
$htmlOptions = $this->mail_bo->htmlOptions;
@ -1556,7 +1569,7 @@ unset($query['actions']);
$hA = self::splitRowID($rowID);
$uid = $hA['msgUID'];
$mailbox = $hA['folder'];
//error_log(__METHOD__.__LINE__.array2string($hA));
$this->mail_bo->reopen($mailbox);
// retrieve the flags of the message, before touching it.
$headers = $this->mail_bo->getMessageHeader($uid, $partID);
@ -1586,7 +1599,6 @@ unset($query['actions']);
//error_log(__METHOD__.__LINE__.$mailBody);
$this->mail_bo->closeConnection();
$etpl = new etemplate_new('mail.display');
// Set cell attributes directly
/*
$etpl->set_cell_attribute('nm[foldertree]','actions', array(
@ -2686,161 +2698,203 @@ blockquote[type=cite] {
/**
* importMessage
*/
function importMessage($content)
function importMessage($content=null)
{
error_log(array2string($content));
if (!is_array($content)) $content = array();
$etpl = new etemplate_new('mail.importMessage');
$etpl->exec('mail.mail_ui.importMessage',$content,$sel_options,$readonlys,$preserv,2);
/*
if (empty($importtype)) $importtype = htmlspecialchars($_POST["importtype"]);
if (empty($toggleFS)) $toggleFS = htmlspecialchars($_POST["toggleFS"]);
if (empty($importID)) $importID = htmlspecialchars($_POST["importid"]);
if (empty($addFileName)) $addFileName =html::purify($_POST['addFileName']);
if (empty($importtype)) $importtype = 'file';
if (empty($toggleFS)) $toggleFS= false;
if (empty($addFileName)) $addFileName = false;
if ($toggleFS == 'vfs' && $importtype=='file') $importtype='vfs';
if (!$toggleFS && $importtype=='vfs') $importtype='file';
// get passed messages
if (!empty($_GET["msg"])) $alert_message[] = html::purify($_GET["msg"]);
if (!empty($_POST["msg"])) $alert_message[] = html::purify($_POST["msg"]);
unset($_GET["msg"]);
unset($_POST["msg"]);
//_debug_array($alert_message);
//error_log(__METHOD__." called from:".function_backtrace());
$proceed = false;
if(is_array($_FILES["addFileName"]))
//error_log(__METHOD__.__LINE__.$this->mail_bo->getDraftFolder());
if (!empty($content))
{
//error_log(__METHOD__.__LINE__.array2string($content));
$destination = html::purify($content['divImportArea']['FOLDER'][0]?$content['divImportArea']['FOLDER'][0]:'');
$importID = mail_bo::getRandomString();
$importFailed = false;
try
{
//phpinfo();
//error_log(print_r($_FILES,true));
if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) {
$proceed = true;
$formData['name'] = $_FILES['addFileName']['name'];
$formData['type'] = $_FILES['addFileName']['type'];
$formData['file'] = $_FILES['addFileName']['tmp_name'];
$formData['size'] = $_FILES['addFileName']['size'];
}
$messageUid = $this->importMessageToFolder($content['divImportArea']['uploadForImport'],$destination,$importID);
$linkData = array
(
'id' => $this->createRowID($destination, $messageUid, true),
);
}
if ($addFileName && $toggleFS == 'vfs' && $importtype == 'vfs' && $importID)
catch (egw_exception_wrong_userinput $e)
{
$sessionData = $GLOBALS['egw']->session->appsession('compose_session_data_'.$importID, 'felamimail');
//error_log(__METHOD__.__LINE__.array2string($sessionData));
foreach((array)$sessionData['attachments'] as $attachment) {
//error_log(__METHOD__.__LINE__.array2string($attachment));
if ($addFileName == $attachment['name'])
{
$proceed = true;
$formData['name'] = $attachment['name'];
$formData['type'] = $attachment['type'];
$formData['file'] = $attachment['file'];
$formData['size'] = $attachment['size'];
break;
}
}
$importFailed=true;
$content['msg'] = $e->getMessage();
}
if ($proceed === true)
if (!$importFailed)
{
$destination = html::purify($_POST['newMailboxMoveName']?$_POST['newMailboxMoveName']:'');
try
{
$messageUid = $this->importMessageToFolder($formData,$destination,$importID);
$linkData = array
(
'menuaction' => 'felamimail.uidisplay.display',
'uid' => $messageUid,
'mailbox' => base64_encode($destination),
);
}
catch (egw_exception_wrong_userinput $e)
{
$linkData = array
(
'menuaction' => 'felamimail.uifelamimail.importMessage',
'msg' => htmlspecialchars($e->getMessage()),
);
}
egw::redirect_link('/index.php',$linkData);
ExecMethod2('mail.mail_ui.displayMessage',$linkData);
exit;
}
}
if (!is_array($content)) $content = array();
if (empty($content['divImportArea']['FOLDER'])) $content['divImportArea']['FOLDER']=(array)$this->mail_bo->getDraftFolder();
if (!empty($content['divImportArea']['FOLDER'])) $sel_options['FOLDER']=mail_compose::ajax_searchFolder(0,true);
if(!@is_object($GLOBALS['egw']->js))
$etpl = new etemplate_new('mail.importMessage');
$etpl->setElementAttribute('uploadForImport','onFinish','app.mail.uploadForImport');
$etpl->exec('mail.mail_ui.importMessage',$content,$sel_options,$readonlys,$preserv,2);
}
/**
* importMessageToFolder
*
* @param array $_formData Array with information of name, type, file and size
* @param string $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if
* folder is modified
* @param string $importID ID for the imported message, used by attachments to identify them unambiguously
* @return mixed $messageUID or exception
*/
function importMessageToFolder($_formData,&$_folder,$importID='')
{
$importfailed = false;
//error_log(__METHOD__.__LINE__.array2string($_formData));
if (empty($_formData['file'])) $_formData['file'] = $_formData['tmp_name'];
// check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.)
try
{
$tmpFileName = mail_bo::checkFileBasics($_formData,$importID);
}
catch (egw_exception_wrong_userinput $e)
{
$importfailed = true;
$alert_msg .= $e->getMessage();
}
// -----------------------------------------------------------------------
if ($importfailed === false)
{
$mailObject = new egw_mailer();
try
{
$GLOBALS['egw']->js = CreateObject('phpgwapi.javascript');
$this->mail_bo->parseFileIntoMailObject($mailObject,$tmpFileName,$Header,$Body);
}
// this call loads js and css for the treeobject
html::tree(false,false,false,null,'foldertree','','',false,'/',null,false);
$GLOBALS['egw']->common->egw_header();
catch (egw_exception_assertion_failed $e)
{
$importfailed = true;
$alert_msg .= $e->getMessage();
}
//_debug_array($Body);
$this->mail_bo->openConnection();
if (empty($_folder))
{
$importfailed = true;
$alert_msg .= lang("Import of message %1 failed. Destination Folder not set.",$_formData['name']);
}
$delimiter = $this->mail_bo->getHierarchyDelimiter();
if($_folder=='INBOX'.$delimiter) $_folder='INBOX';
if ($importfailed === false)
{
if ($this->mail_bo->folderExists($_folder,true)) {
try
{
$messageUid = $this->mail_bo->appendMessage($_folder,
$Header.$mailObject->LE.$mailObject->LE,
$Body,
$flags);
}
catch (egw_exception_wrong_userinput $e)
{
$importfailed = true;
$alert_msg .= lang("Import of message %1 failed. Could not save message to folder %2 due to: %3",$_formData['name'],$_folder,$e->getMessage());
}
}
else
{
$importfailed = true;
$alert_msg .= lang("Import of message %1 failed. Destination Folder %2 does not exist.",$_formData['name'],$_folder);
}
}
}
// set the url to open when refreshing
if ($importfailed == true)
{
throw new egw_exception_wrong_userinput($alert_msg);
}
else
{
return $messageUid;
}
}
#$uiwidgets =& CreateObject('felamimail.uiwidgets');
/**
* importMessageFromVFS2DraftAndEdit
*
* @param array $formData Array with information of name, type, file and size; file is required,
* name, type and size may be set here to meet the requirements
* Example: $formData['name'] = 'a_email.eml';
* $formData['type'] = 'message/rfc822';
* $formData['file'] = 'vfs://default/home/leithoff/a_email.eml';
* $formData['size'] = 2136;
* @return void
*/
function importMessageFromVFS2DraftAndEdit($formData='')
{
$this->importMessageFromVFS2DraftAndDisplay($formData,'edit');
}
$this->t->set_file(array("importMessage" => "importMessage.tpl"));
$this->t->set_block('importMessage','fileSelector','fileSelector');
$importID =felamimail_bo::getRandomString();
// prepare saving destination of imported message
/**
* importMessageFromVFS2DraftAndDisplay
*
* @param array $formData Array with information of name, type, file and size; file is required,
* name, type and size may be set here to meet the requirements
* Example: $formData['name'] = 'a_email.eml';
* $formData['type'] = 'message/rfc822';
* $formData['file'] = 'vfs://default/home/leithoff/a_email.eml';
* $formData['size'] = 2136;
* @param string $mode mode to open ImportedMessage display and edit are supported
* @return void
*/
function importMessageFromVFS2DraftAndDisplay($formData='',$mode='display')
{
if (empty($formData)) if (isset($_REQUEST['formData'])) $formData = $_REQUEST['formData'];
//error_log(array2string($formData));
$draftFolder = $this->mail_bo->getDraftFolder(false);
$importID = mail_bo::getRandomString();
// name should be set to meet the requirements of checkFileBasics
if (parse_url($formData['file'],PHP_URL_SCHEME) == 'vfs' && (!isset($formData['name']) || empty($formData['name'])))
{
$buff = explode('/',$formData['file']);
$suffix = '';
if (is_array($buff)) $formData['name'] = array_pop($buff); // take the last part as name
}
// type should be set to meet the requirements of checkFileBasics
if (parse_url($formData['file'],PHP_URL_SCHEME) == 'vfs' && (!isset($formData['type']) || empty($formData['type'])))
{
$buff = explode('.',$formData['file']);
$suffix = '';
if (is_array($buff)) $suffix = array_pop($buff); // take the last extension to check with ext2mime
if (!empty($suffix)) $formData['type'] = mime_magic::ext2mime($suffix);
}
// size should be set to meet the requirements of checkFileBasics
if (parse_url($formData['file'],PHP_URL_SCHEME) == 'vfs' && !isset($formData['size']))
{
$formData['size'] = strlen($formData['file']); // set some size, to meet requirements of checkFileBasics
}
try
{
$messageUid = $this->importMessageToFolder($formData,$draftFolder,$importID);
$linkData = array
(
'menuaction' => 'felamimail.uipreferences.listSelectFolder',
'menuaction' => ($mode=='display'?'mail.mail_ui.displayMessage':'mail.mail_compose.composeFromDraft'),
'id' => $this->createRowID($draftFolder,$messageUid,true),
'deleteDraftOnClose' => 1,
);
$this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData));
// messages that may be passed to the Form
if (isset($alert_message) && !empty($alert_message))
if ($mode!='display')
{
$this->t->set_var('messages', implode('; ',$alert_message));
}
else
{
$this->t->set_var('messages','');
unset($linkData['deleteDraftOnClose']);
$linkData['method'] ='importMessageToMergeAndSend';
}
}
catch (egw_exception_wrong_userinput $e)
{
$linkData = array
(
'menuaction' => 'mail.mail_ui.importMessage',
'msg' => htmlspecialchars($e->getMessage()),
);
}
egw::redirect_link('/index.php',$linkData);
exit;
// preset for saving destination, we use draftfolder
$savingDestination = $this->mail_bo->getDraftFolder();
$this->t->set_var('mailboxNameShort', $savingDestination);
$this->t->set_var('importtype', $importtype);
$this->t->set_var('importid', $importID);
if ($toggleFS) $this->t->set_var('toggleFS_preset','checked'); else $this->t->set_var('toggleFS_preset','');
$this->translate();
$linkData = array
(
'menuaction' => 'mail.mail_ui.importMessage',
);
$this->t->set_var('file_selector_url', $GLOBALS['egw']->link('/index.php',$linkData));
$this->t->set_var('vfs_selector_url', egw::link('/index.php',array(
'menuaction' => 'filemanager.filemanager_select.select',
'mode' => 'open-multiple',
'method' => 'felamimail.uifelamimail.selectFromVFS',
'id' => $importID,
'label' => lang('Attach'),
)));
if ($GLOBALS['egw_info']['user']['apps']['filemanager'] && $importtype == 'vfs')
{
$this->t->set_var('vfs_attach_button','
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a onclick="fm_import_displayVfsSelector();" title="'.htmlspecialchars(lang('filemanager')).'">
<img src="'.html::image('filemanager','navbar').'" height="18">
</a>&nbsp;&nbsp;&nbsp;&nbsp;');
$this->t->set_var('filebox_readonly','readonly="readonly"');
}
else
{
$this->t->set_var('vfs_attach_button','');
$this->t->set_var('filebox_readonly','');
}
$maxUploadSize = ini_get('upload_max_filesize');
$this->t->set_var('max_uploadsize', $maxUploadSize);
$this->t->set_var('ajax-loader', html::image('felamimail','ajax-loader'));
$this->t->pparse("out","fileSelector");
*/
}
/**

View File

@ -88,6 +88,16 @@ app.mail = AppJS.extend(
var subject = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mail_displaysubject');
var body = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mail_displaybody');
body.node.parentNode.style.top=subject.node.offsetTop+40+'px';
var app_registry = egw.link_get_registry(this.appname);
//console.log(app_registry);
w=850;
if (typeof app_registry['view'] != 'undefined' && typeof app_registry['view_popup'] != 'undefined' )
{
var w_h =app_registry['view_popup'].split('x');
if (w_h[1] == 'egw_getWindowOuterHeight()') w_h[1] = (screen.availHeight>egw_getWindowOuterHeight()?screen.availHeight:egw_getWindowOuterHeight());
}
//alert('resizing to'+(w_h[0]?w_h[0]:850)+','+(w_h[1]?w_h[1]:egw_getWindowOuterHeight()));
window.resizeTo((w_h[0]?w_h[0]:850),(w_h[1]?w_h[1]:(screen.availHeight>egw_getWindowOuterHeight()?screen.availHeight:egw_getWindowOuterHeight())));
}
},
@ -1171,17 +1181,20 @@ app.mail = AppJS.extend(
*/
uploadForImport: function(_event, _file_count, _path)
{
console.log(_event,_file_count,_path);
//console.log(_event,_file_count,_path);
// path is probably not needed when uploading for file; maybe it is when from vfs
if(typeof _path == 'undefined')
{
//_path = this.get_path();
}
if (_file_count && !jQuery.isEmptyObject(_event.data.getValue()))
{
// var widget = _event.data;
// var request = new egw_json_request('filemanager_ui::ajax_action', ['upload', widget.getValue(), _path], this);
var widget = _event.data;
//console.log(widget.getValue());
// var request = new egw_json_request('mail_ui::ajax_importMessage', ['upload', widget.getValue(), _path], this);
// widget.set_value('');
// request.sendRequest(false, this._upload_callback, this);
// request.sendRequest();//false, this._upload_callback, this);
this.et2_obj.submit();
}
},

View File

@ -2,12 +2,13 @@
<!-- $Id$ -->
<overlay>
<template id="mail.importMessage" template="" lang="" group="0" version="1.9.001">
<vbox id ="divImportArea">
<html id="msg"/>
<vbox id="divImportArea">
<hbox span="all">
<description value="Store to Folder"/>
<taglist id="FOLDER" width="50%" autocomplete_url='mail.mail_compose.ajax_searchFolder' autocomplete_params='' maxSelection="1" allowFreeEntries="false" onclick="app.mail.address_click"/>
</hbox>
<file statustext="Select file to import into Folder" onFinish="app.mail.uploadForImport" mime="message/rfc822" id="uploadForImport" drop_target ="mail-importMessage_divImportArea"/>
<file statustext="Select file to import into Folder" onFinish="app.mail.uploadForImport" mime="/^message\//i" id="uploadForImport" drop_target ="mail-importMessage_divImportArea"/>
</vbox>>
</template>
</overlay>