- /* Detects filename if any */
- if (strpos(strtolower(trim($line)), "filename=")) {
- $pos = strpos($line, "filename=") + 9;
- $name = trim($line);
- if (strpos($line, " ", $pos) > 0) {
- $name = substr($name, $pos, strpos($line, " ", $pos));
- } else {
- $name = substr($name, $pos);
- }
- $name = str_replace("\"", "", $name);
- $hdr->filename = $name;
- }
- }
- /* REPLY-TO */
- else if (strtolower(substr($read[$i], 0, 9)) == "reply-to:") {
- $hdr->replyto = trim(substr($read[$i], 9, strlen($read[$i])));
- $i++;
- }
- /* FROM */
- else if (strtolower(substr($read[$i], 0, 5)) == "from:") {
- $hdr->from = trim(substr($read[$i], 5, strlen($read[$i]) - 6));
- if (! isset($hdr->replyto) || $hdr->replyto == "") {
- $hdr->replyto = $hdr->from;
- }
- $i++;
- }
- /* DATE */
- else if (strtolower(substr($read[$i], 0, 5)) == "date:") {
- $d = substr($read[$i], 5);
- $d = trim($d);
- $d = strtr($d, array(' ' => ' '));
- $d = explode(' ', $d);
- $hdr->date = getTimeStamp($d);
- $i++;
- }
- /* SUBJECT */
- else if (strtolower(substr($read[$i], 0, 8)) == "subject:") {
- $hdr->subject = trim(substr($read[$i], 8, strlen($read[$i]) - 9));
- if (strlen(Chop($hdr->subject)) == 0) {
- $hdr->subject = _("(no subject)");
- }
- /*
- if ($where == 'SUBJECT') {
- $hdr->subject = $what;
- // $hdr->subject = eregi_replace($what, "<b>\\0</b>", $hdr->subject);
- }
- */
- $i++;
- }
- /* CC */
- else if (strtolower(substr($read[$i], 0, 3)) == "cc:") {
- $pos = 0;
- $hdr->cc[$pos] = trim(substr($read[$i], 4));
- $i++;
- while (((substr($read[$i], 0, 1) == " ") || (substr($read[$i], 0, 1) == "\t")) && (trim($read[$i]) != "")){
- $pos++;
- $hdr->cc[$pos] = trim($read[$i]);
- $i++;
- }
- }
- /* BCC */
- else if (strtolower(substr($read[$i], 0, 4)) == "bcc:") {
- $pos = 0;
- $hdr->bcc[$pos] = trim(substr($read[$i], 5));
- $i++;
- while (((substr($read[$i], 0, 1) == " ") || (substr($read[$i], 0, 1) == "\t")) && (trim($read[$i]) != "")){
- $pos++;
- $hdr->bcc[$pos] = trim($read[$i]);
- $i++;
- }
- }
- /* TO */
- else if (strtolower(substr($read[$i], 0, 3)) == "to:") {
- $pos = 0;
- $hdr->to[$pos] = trim(substr($read[$i], 4));
- $i++;
- while (((substr($read[$i], 0, 1) == " ") || (substr($read[$i], 0, 1) == "\t")) && (trim($read[$i]) != "")){
- $pos++;
- $hdr->to[$pos] = trim($read[$i]);
- $i++;
- }
- }
- /* MESSAGE ID */
- else if (strtolower(substr($read[$i], 0, 11)) == "message-id:") {
- $hdr->message_id = trim(substr($read[$i], 11));
- $i++;
- }
- /* ERROR CORRECTION */
- else if (substr($read[$i], 0, 1) == ")") {
- if (strlen(trim($hdr->subject)) == 0) {
- $hdr->subject = _("(no subject)");
- }
- if (strlen(trim($hdr->from)) == 0) {
- $hdr->from = _("(unknown sender)");
- }
- if (strlen(trim($hdr->date)) == 0) {
- $hdr->date = time();
+/**
+ * Recursively parse embedded messages (if any) in the given
+ * message, building correct rfc822 headers for each one
+ *
+ * @param object $msg The message object to scan for attached messages
+ * NOTE: this is passed by reference! Changes made
+ * within will affect the caller's copy of $msg!
+ * @param int $id The top-level message UID on the IMAP server, even
+ * if the $msg being passed in is only an attached entity
+ * thereof.
+ * @param resource $imap_stream A live connection to the IMAP server.
+ *
+ * @return void
+ *
+ * @since 1.5.2
+ *
+ */
+function parse_message_entities(&$msg, $id, $imap_stream) {
+ if (!empty($msg->entities)) foreach ($msg->entities as $i => $entity) {
+ if (is_object($entity) && strtolower(get_class($entity)) == 'message') {
+ if (!empty($entity->rfc822_header)) {
+ $read = sqimap_run_command($imap_stream, "FETCH $id BODY[". $entity->entity_id .".HEADER]", true, $response, $message, TRUE);
+ $rfc822_header = new Rfc822Header();
+ $rfc822_header->parseHeader($read);
+ $msg->entities[$i]->rfc822_header = $rfc822_header;