/**
  * Returns the message body for a required format
  *
  * @param MAPIMessage       $mapimessage
  * @param int               $bpReturnType
  * @param SyncObject        $message
  *
  * @access private
  * @return boolean
  */
 private function setMessageBodyForType($mapimessage, $bpReturnType, &$message)
 {
     //default value is PR_BODY
     $property = PR_BODY;
     switch ($bpReturnType) {
         case SYNC_BODYPREFERENCE_HTML:
             $property = PR_HTML;
             break;
         case SYNC_BODYPREFERENCE_RTF:
             $property = PR_RTF_COMPRESSED;
             break;
         case SYNC_BODYPREFERENCE_MIME:
             $stat = $this->imtoinet($mapimessage, $message);
             if (isset($message->asbody)) {
                 $message->asbody->type = $bpReturnType;
             }
             return $stat;
     }
     $body = mapi_message_openproperty($mapimessage, $property);
     //set the properties according to supported AS version
     if (Request::GetProtocolVersion() >= 12.0) {
         $message->asbody = new SyncBaseBody();
         $message->asbody->type = $bpReturnType;
         if ($bpReturnType == SYNC_BODYPREFERENCE_RTF) {
             $message->asbody->data = base64_encode($body);
         } elseif (isset($message->internetcpid) && $bpReturnType == SYNC_BODYPREFERENCE_HTML) {
             $message->asbody->data = Utils::ConvertCodepageStringToUtf8($message->internetcpid, $body);
         } else {
             $message->asbody->data = w2u($body);
         }
         $message->asbody->estimatedDataSize = strlen($message->asbody->data);
     } else {
         $message->body = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
         $message->bodysize = strlen($message->body);
         $message->bodytruncated = 0;
     }
     return true;
 }
 /**
  * Function which clones current occurrence and sets appropriate properties.
  * The original recurring item is moved to next occurrence.
  *@param boolean $markComplete true if existing occurrence has to be mark complete else false.
  */
 function regenerateTask($markComplete)
 {
     // Get all properties
     $taskItemProps = mapi_getprops($this->message);
     if (isset($this->action["subject"])) {
         $taskItemProps[$this->proptags["subject"]] = $this->action["subject"];
     }
     if (isset($this->action["importance"])) {
         $taskItemProps[$this->proptags["importance"]] = $this->action["importance"];
     }
     if (isset($this->action["startdate"])) {
         $taskItemProps[$this->proptags["startdate"]] = $this->action["startdate"];
         $taskItemProps[$this->proptags["commonstart"]] = $this->action["startdate"];
     }
     if (isset($this->action["duedate"])) {
         $taskItemProps[$this->proptags["duedate"]] = $this->action["duedate"];
         $taskItemProps[$this->proptags["commonend"]] = $this->action["duedate"];
     }
     $folder = mapi_msgstore_openentry($this->store, $taskItemProps[PR_PARENT_ENTRYID]);
     $newMessage = mapi_folder_createmessage($folder);
     $taskItemProps[$this->proptags["status"]] = $markComplete ? olTaskComplete : olTaskNotStarted;
     $taskItemProps[$this->proptags["complete"]] = $markComplete;
     $taskItemProps[$this->proptags["percent_complete"]] = $markComplete ? 1 : 0;
     // This occurrence has been marked as 'Complete' so disable reminder
     if ($markComplete) {
         $taskItemProps[$this->proptags["reset_reminder"]] = false;
         $taskItemProps[$this->proptags["reminder"]] = false;
         $taskItemProps[$this->proptags["datecompleted"]] = $this->action["datecompleted"];
         unset($this->action[$this->proptags['datecompleted']]);
     }
     // Recurrence ends for this item
     $taskItemProps[$this->proptags["dead_occurrence"]] = true;
     $taskItemProps[$this->proptags["task_f_creator"]] = true;
     //OL props
     $taskItemProps[$this->proptags["side_effects"]] = 1296;
     $taskItemProps[$this->proptags["icon_index"]] = 1280;
     // Copy recipients
     $recipienttable = mapi_message_getrecipienttable($this->message);
     $recipients = mapi_table_queryallrows($recipienttable, array(PR_ENTRYID, PR_DISPLAY_NAME, PR_EMAIL_ADDRESS, PR_RECIPIENT_ENTRYID, PR_RECIPIENT_TYPE, PR_SEND_INTERNET_ENCODING, PR_SEND_RICH_INFO, PR_RECIPIENT_DISPLAY_NAME, PR_ADDRTYPE, PR_DISPLAY_TYPE, PR_RECIPIENT_TRACKSTATUS, PR_RECIPIENT_TRACKSTATUS_TIME, PR_RECIPIENT_FLAGS, PR_ROWID));
     $copy_to_recipientTable = mapi_message_getrecipienttable($newMessage);
     $copy_to_recipientRows = mapi_table_queryallrows($copy_to_recipientTable, array(PR_ROWID));
     foreach ($copy_to_recipientRows as $recipient) {
         mapi_message_modifyrecipients($newMessage, MODRECIP_REMOVE, array($recipient));
     }
     mapi_message_modifyrecipients($newMessage, MODRECIP_ADD, $recipients);
     // Copy attachments
     $attachmentTable = mapi_message_getattachmenttable($this->message);
     if ($attachmentTable) {
         $attachments = mapi_table_queryallrows($attachmentTable, array(PR_ATTACH_NUM, PR_ATTACH_SIZE, PR_ATTACH_LONG_FILENAME, PR_ATTACHMENT_HIDDEN, PR_DISPLAY_NAME, PR_ATTACH_METHOD));
         foreach ($attachments as $attach_props) {
             $attach_old = mapi_message_openattach($this->message, (int) $attach_props[PR_ATTACH_NUM]);
             $attach_newResourceMsg = mapi_message_createattach($newMessage);
             mapi_copyto($attach_old, array(), array(), $attach_newResourceMsg, 0);
             mapi_savechanges($attach_newResourceMsg);
         }
     }
     mapi_setprops($newMessage, $taskItemProps);
     mapi_savechanges($newMessage);
     // Update body of original message
     $msgbody = mapi_message_openproperty($this->message, PR_BODY);
     $msgbody = trim($this->windows1252_to_utf8($msgbody), "");
     $separator = "------------\r\n";
     if (!empty($msgbody) && strrpos($msgbody, $separator) === false) {
         $msgbody = $separator . $msgbody;
         $stream = mapi_openpropertytostream($this->message, PR_BODY, MAPI_CREATE | MAPI_MODIFY);
         mapi_stream_setsize($stream, strlen($msgbody));
         mapi_stream_write($stream, $msgbody);
         mapi_stream_commit($stream);
     }
     // We need these properties to notify client
     return mapi_getprops($newMessage, array(PR_ENTRYID, PR_PARENT_ENTRYID, PR_STORE_ENTRYID));
 }
示例#3
0
/**
 * Read the correct message body 
 *
 * @param ressource $msg - the message
**/
function eml_ReadMessage($msg)
{
    global $protocolversion;
    $rtf = mapi_message_openproperty($msg, PR_RTF_COMPRESSED);
    if (!$rtf) {
        $body = mapi_message_openproperty($msg, PR_BODY);
        $content = "text/plain";
    } else {
        $rtf = preg_replace("/(\n.*)/m", "", mapi_decompressrtf($rtf));
        if (strpos($rtf, "\\fromtext") != false || !($protocolversion >= 2.5)) {
            $body = mapi_message_openproperty($msg, PR_BODY);
            $content = "text/plain";
        } else {
            $body = mapi_message_openproperty($msg, PR_HTML);
            $content = "text/html";
        }
    }
    if (mb_detect_encoding($body) != "UTF-8") {
        $body = w2ui($body);
    }
    return array('body' => $body, 'content' => $content);
}
 /** Adds task details to message body and returns body.
  *
  *@return string contructed body with task details.
  */
 function getBody()
 {
     //@TODO: Fix translations
     $msgProps = mapi_getprops($this->message);
     $body = "";
     if (isset($msgProps[PR_SUBJECT])) {
         $body .= "\n" . _("Subject") . ":\t" . $msgProps[PR_SUBJECT];
     }
     if (isset($msgProps[$this->props['startdate']])) {
         $body .= "\n" . _("Start Date") . ":\t" . strftime(_("%A, %B %d, %Y"), $msgProps[$this->props['startdate']]);
     }
     if (isset($msgProps[$this->props['duedate']])) {
         $body .= "\n" . _("Due Date") . ":\t" . strftime(_("%A, %B %d, %Y"), $msgProps[$this->props['duedate']]);
     }
     $body .= "\n";
     if (isset($msgProps[$this->props['status']])) {
         $body .= "\n" . _("Status") . ":\t";
         if ($msgProps[$this->props['status']] == 0) {
             $body .= _("Not Started");
         } else {
             if ($msgProps[$this->props['status']] == 1) {
                 $body .= _("In Progress");
             } else {
                 if ($msgProps[$this->props['status']] == 2) {
                     $body .= _("Complete");
                 } else {
                     if ($msgProps[$this->props['status']] == 3) {
                         $body .= _("Wait for other person");
                     } else {
                         if ($msgProps[$this->props['status']] == 4) {
                             $body .= _("Deferred");
                         }
                     }
                 }
             }
         }
     }
     if (isset($msgProps[$this->props['percent_complete']])) {
         $body .= "\n" . _("Percent Complete") . ":\t" . $msgProps[$this->props['percent_complete']] * 100 . '%';
         if ($msgProps[$this->props['percent_complete']] == 1 && isset($msgProps[$this->props['datecompleted']])) {
             $body .= "\n" . _("Date Completed") . ":\t" . strftime("%A, %B %d, %Y", $msgProps[$this->props['datecompleted']]);
         }
     }
     $body .= "\n";
     if (isset($msgProps[$this->props['totalwork']])) {
         $body .= "\n" . _("Total Work") . ":\t" . $msgProps[$this->props['totalwork']] / 60 . " " . _("hours");
     }
     if (isset($msgProps[$this->props['actualwork']])) {
         $body .= "\n" . _("Actual Work") . ":\t" . $msgProps[$this->props['actualwork']] / 60 . " " . _("hours");
     }
     $body .= "\n";
     if (isset($msgProps[$this->props['owner']])) {
         $body .= "\n" . _("Owner") . ":\t" . $msgProps[$this->props['owner']];
     }
     $body .= "\n";
     if (isset($msgProps[$this->props['categories']]) && !empty($msgProps[$this->props['categories']])) {
         $body .= "\nCategories:\t" . implode(', ', $msgProps[$this->props['categories']]);
     }
     if (isset($msgProps[$this->props['companies']]) && !empty($msgProps[$this->props['companies']])) {
         $body .= "\nCompany:\t" . implode(', ', $msgProps[$this->props['companies']]);
     }
     if (isset($msgProps[$this->props['billinginformation']])) {
         $body .= "\n" . _("Billing Information") . ":\t" . $msgProps[$this->props['billinginformation']];
     }
     if (isset($msgProps[$this->props['mileage']])) {
         $body .= "\n" . _("Mileage") . ":\t" . $msgProps[$this->props['mileage']];
     }
     $body .= "\n";
     $content = mapi_message_openproperty($this->message, PR_BODY);
     $body .= "\n" . trim($content, "");
     return $body;
 }
示例#5
0
 function _getEmail($mapimessage, $truncsize, $bodypreference, $optionbodypreference, $mimesupport = 0)
 {
     $messageprops = mapi_getprops($mapimessage, array(PR_MESSAGE_CLASS, PR_LAST_VERB_EXECUTED, PR_LAST_VERB_EXECUTION_TIME, PR_CONVERSATION_INDEX));
     // Destinguish between SMS and eMail Messages. In case we have an SMS to sync
     // we need a SyncSMS Object that is in real a very much castrated SyncMail Object...
     // We even could create a separate _get function BUT since its Folderclass is email it
     // makes things easier to work just with one function. Except the Address Handling and
     // less fields everything else remains the same
     if (strtolower($messageprops[PR_MESSAGE_CLASS]) == 'ipm.note.mobile.sms') {
         $message = new SyncSMS();
         if (isset($optionbodypreference) && $optionbodypreference != false) {
             $bodypreference = $optionbodypreference;
         }
     } else {
         $message = new SyncMail();
     }
     if (isset($messageprops[PR_LAST_VERB_EXECUTED])) {
         switch ($messageprops[PR_LAST_VERB_EXECUTED]) {
             case 0x66:
                 $message->lastverbexecuted = 1;
                 break;
             case 0x67:
                 $message->lastverbexecuted = 2;
                 break;
             case 0x68:
                 $message->lastverbexecuted = 3;
                 break;
             default:
                 $message->lastverbexecuted = 0;
         }
         $message->lastverbexecutiontime = $messageprops[PR_LAST_VERB_EXECUTION_TIME];
     } else {
         $message->lastverbexecuted = 0;
     }
     $this->_getPropsFromMAPI($message, $mapimessage, $this->_emailmapping);
     // start added dw2412 AS V12.0 Flag support
     // should not break anything since in proto AS12 Fields get excluded in case a lower protocol is in use
     $message->poommailflag = new SyncPoommailFlag();
     $this->_getPropsFromMAPI($message->poommailflag, $mapimessage, $this->_emailflagmapping);
     if (!isset($message->poommailflag->flagstatus)) {
         $message->poommailflag->flagstatus = 0;
     }
     // end added dw2412 AS V12.0 Flag Support
     // dw2412 According to docs...
     if (!isset($message->contentclass) || $message->contentclass == "") {
         $message->contentclass = "urn:content-classes:message";
     }
     // Override 'body' for truncation
     // START CHANGED dw2412 Support Protocol Version 12 (added bodypreference compare)
     // We never the less transfer always UTF-8 so it should not matter to hardcode the internet cpid...
     // Other possible values are
     //
     // Name	                             Character Set   Code Page
     // Arabic (ISO)                      iso-8859-6      28596
     // Arabic (Windows)                  windows-1256    1256
     // Baltic (ISO)                      iso-8859-4      28594
     // Baltic (Windows)                  windows-1257    1257
     // Central European (ISO)            iso-8859-2      28592
     // Central European (Windows)        windows-1250    1250
     // Chinese Simplified (GB2312)       gb2312          936
     // Chinese Simplified (HZ)           hz-gb-2312      52936
     // Chinese Traditional (Big5)        big5            950
     // Cyrillic (ISO)                    iso-8859-5      28595
     // Cyrillic (KOI8-R)                 koi8-r          20866
     // Cyrillic (KOI8-U)                 koi8-u          21866
     // Cyrillic (Windows)                windows-1251    1251
     // Greek (ISO)                       iso-8859-7      28597
     // Greek (Windows)                   windows-1253    1253
     // Hebrew (ISO-Logical)              iso-8859-8-i    38598
     // Hebrew (Windows)                  windows-1255    1255
     // Japanese (EUC)                    euc-jp          51932
     // Japanese (JIS)                    iso-2022-jp     50220
     // Japanese (JIS-Allow 1 byte Kana)  csISO2022JP     50221
     // Japanese (Shift-JIS)              iso-2022-jp     932
     // Korean                            ks_c_5601-1987  949
     // Korean (EUC)                      euc-kr          51949
     // Latin 3 (ISO)                     iso-8859-3      28593
     // Latin 9 (ISO)                     iso-8859-15     28605
     // Thai (Windows)                    windows-874     874
     // Turkish (ISO)                     iso-8859-9      28599
     // Turkish (Windows)                 windows-1254    1254
     // Unicode (UTF-7)                   utf-7           65000
     // Unicode (UTF-8)                   utf-8           65001
     // US-ASCII                          us-ascii        20127
     // Vietnamese (Windows)              windows-1258    1258
     // Western European (ISO)            iso-8859-1      28591
     // Western European (Windows)        Windows-1252    1252
     //
     // For Compatibility with older Mailsystems
     //
     // Name	                             Character Set   Code Page
     // Arabic (Windows)                  windows-1256    1256
     // Baltic (ISO)                      iso-8859-4      28594
     // Central European (ISO)            iso-8859-2      28592
     // Chinese Simplified (GB2312)       gb2312          936
     // Chinese Traditional (Big5)        big5            950
     // Cyrillic (KOI8-R)                 koi8-r          20866
     // Cyrillic (Windows)                windows-1251    1251
     // Greek (ISO)                       iso-8859-7      28597
     // Hebrew (Windows)                  windows-1255    1255
     // Japanese (JIS)                    iso-2022-jp     50220
     // Korean                            ks_c_5601-1987  949
     // Thai (Windows)                    windows-874     874
     // Turkish (ISO)                     iso-8859-9      28599
     // Unicode (UTF-8)                   utf-8           65001
     // US-ASCII                          us-ascii        20127
     // Vietnamese (Windows)              windows-1258    1258
     // Western European (ISO)            iso-8859-1      28591
     if (!isset($message->internetcpid) || $message->internetcpid == "") {
         $message->internetcpid = 65001;
     }
     debugLog("_getemail: MimeSupport is " . $mimesupport);
     if ($bodypreference == false) {
         $body = mapi_openproperty($mapimessage, PR_BODY);
         $bodysize = strlen($body);
         if ($bodysize > $truncsize) {
             $body = substr($body, 0, $truncsize);
             $message->bodysize = $bodysize;
             $message->bodytruncated = 1;
         } else {
             $message->bodytruncated = 0;
         }
         $message->body = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
         if (!isset($message->body) || strlen($message->body) == 0) {
             $message->body = " ";
         }
     } else {
         $rtf = mapi_message_openproperty($mapimessage, PR_RTF_COMPRESSED);
         if (!$rtf) {
             $message->airsyncbasenativebodytype = 1;
         } else {
             $rtf = preg_replace("/(\n.*)/m", "", mapi_decompressrtf($rtf));
             if (strpos($rtf, "\\fromtext") != false) {
                 $message->airsyncbasenativebodytype = 1;
             } else {
                 $message->airsyncbasenativebodytype = 2;
             }
         }
         if (!isset($bodypreference[1]["TruncationSize"])) {
             $bodypreference[1]["TruncationSize"] = 1024 * 1024;
         }
         if (isset($bodypreference[4]) && function_exists("mapi_inetmapi_imtoinet") && (!defined('ICS_IMTOINET_SEGFAULT') || ICS_IMTOINET_SEGFAULT === false)) {
             $addrBook = mapi_openaddressbook($this->_session);
             $mstream = mapi_inetmapi_imtoinet($this->_session, $addrBook, $mapimessage, array());
             $mstreamstat = mapi_stream_stat($mstream);
         }
         $message->airsyncbasebody = new SyncAirSyncBaseBody();
         debugLog("airsyncbasebody!");
         if (isset($bodypreference[4]) && isset($mstream) && ($mimesupport == 2 || $mimesupport == 1 && strtolower(substr($messageprops[PR_MESSAGE_CLASS], 0, 14)) == 'ipm.note.smime')) {
             $mstreamcontent = mapi_stream_read($mstream, MAX_EMBEDDED_SIZE);
             $message->airsyncbasebody->type = 4;
             if (isset($bodypreference[4]["TruncationSize"])) {
                 $hdrend = strpos("\r\n\r\n", $mstreamcontent);
                 $message->airsyncbasebody->data = substr($mstreamcontent, 0, $hdrend + $bodypreference[4]["TruncationSize"]);
             } else {
                 $message->airsyncbasebody->data = $mstreamcontent;
             }
             if (strlen($message->airsyncbasebody->data) < $mstreamstat["cb"]) {
                 $message->airsyncbasebody->truncated = 1;
             }
             $message->airsyncbasebody->estimateddatasize = strlen($mstreamcontent);
         } elseif (isset($bodypreference[3]) && $message->airsyncbasenativebodytype == 3) {
             $message->airsyncbasebody->type = 3;
             $rtf = mapi_openproperty($mapimessage, PR_RTF_COMPRESSED);
             $message->airsyncbasebody->data = base64_encode($rtf);
             $message->airsyncbasebody->estimateddatasize = strlen($rtf);
             debugLog("RTF Body!");
         } elseif (isset($bodypreference[2])) {
             $message->airsyncbasebody->type = 2;
             $html = mapi_openproperty($mapimessage, PR_HTML);
             if (strpos(strtoupper($html), "<HTML>") == 0 && strpos(strtoupper($html), "<HEAD>") == 0 && strpos(strtoupper($html), "<BODY>") == 0) {
                 debugLog("Malformed html message, (HTML, HEAD, BODY missing");
                 $html = '<HTML>' . '<HEAD>' . '<META NAME="Generator" CONTENT="Z-Push">' . '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">' . '</HEAD>' . '<BODY>' . iconv(getCodepageCharset($message->internetcpid), "utf-8", $html) . '</BODY></HTML>';
                 $message->internetcpid = 65001;
             } else {
                 if ($message->internetcpid != 65001) {
                     $html = iconv(getCodepageCharset($message->internetcpid), "utf-8", $html);
                 }
             }
             /* This should be removed 110422
             			if ($message->airsyncbasenativebodytype==2) {
             			    $html = mapi_openproperty($mapimessage, PR_HTML);
             			} else {
             			    $html = '<html>'.
             				    '<head>'.
             				    '<meta name="Generator" content="Z-Push">'.
             				    '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'.
             				    '</head>'.
             				    '<body>'.
             				    str_replace("\n","<BR>",str_replace("\r","<BR>", str_replace("\r\n","<BR>",mapi_openproperty($mapimessage, PR_BODY)))).
             				    '</body>'.
             				    '</html>';
             			}
             */
             $message->airsyncbasebody->estimateddatasize = strlen($html);
             if (isset($bodypreference[2]["TruncationSize"]) && strlen($html) > $bodypreference[2]["TruncationSize"]) {
                 $html = substr($html, 0, $bodypreference[2]["TruncationSize"]);
                 $message->airsyncbasebody->truncated = 1;
             }
             $message->airsyncbasebody->data = w2u($html);
             debugLog("HTML Body!");
         } else {
             $body = mapi_openproperty($mapimessage, PR_BODY);
             $message->airsyncbasebody->estimateddatasize = strlen($body);
             $message->airsyncbasebody->type = 1;
             if (isset($bodypreference[1]["TruncationSize"]) && strlen($body) > $bodypreference[1]["TruncationSize"]) {
                 $body = substr($body, 0, $bodypreference[1]["TruncationSize"]);
                 $message->airsyncbasebody->truncated = 1;
             }
             $message->airsyncbasebody->data = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
             debugLog("Plain Body!");
         }
         if (isset($bodypreference[1]["Preview"])) {
             $body = mapi_openproperty($mapimessage, PR_BODY);
             $body = substr($body, 0, $bodypreference[1]["Preview"]);
             //		    $message->airsyncbasebody->preview = 1;
             $message->airsyncbasebody->preview = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
             //			unset($message->airsyncbasebody->data);
         }
         $message->md5body = md5(mapi_openproperty($mapimessage, PR_BODY));
         if (!isset($message->airsyncbasebody->data) || strlen($message->airsyncbasebody->data) == 0) {
             $message->airsyncbasebody->data = " ";
         }
     }
     // END CHANGED dw2412 Support Protocol Version 12 (added bodypreference compare)
     // Override 'From' to show "Full Name <*****@*****.**>"
     // CHANGED dw2412 to honor the Reply-To Information in messages
     //		setlocale(LC_CTYPE,'en_US.utf-8');
     $messageprops = mapi_getprops($mapimessage, array(PR_SENT_REPRESENTING_NAME, PR_SENT_REPRESENTING_ENTRYID, PR_SOURCE_KEY, PR_REPLY_RECIPIENT_ENTRIES, PR_SENDER_NAME, PR_SENDER_ENTRYID, PR_RECEIVED_BY_NAME, PR_DISPLAY_TO, PR_DISPLAY_CC));
     if (isset($messageprops[PR_SOURCE_KEY])) {
         $sourcekey = $messageprops[PR_SOURCE_KEY];
     } else {
         return false;
     }
     $fromname = $fromaddr = "";
     if ($message->messageclass == "IPM.Note.Mobile.SMS") {
         if (isset($messageprops[PR_SENT_REPRESENTING_NAME])) {
             $fromname = $messageprops[PR_SENT_REPRESENTING_NAME];
         }
         if (isset($messageprops[PR_SENT_REPRESENTING_ENTRYID])) {
             $fromaddr = $this->_getMobileAddressFromEntryID($messageprops[PR_SENT_REPRESENTING_ENTRYID]);
         }
         if ($fromname == $fromaddr) {
             $fromname = "";
         }
         if ($fromname) {
             $from = "\"" . w2u($fromname) . "\" [MOBILE:" . w2u($fromaddr) . "]";
         } else {
             $from = "\"" . w2u($fromaddr) . "\" [MOBILE:" . w2u($fromaddr) . "]";
         }
         //changed dw2412 to get rid at HTC Mail (Android) from error message... Not nice but effective...
     } else {
         if (isset($messageprops[PR_SENT_REPRESENTING_NAME])) {
             $fromname = $messageprops[PR_SENT_REPRESENTING_NAME];
         }
         if (isset($messageprops[PR_SENT_REPRESENTING_ENTRYID])) {
             $fromaddr = $this->_getSMTPAddressFromEntryID($messageprops[PR_SENT_REPRESENTING_ENTRYID]);
         }
         if ($fromname == $fromaddr) {
             $fromname = "";
         }
         if ($fromname) {
             $from = "\"" . w2u($fromname) . "\" <" . w2u($fromaddr) . ">";
         } else {
             $from = "\"" . w2u($fromaddr) . "\" <" . w2u($fromaddr) . ">";
         }
         //changed dw2412 to get rid at HTC Mail (Android) from error message... Not nice but effective...
         if (isset($messageprops[PR_SENDER_NAME])) {
             $sendername = $messageprops[PR_SENDER_NAME];
         }
         if (isset($messageprops[PR_SENDER_ENTRYID])) {
             $senderaddr = $this->_getSMTPAddressFromEntryID($messageprops[PR_SENDER_ENTRYID]);
         }
     }
     if (isset($senderaddr) && $fromaddr != $senderaddr) {
         $message->sender = isset($sendername) ? $sendername : $senderaddr;
     }
     $message->from = $from;
     // START DETECTING BCC Received
     if (isset($messageprops[PR_RECEIVED_BY_NAME])) {
         debugLog($messageprops[PR_DISPLAY_TO] . "|" . $messageprops[PR_DISPLAY_CC] . "|" . $messageprops[PR_RECEIVED_BY_NAME]);
         if (strpos($messageprops[PR_DISPLAY_CC], $messageprops[PR_RECEIVED_BY_NAME]) === false && strpos($messageprops[PR_DISPLAY_TO], $messageprops[PR_RECEIVED_BY_NAME]) === false) {
             $message->receivedasbcc = true;
         }
     }
     // START ADDED dw2412 to honor reply to address
     if (isset($messageprops[PR_REPLY_RECIPIENT_ENTRIES])) {
         $replyto = $this->_readReplyRecipientEntry($messageprops[PR_REPLY_RECIPIENT_ENTRIES]);
         foreach ($replyto as $value) {
             $message->reply_to .= $value['email_address'] . ";";
         }
         $message->reply_to = substr($message->reply_to, 0, strlen($message->reply_to) - 1);
     }
     // END ADDED dw2412 to honor reply to address
     // START ADDED dw2412 conversation index
     $messageprops = mapi_getprops($mapimessage, array(PR_CONVERSATION_INDEX));
     if (CONVERSATIONINDEX == true) {
         if (isset($messageprops[PR_CONVERSATION_INDEX]) && strlen($messageprops[PR_CONVERSATION_INDEX]) >= 22) {
             $tmp = $messageprops[PR_CONVERSATION_INDEX];
             $convid = substr($tmp, 6, 16);
             $convindex = substr($tmp, 0, 22);
             $tmp = substr($messageprops[PR_CONVERSATION_INDEX], 22, strlen($messageprops[PR_CONVERSATION_INDEX] - 22));
             while (strlen($tmp) > 0) {
                 $convindex .= substr($tmp, 0, 5);
                 $tmp = substr($tmp, 5, strlen($tmp) - 5);
             }
         } else {
             debugLog("New conversation Index");
             $ci = new ConversationIndex();
             $ci->Create();
             $tmp = $ci->Encode();
             $convid = substr($tmp, 6, 16);
             $convindex = substr($tmp, 0, 22);
         }
         $message->conversationid = $convid;
         $message->conversationindex = $convindex;
     }
     // END ADDED dw2412 conversation index
     // process Meeting Requests
     if (isset($message->messageclass) && strpos($message->messageclass, "IPM.Schedule.Meeting") === 0) {
         $message->meetingrequest = new SyncMeetingRequest();
         $this->_getPropsFromMAPI($message->meetingrequest, $mapimessage, $this->_meetingrequestmapping);
         $goidtag = $this->_getPropIdFromString("PT_BINARY:{6ED8DA90-450B-101B-98DA-00AA003F1305}:0x3");
         $timezonetag = $this->_getPropIDFromString("PT_BINARY:{00062002-0000-0000-C000-000000000046}:0x8233");
         $recReplTime = $this->_getPropIDFromString("PT_SYSTIME:{00062002-0000-0000-C000-000000000046}:0x8228");
         $isrecurringtag = $this->_getPropIDFromString("PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0x8223");
         $recurringstate = $this->_getPropIDFromString("PT_BINARY:{00062002-0000-0000-C000-000000000046}:0x8216");
         $appSeqNr = $this->_getPropIDFromString("PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8201");
         $lidIsException = $this->_getPropIDFromString("PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0xA");
         $recurStartTime = $this->_getPropIDFromString("PT_LONG:{6ED8DA90-450B-101B-98DA-00AA003F1305}:0xE");
         $props = mapi_getprops($mapimessage, array($goidtag, $timezonetag, $recReplTime, $isrecurringtag, $recurringstate, $appSeqNr, $lidIsException, $recurStartTime));
         // Get the GOID
         if (isset($props[$goidtag])) {
             $message->meetingrequest->globalobjid = base64_encode($props[$goidtag]);
         }
         // Set Timezone
         if (isset($props[$timezonetag])) {
             $tz = $this->_getTZFromMAPIBlob($props[$timezonetag]);
         } else {
             $tz = $this->_getGMTTZ();
         }
         $message->meetingrequest->timezone = base64_encode($this->_getSyncBlobFromTZ($tz));
         // send basedate if exception
         if (isset($props[$recReplTime]) || isset($props[$lidIsException]) && $props[$lidIsException] == true) {
             if (isset($props[$recReplTime])) {
                 $basedate = $props[$recReplTime];
                 $message->meetingrequest->recurrenceid = $this->_getGMTTimeByTZ($basedate, $this->_getGMTTZ());
             } else {
                 if (!isset($props[$goidtag]) || !isset($props[$recurStartTime]) || !isset($props[$timezonetag])) {
                     debugLog("Missing property to set correct basedate for exception");
                 } else {
                     $basedate = extractBaseDate($props[$goidtag], $props[$recurStartTime]);
                     $message->meetingrequest->recurrenceid = $this->_getGMTTimeByTZ($basedate, $tz);
                 }
             }
         }
         // Organizer is the sender
         $message->meetingrequest->organizer = $message->from;
         // Process recurrence
         if (isset($props[$isrecurringtag]) && $props[$isrecurringtag]) {
             $myrec = new SyncMeetingRequestRecurrence();
             // get recurrence -> put $message->meetingrequest as message so the 'alldayevent' is set correctly
             $this->_getRecurrence($mapimessage, $props, $message->meetingrequest, $myrec, $tz);
             $message->meetingrequest->recurrences = array($myrec);
         }
         // Force the 'alldayevent' in the object at all times. (non-existent == 0)
         if (!isset($message->meetingrequest->alldayevent) || $message->meetingrequest->alldayevent == "") {
             $message->meetingrequest->alldayevent = 0;
         }
         // Instancetype
         // 0 = single appointment
         // 1 = master recurring appointment
         // 2 = single instance of recurring appointment
         // 3 = exception of recurring appointment
         $message->meetingrequest->instancetype = 0;
         if (isset($props[$isrecurringtag]) && $props[$isrecurringtag] == 1) {
             $message->meetingrequest->instancetype = 1;
         } else {
             if ((!isset($props[$isrecurringtag]) || $props[$isrecurringtag] == 0) && isset($message->meetingrequest->recurrenceid)) {
                 if (isset($props[$appSeqNr]) && $props[$appSeqNr] == 0) {
                     $message->meetingrequest->instancetype = 2;
                 } else {
                     $message->meetingrequest->instancetype = 3;
                 }
             }
         }
         // Disable reminder if it is off
         $reminderset = $this->_getPropIDFromString("PT_BOOLEAN:{00062008-0000-0000-C000-000000000046}:0x8503");
         $remindertime = $this->_getPropIDFromString("PT_LONG:{00062008-0000-0000-C000-000000000046}:0x8501");
         $messageprops = mapi_getprops($mapimessage, array($reminderset, $remindertime));
         if (!isset($messageprops[$reminderset]) || $messageprops[$reminderset] == false) {
             $message->meetingrequest->reminder = "";
         } else {
             ///set the default reminder time to seconds
             if ($messageprops[$remindertime] == 0x5ae980e1) {
                 $message->meetingrequest->reminder = 900;
             } else {
                 $message->meetingrequest->reminder = $messageprops[$remindertime] * 60;
             }
         }
         // Set sensitivity to 0 if missing
         if (!isset($message->meetingrequest->sensitivity)) {
             $message->meetingrequest->sensitivity = 0;
         }
     }
     // Add attachments
     $attachtable = mapi_message_getattachmenttable($mapimessage);
     // START CHANGED dw2412 to contain the Attach Method (needed for eml discovery)
     $rows = mapi_table_queryallrows($attachtable, array(PR_ATTACH_NUM, PR_ATTACH_METHOD));
     // END CHANGED dw2412 to contain the Attach Method (needed for eml discovery)
     $n = 1;
     foreach ($rows as $row) {
         if (isset($row[PR_ATTACH_NUM])) {
             $mapiattach = mapi_message_openattach($mapimessage, $row[PR_ATTACH_NUM]);
             // CHANGED dw2412 for HTML eMail Inline Attachments...
             $attachprops = mapi_getprops($mapiattach, array(PR_ATTACH_LONG_FILENAME, PR_ATTACH_FILENAME, PR_DISPLAY_NAME, PR_ATTACH_FLAGS, PR_ATTACH_CONTENT_ID, PR_ATTACH_MIME_TAG));
             $attach = new SyncAttachment();
             // START CHANGED dw2412 EML Attachment
             if ($row[PR_ATTACH_METHOD] == ATTACH_EMBEDDED_MSG) {
                 $stream = buildEMLAttachment($mapiattach);
             } else {
                 $stream = mapi_openpropertytostream($mapiattach, PR_ATTACH_DATA_BIN);
             }
             // END CHANGED dw2412 EML Attachment
             if ($stream) {
                 $stat = mapi_stream_stat($stream);
                 if (isset($message->_mapping['POOMMAIL:Attachments'])) {
                     $attach = new SyncAttachment();
                 } else {
                     if (isset($message->_mapping['AirSyncBase:Attachments'])) {
                         $attach = new SyncAirSyncBaseAttachment();
                     }
                 }
                 $attach->attsize = $stat["cb"];
                 $attach->attname = bin2hex($this->_folderid) . ":" . bin2hex($sourcekey) . ":" . $row[PR_ATTACH_NUM];
                 // START CHANGED dw2412 EML Attachment
                 debugLog("Mime Tag for attachment='" . strtolower(trim($attachprops[PR_ATTACH_MIME_TAG])) . "'");
                 if (isset($attachprops[PR_ATTACH_LONG_FILENAME])) {
                     $attach->displayname = w2u($attachprops[PR_ATTACH_LONG_FILENAME]);
                 } else {
                     if (isset($attachprops[PR_ATTACH_FILENAME])) {
                         $attach->displayname = w2u($attachprops[PR_ATTACH_FILENAME]);
                     } else {
                         if (isset($attachprops[PR_DISPLAY_NAME])) {
                             $attach->displayname = w2u($attachprops[PR_DISPLAY_NAME]);
                         } else {
                             if (strtolower(trim($attachprops[PR_ATTACH_MIME_TAG])) == 'multipart/signed') {
                                 $attach->displayname = w2u("smime.p7m");
                             } else {
                                 $attach->displayname = w2u("untitled");
                             }
                         }
                     }
                 }
                 if (strlen($attach->displayname) == 0) {
                     $attach->displayname = "Untitled_" . $n;
                     $n++;
                 }
                 if ($row[PR_ATTACH_METHOD] == ATTACH_EMBEDDED_MSG) {
                     $attach->displayname .= w2u(".eml");
                 }
                 // END CHANGED dw2412 EML Attachment
                 // in case the attachment has got a content id it is an inline one...
                 if (isset($attachprops[PR_ATTACH_CONTENT_ID])) {
                     $attach->isinline = true;
                     $attach->method = 6;
                     $attach->contentid = $attachprops[PR_ATTACH_CONTENT_ID];
                     $attach->contenttype = $attachprops[PR_ATTACH_MIME_TAG];
                     // for inline images the displayname extension must match the content type
                     // otherwise on i.e. windows mobile the image is not being displayed / automatically downloaded
                     switch (strtolower($attachprops[PR_ATTACH_MIME_TAG])) {
                         case 'image/gif':
                             if (substr(strtolower($attach->displayname), strlen($attach->displayname) - 4) != '.gif') {
                                 $attach->displayname .= '.gif';
                             }
                             break;
                         case 'image/jpg':
                         case 'image/jpeg':
                             if (substr(strtolower($attach->displayname), strlen($attach->displayname) - 4) != '.jpg') {
                                 $attach->displayname .= '.jpg';
                             }
                             break;
                         case 'image/png':
                             if (substr(strtolower($attach->displayname), strlen($attach->displayname) - 4) != '.png') {
                                 $attach->displayname .= '.png';
                             }
                             break;
                     }
                 } else {
                     $attach->attmethod = 1;
                 }
                 if (isset($message->_mapping['POOMMAIL:Attachments'])) {
                     if (!isset($message->attachments) || !is_array($message->attachments)) {
                         $message->attachments = array();
                     }
                     array_push($message->attachments, $attach);
                 } else {
                     if (isset($message->_mapping['AirSyncBase:Attachments'])) {
                         if (!isset($message->airsyncbaseattachments) || !is_array($message->airsyncbaseattachments)) {
                             $message->airsyncbaseattachments = array();
                         }
                         array_push($message->airsyncbaseattachments, $attach);
                     }
                 }
             }
         }
     }
     // Get To/Cc as SMTP addresses (this is different from displayto and displaycc because we are putting
     // in the SMTP addresses as well, while displayto and displaycc could just contain the display names
     $to = array();
     $cc = array();
     $reciptable = mapi_message_getrecipienttable($mapimessage);
     $rows = mapi_table_queryallrows($reciptable, array(PR_RECIPIENT_TYPE, PR_DISPLAY_NAME, PR_ADDRTYPE, PR_EMAIL_ADDRESS, PR_SMTP_ADDRESS));
     foreach ($rows as $row) {
         $address = "";
         $fulladdr = "";
         $addrtype = isset($row[PR_ADDRTYPE]) ? $row[PR_ADDRTYPE] : "";
         if (isset($row[PR_SMTP_ADDRESS])) {
             $address = $row[PR_SMTP_ADDRESS];
         } else {
             if ($addrtype == "SMTP" && isset($row[PR_EMAIL_ADDRESS])) {
                 $address = $row[PR_EMAIL_ADDRESS];
             } else {
                 if ($addrtype == "MOBILE" && isset($row[PR_EMAIL_ADDRESS])) {
                     $address = $row[PR_EMAIL_ADDRESS];
                 }
             }
         }
         $name = isset($row[PR_DISPLAY_NAME]) ? $row[PR_DISPLAY_NAME] : "";
         if ($message->messageclass == "IPM.Note.Mobile.SMS") {
             if ($name == "" || $name == $address) {
                 $fulladdr = "\"" . w2u($address) . "\" [MOBILE:" . w2u($address) . "]";
             } else {
                 if (substr($name, 0, 1) != '"' && substr($name, -1) != '"') {
                     $fulladdr = "\"" . w2u($name) . "\" [MOBILE:" . w2u($address) . "]";
                 } else {
                     $fulladdr = w2u($name) . " [MOBILE:" . w2u($address) . "]";
                 }
             }
         } else {
             if ($name == "" || $name == $address) {
                 $fulladdr = w2u($address);
             } else {
                 if (substr($name, 0, 1) != '"' && substr($name, -1) != '"') {
                     $fulladdr = "\"" . w2u($name) . "\" <" . w2u($address) . ">";
                 } else {
                     $fulladdr = w2u($name) . "<" . w2u($address) . ">";
                 }
             }
         }
         if ($row[PR_RECIPIENT_TYPE] == MAPI_TO) {
             array_push($to, $fulladdr);
         } else {
             if ($row[PR_RECIPIENT_TYPE] == MAPI_CC) {
                 array_push($cc, $fulladdr);
             }
         }
     }
     if (defined('LIMIT_RECIPIENTS')) {
         if (count($to) > LIMIT_RECIPIENTS) {
             debugLog("Recipient amount limitted. No to recipients added!");
             $to = array();
             $message->displayto = "";
         }
         if (count($cc) > LIMIT_RECIPIENTS) {
             debugLog("Recipient amount limitted. No cc recipients added!");
             $cc = array();
         }
     }
     $message->to = implode(", ", $to);
     $message->cc = implode(", ", $cc);
     // CHANGED dw2412 to not have this problem at my system with mapi_inetmapi_imtoinet segfault
     if ($mimesupport == 2 && function_exists("mapi_inetmapi_imtoinet") && !isset($message->airsyncbasebody) && (!defined('ICS_IMTOINET_SEGFAULT') || ICS_IMTOINET_SEGFAULT == false)) {
         $addrBook = mapi_openaddressbook($this->_session);
         $mstream = mapi_inetmapi_imtoinet($this->_session, $addrBook, $mapimessage, array());
         $mstreamstat = mapi_stream_stat($mstream);
         if ($mstreamstat['cb'] < MAX_EMBEDDED_SIZE) {
             $message->mimetruncated = 0;
             $mstreamcontent = mapi_stream_read($mstream, MAX_EMBEDDED_SIZE);
             $message->mimedata = $mstreamcontent;
             $message->mimesize = $mstreamstat["cb"];
             unset($message->body, $message->bodytruncated);
         }
     }
     return $message;
 }
示例#6
0
 function _getEmail($mapimessage, $truncsize, $bodypreference, $mimesupport = 0)
 {
     $message = new SyncMail();
     $this->_getPropsFromMAPI($message, $mapimessage, $this->_emailmapping);
     // start added dw2412 AS V12.0 Flag support
     // should not break anything since in proto AS12 Fields get excluded in case a lower protocol is in use
     $message->poommailflag = new SyncPoommailFlag();
     $this->_getPropsFromMAPI($message->poommailflag, $mapimessage, $this->_emailflagmapping);
     if (!isset($message->poommailflag->flagstatus)) {
         $message->poommailflag->flagstatus = 0;
     }
     if (!isset($message->contentclass) || $message->contentclass == "") {
         $message->contentclass = "urn:content-classes:message";
     }
     // end added dw2412 AS V12.0 Flag Support
     // Override 'From' to show "Full Name <*****@*****.**>"
     // CHANGED dw2412 to honor the Reply-To Information in messages
     $messageprops = mapi_getprops($mapimessage, array(PR_SENT_REPRESENTING_NAME, PR_SENT_REPRESENTING_ENTRYID, PR_SOURCE_KEY, PR_REPLY_RECIPIENT_ENTRIES));
     // Override 'body' for truncation
     // START CHANGED dw2412 Support Protocol Version 12 (added bodypreference compare)
     if ($bodypreference == false) {
         $body = mapi_openproperty($mapimessage, PR_BODY);
         $bodysize = strlen($body);
         if ($bodysize > $truncsize) {
             $body = substr($body, 0, $truncsize);
             $message->bodysize = $bodysize;
             $message->bodytruncated = 1;
         } else {
             $message->bodytruncated = 0;
         }
         $message->body = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
         if (!isset($message->body) || strlen($message->body) == 0) {
             $message->body = " ";
         }
     } else {
         $rtf = mapi_message_openproperty($mapimessage, PR_RTF_COMPRESSED);
         if (!$rtf) {
             $message->airsyncbasenativebodytype = 1;
         } else {
             $rtf = preg_replace("/(\n.*)/m", "", mapi_decompressrtf($rtf));
             if (strpos($rtf, "\\fromtext") != false) {
                 $message->airsyncbasenativebodytype = 1;
             } else {
                 $message->airsyncbasenativebodytype = 2;
             }
         }
         if (!isset($bodypreference[1]["TruncationSize"])) {
             $bodypreference[1]["TruncationSize"] = 1024 * 1024;
         }
         $message->airsyncbasebody = new SyncAirSyncBaseBody();
         debugLog("airsyncbasebody!");
         if (isset($bodypreference[4]) && isset($mstream)) {
             $mstreamcontent = mapi_stream_read($mstream, MAX_EMBEDDED_SIZE);
             $message->airsyncbasebody->type = 4;
             if (isset($bodypreference[4]["TruncationSize"])) {
                 $hdrend = strpos("\r\n\r\n", $mstreamcontent);
                 $message->airsyncbasebody->data = substr($mstreamcontent, 0, $hdrend + $bodypreference[4]["TruncationSize"]);
             } else {
                 $message->airsyncbasebody->data = $mstreamcontent;
             }
             if (strlen($message->airsyncbasebody->data) < $mstreamstat["cb"]) {
                 $message->airsyncbasebody->truncated = 1;
             }
             $message->airsyncbasebody->estimateddatasize = strlen($mstreamcontent);
         } else {
             if (isset($bodypreference[3]) && $message->airsyncbasenativebodytype == 3) {
                 $message->airsyncbasebody->type = 3;
                 $rtf = mapi_openproperty($mapimessage, PR_RTF_COMPRESSED);
                 $message->airsyncbasebody->data = base64_encode($rtf);
                 $message->airsyncbasebody->estimateddatasize = strlen($rtf);
                 $message->airsyncbasebody->truncated = 0;
                 unset($message->airsyncbasebody->truncated);
                 debugLog("RTF Body!");
             } elseif (isset($bodypreference[2]) && $message->airsyncbasenativebodytype == 2) {
                 $message->airsyncbasebody->type = 2;
                 $html = mapi_openproperty($mapimessage, PR_HTML);
                 if (isset($bodypreference[2]["TruncationSize"]) && strlen($html) > $bodypreference[2]["TruncationSize"]) {
                     $html = substr($html, 0, $bodypreference[2]["TruncationSize"]);
                     $message->airsyncbasebody->truncated = 1;
                 } else {
                     $message->airsyncbasebody->truncated = 0;
                     unset($message->airsyncbasebody->truncated);
                 }
                 $message->airsyncbasebody->data = $html;
                 $message->airsyncbasebody->estimateddatasize = strlen($html);
                 debugLog("HTML Body!");
             } else {
                 $body = mapi_openproperty($mapimessage, PR_BODY);
                 $message->airsyncbasebody->type = 1;
                 if (isset($bodypreference[1]["TruncationSize"]) && strlen($body) > $bodypreference[1]["TruncationSize"]) {
                     $body = substr($body, 0, $bodypreference[1]["TruncationSize"]);
                     $message->airsyncbasebody->truncated = 1;
                 } else {
                     $message->airsyncbasebody->truncated = 0;
                     unset($message->airsyncbasebody->truncated);
                 }
                 $message->airsyncbasebody->estimateddatasize = strlen($body);
                 $message->airsyncbasebody->data = str_replace("\n", "\r\n", w2u(str_replace("\r", "", $body)));
                 debugLog("Plain Body!");
             }
         }
         if (!isset($message->airsyncbasebody->data) || strlen($message->airsyncbasebody->data) == 0) {
             $message->airsyncbasebody->data = " ";
         }
     }
     // END CHANGED dw2412 Support Protocol Version 12 (added bodypreference compare)
     if (isset($messageprops[PR_SOURCE_KEY])) {
         $sourcekey = $messageprops[PR_SOURCE_KEY];
     } else {
         return false;
     }
     $fromname = $fromaddr = "";
     if (isset($messageprops[PR_SENT_REPRESENTING_NAME])) {
         $fromname = $messageprops[PR_SENT_REPRESENTING_NAME];
     }
     if (isset($messageprops[PR_SENT_REPRESENTING_ENTRYID])) {
         $fromaddr = $this->_getSMTPAddressFromEntryID($messageprops[PR_SENT_REPRESENTING_ENTRYID]);
     }
     if ($fromname == $fromaddr) {
         $fromname = "";
     }
     if ($fromname) {
         $from = "\"" . w2u($fromname) . "\" <" . w2u($fromaddr) . ">";
     } else {
         $from = "\"" . w2u($fromaddr) . "\" <" . w2u($fromaddr) . ">";
     }
     //changed dw2412 to get rid at HTC Mail (Android) from error message... Not nice but effective...
     $message->from = $from;
     // START ADDED dw2412 to honor reply to address
     if (isset($messageprops[PR_REPLY_RECIPIENT_ENTRIES])) {
         $replyto = $this->_readReplyRecipientEntry($messageprops[PR_REPLY_RECIPIENT_ENTRIES]);
         foreach ($replyto as $value) {
             $message->reply_to .= $value['email_address'] . ";";
         }
         $message->reply_to = substr($message->reply_to, 0, strlen($message->reply_to) - 1);
     }
     // END ADDED dw2412 to honor reply to address
     // process Meeting Requests
     if (isset($message->messageclass) && strpos($message->messageclass, "IPM.Schedule.Meeting") === 0) {
         $message->meetingrequest = new SyncMeetingRequest();
         $this->_getPropsFromMAPI($message->meetingrequest, $mapimessage, $this->_meetingrequestmapping);
         $goidtag = $this->_getPropIdFromString("PT_BINARY:{6ED8DA90-450B-101B-98DA-00AA003F1305}:0x3");
         $timezonetag = $this->_getPropIDFromString("PT_BINARY:{00062002-0000-0000-C000-000000000046}:0x8233");
         $recReplTime = $this->_getPropIDFromString("PT_SYSTIME:{00062002-0000-0000-C000-000000000046}:0x8228");
         $isrecurringtag = $this->_getPropIDFromString("PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0x8223");
         $recurringstate = $this->_getPropIDFromString("PT_BINARY:{00062002-0000-0000-C000-000000000046}:0x8216");
         $appSeqNr = $this->_getPropIDFromString("PT_LONG:{00062002-0000-0000-C000-000000000046}:0x8201");
         $lidIsException = $this->_getPropIDFromString("PT_BOOLEAN:{00062002-0000-0000-C000-000000000046}:0xA");
         $recurStartTime = $this->_getPropIDFromString("PT_LONG:{6ED8DA90-450B-101B-98DA-00AA003F1305}:0xE");
         $props = mapi_getprops($mapimessage, array($goidtag, $timezonetag, $recReplTime, $isrecurringtag, $recurringstate, $appSeqNr, $lidIsException, $recurStartTime));
         // Get the GOID
         if (isset($props[$goidtag])) {
             $message->meetingrequest->globalobjid = base64_encode($props[$goidtag]);
         }
         // Set Timezone
         if (isset($props[$timezonetag])) {
             $tz = $this->_getTZFromMAPIBlob($props[$timezonetag]);
         } else {
             $tz = $this->_getGMTTZ();
         }
         $message->meetingrequest->timezone = base64_encode($this->_getSyncBlobFromTZ($tz));
         // send basedate if exception
         if (isset($props[$recReplTime]) || isset($props[$lidIsException]) && $props[$lidIsException] == true) {
             if (isset($props[$recReplTime])) {
                 $basedate = $props[$recReplTime];
                 $message->meetingrequest->recurrenceid = $this->_getGMTTimeByTZ($basedate, $this->_getGMTTZ());
             } else {
                 if (!isset($props[$goidtag]) || !isset($props[$recurStartTime]) || !isset($props[$timezonetag])) {
                     debugLog("Missing property to set correct basedate for exception");
                 } else {
                     $basedate = extractBaseDate($props[$goidtag], $props[$recurStartTime]);
                     $message->meetingrequest->recurrenceid = $this->_getGMTTimeByTZ($basedate, $tz);
                 }
             }
         }
         // Organizer is the sender
         $message->meetingrequest->organizer = $message->from;
         // Process recurrence
         if (isset($props[$isrecurringtag]) && $props[$isrecurringtag]) {
             $myrec = new SyncMeetingRequestRecurrence();
             // get recurrence -> put $message->meetingrequest as message so the 'alldayevent' is set correctly
             $this->_getRecurrence($mapimessage, $props, $message->meetingrequest, $myrec, $tz);
             $message->meetingrequest->recurrences = array($myrec);
         }
         // Force the 'alldayevent' in the object at all times. (non-existent == 0)
         if (!isset($message->meetingrequest->alldayevent) || $message->meetingrequest->alldayevent == "") {
             $message->meetingrequest->alldayevent = 0;
         }
         // Instancetype
         // 0 = single appointment
         // 1 = master recurring appointment
         // 2 = single instance of recurring appointment
         // 3 = exception of recurring appointment
         $message->meetingrequest->instancetype = 0;
         if (isset($props[$isrecurringtag]) && $props[$isrecurringtag] == 1) {
             $message->meetingrequest->instancetype = 1;
         } else {
             if ((!isset($props[$isrecurringtag]) || $props[$isrecurringtag] == 0) && isset($message->meetingrequest->recurrenceid)) {
                 if (isset($props[$appSeqNr]) && $props[$appSeqNr] == 0) {
                     $message->meetingrequest->instancetype = 2;
                 } else {
                     $message->meetingrequest->instancetype = 3;
                 }
             }
         }
         // Disable reminder if it is off
         $reminderset = $this->_getPropIDFromString("PT_BOOLEAN:{00062008-0000-0000-C000-000000000046}:0x8503");
         $remindertime = $this->_getPropIDFromString("PT_LONG:{00062008-0000-0000-C000-000000000046}:0x8501");
         $messageprops = mapi_getprops($mapimessage, array($reminderset, $remindertime));
         if (!isset($messageprops[$reminderset]) || $messageprops[$reminderset] == false) {
             $message->meetingrequest->reminder = "";
         } else {
             ///set the default reminder time to seconds
             if ($messageprops[$remindertime] == 0x5ae980e1) {
                 $message->meetingrequest->reminder = 900;
             } else {
                 $message->meetingrequest->reminder = $messageprops[$remindertime] * 60;
             }
         }
         // Set sensitivity to 0 if missing
         if (!isset($message->meetingrequest->sensitivity)) {
             $message->meetingrequest->sensitivity = 0;
         }
     }
     // Add attachments
     $attachtable = mapi_message_getattachmenttable($mapimessage);
     // START CHANGED dw2412 to contain the Attach Method (needed for eml discovery)
     $rows = mapi_table_queryallrows($attachtable, array(PR_ATTACH_NUM, PR_ATTACH_METHOD));
     // END CHANGED dw2412 to contain the Attach Method (needed for eml discovery)
     $n = 1;
     foreach ($rows as $row) {
         if (isset($row[PR_ATTACH_NUM])) {
             $mapiattach = mapi_message_openattach($mapimessage, $row[PR_ATTACH_NUM]);
             // CHANGED dw2412 for HTML eMail Inline Attachments...
             $attachprops = mapi_getprops($mapiattach, array(PR_ATTACH_LONG_FILENAME, PR_ATTACH_FILENAME, PR_DISPLAY_NAME, PR_ATTACH_FLAGS, PR_ATTACH_CONTENT_ID, PR_ATTACH_MIME_TAG));
             // START CHANGED dw2412 EML Attachment
             if ($row[PR_ATTACH_METHOD] == ATTACH_EMBEDDED_MSG) {
                 $stream = buildEMLAttachment($mapiattach);
             } else {
                 $stream = mapi_openpropertytostream($mapiattach, PR_ATTACH_DATA_BIN);
             }
             // END CHANGED dw2412 EML Attachment
             if ($stream) {
                 $stat = mapi_stream_stat($stream);
                 if (isset($message->_mapping['POOMMAIL:Attachments'])) {
                     $attach = new SyncAttachment();
                 } else {
                     if (isset($message->_mapping['AirSyncBase:Attachments'])) {
                         $attach = new SyncAirSyncBaseAttachment();
                     }
                 }
                 $attach->attsize = $stat["cb"];
                 $attach->attname = bin2hex($this->_folderid) . ":" . bin2hex($sourcekey) . ":" . $row[PR_ATTACH_NUM];
                 // START CHANGED dw2412 EML Attachment
                 if (isset($attachprops[PR_ATTACH_LONG_FILENAME])) {
                     $attach->displayname = w2u($attachprops[PR_ATTACH_LONG_FILENAME]);
                 } else {
                     if (isset($attachprops[PR_ATTACH_FILENAME])) {
                         $attach->displayname = w2u($attachprops[PR_ATTACH_FILENAME]);
                     } else {
                         if (isset($attachprops[PR_DISPLAY_NAME])) {
                             $attach->displayname = w2u($attachprops[PR_DISPLAY_NAME]);
                         } else {
                             $attach->displayname = w2u("untitled");
                         }
                     }
                 }
                 if (strlen($attach->displayname) == 0) {
                     $attach->displayname = "Untitled_" . $n;
                     $n++;
                 }
                 if ($row[PR_ATTACH_METHOD] == ATTACH_EMBEDDED_MSG) {
                     $attach->displayname .= w2u(".eml");
                 }
                 // END CHANGED dw2412 EML Attachment
                 // in case the attachment has got a content id it is an inline one...
                 if (isset($attachprops[PR_ATTACH_CONTENT_ID])) {
                     $attach->isinline = true;
                     $attach->method = 6;
                     $attach->contentid = $attachprops[PR_ATTACH_CONTENT_ID];
                     $attach->contenttype = $attachprops[PR_ATTACH_MIME_TAG];
                 }
                 if (isset($message->_mapping['POOMMAIL:Attachments'])) {
                     if (!isset($message->attachments) || !is_array($message->attachments)) {
                         $message->attachments = array();
                     }
                     array_push($message->attachments, $attach);
                 } else {
                     if (isset($message->_mapping['AirSyncBase:Attachments'])) {
                         if (!isset($message->airsyncbaseattachments) || !is_array($message->airsyncbaseattachments)) {
                             $message->airsyncbaseattachments = array();
                         }
                         array_push($message->airsyncbaseattachments, $attach);
                     }
                 }
             }
         }
     }
     // Get To/Cc as SMTP addresses (this is different from displayto and displaycc because we are putting
     // in the SMTP addresses as well, while displayto and displaycc could just contain the display names
     $to = array();
     $cc = array();
     $reciptable = mapi_message_getrecipienttable($mapimessage);
     $rows = mapi_table_queryallrows($reciptable, array(PR_RECIPIENT_TYPE, PR_DISPLAY_NAME, PR_ADDRTYPE, PR_EMAIL_ADDRESS, PR_SMTP_ADDRESS));
     foreach ($rows as $row) {
         $address = "";
         $fulladdr = "";
         $addrtype = isset($row[PR_ADDRTYPE]) ? $row[PR_ADDRTYPE] : "";
         if (isset($row[PR_SMTP_ADDRESS])) {
             $address = $row[PR_SMTP_ADDRESS];
         } else {
             if ($addrtype == "SMTP" && isset($row[PR_EMAIL_ADDRESS])) {
                 $address = $row[PR_EMAIL_ADDRESS];
             }
         }
         $name = isset($row[PR_DISPLAY_NAME]) ? $row[PR_DISPLAY_NAME] : "";
         if ($name == "" || $name == $address) {
             $fulladdr = w2u($address);
         } else {
             if (substr($name, 0, 1) != '"' && substr($name, -1) != '"') {
                 $fulladdr = "\"" . w2u($name) . "\" <" . w2u($address) . ">";
             } else {
                 $fulladdr = w2u($name) . "<" . w2u($address) . ">";
             }
         }
         if ($row[PR_RECIPIENT_TYPE] == MAPI_TO) {
             array_push($to, $fulladdr);
         } else {
             if ($row[PR_RECIPIENT_TYPE] == MAPI_CC) {
                 array_push($cc, $fulladdr);
             }
         }
     }
     if (defined('LIMIT_RECIPIENTS')) {
         if (count($to) > LIMIT_RECIPIENTS) {
             debugLog("Recipient amount limitted. No to recipients added!");
             $to = array();
             $message->displayto = "";
         }
         if (count($cc) > LIMIT_RECIPIENTS) {
             debugLog("Recipient amount limitted. No cc recipients added!");
             $cc = array();
         }
     }
     $message->to = implode(", ", $to);
     $message->cc = implode(", ", $cc);
     // CHANGED dw2412 to not have this problem at my system with mapi_inetmapi_imtoinet segfault
     if ($mimesupport == 2 && function_exists("mapi_inetmapi_imtoinet") && !isset($message->airsyncbasebody) && !defined('ICS_IMTOINET_SEGFAULT')) {
         $addrBook = mapi_openaddressbook($this->_session);
         $mstream = mapi_inetmapi_imtoinet($this->_session, $addrBook, $mapimessage, array());
         $mstreamstat = mapi_stream_stat($mstream);
         if ($mstreamstat['cb'] < MAX_EMBEDDED_SIZE) {
             $message->mimetruncated = 0;
             $mstreamcontent = mapi_stream_read($mstream, MAX_EMBEDDED_SIZE);
             $message->mimedata = $mstreamcontent;
             $message->mimesize = $mstreamstat["cb"];
             unset($message->body, $message->bodytruncated);
         }
     }
     return $message;
 }