From 4809f4894f2e81992b5e172aacb3e337da29e615 Mon Sep 17 00:00:00 2001 From: lkehresman Date: Tue, 4 Jan 2000 19:35:19 +0000 Subject: [PATCH] Rewrote multipart/* algorithm to be recursive git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@102 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- ChangeLog | 2 +- functions/mailbox.php | 12 +++-- functions/mime.php | 108 +++++++++++++++++++++++++++--------------- functions/smtp.php | 2 +- src/read_body.php | 21 ++++---- 5 files changed, 91 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3e2a8a32..739ed346 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,6 @@ Version 0.2 -- January 02, 2000 ------------------------------- -- Attachment support (better MIME support in general) +- Attachment support (much better MIME support in general) - Themeable support replaced Custom Colors. Themes are pluggable. diff --git a/functions/mailbox.php b/functions/mailbox.php index 38fe457e..bb281879 100644 --- a/functions/mailbox.php +++ b/functions/mailbox.php @@ -245,7 +245,6 @@ $message["INFO"]["MAILBOX"] = $mailbox; $message["HEADER"] = fetchHeader($imapConnection, $id); $message["ENTITIES"] = fetchBody($imapConnection, $message["HEADER"]["BOUNDARY"], $id, $message["HEADER"]["TYPE0"], $message["HEADER"]["TYPE1"]); - return $message; } @@ -526,7 +525,14 @@ $read = $entity; } + function parseHTMLMessage($line) { + /** Add any parsing you want to in here **/ + return $line; + } + function parsePlainTextMessage($line) { + /** Add any parsing you want to in here */ + $line = "^^$line"; if ((strpos(strtolower($line), "> or > are found at the beginning of a line, I'll assume that was - replied text, so make it different colors **/ if (strpos(trim(str_replace(" ", "", $line)), ">>") == 2) { $line = substr($line, 2, strlen($line)); $line = "$line
\n"; @@ -557,8 +561,6 @@ $line = "$line
\n"; } - /** This translates "http://" into a link. It could be made better to accept - "www" and "mailto" also. That should probably be added later. **/ if (strpos(strtolower($line), "http://") != false) { $line = ereg_replace("
", "", $line); $start = strpos(strtolower($line), "http://"); diff --git a/functions/mime.php b/functions/mime.php index 33148ada..8186b747 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -5,64 +5,85 @@ **/ - function decodeMime($body, $bound, $type0, $type1) { + /** This is the first function called. It decides if this is a multipart + message or if it should be handled as a single entity + **/ + function decodeMime($body, $bound, $type0, $type1, &$entities) { if ($type0 == "multipart") { - if ($body[0] == "") - $i = 1; - else - $i = 0; - $bound = trim($bound); - $bound = "--$bound"; - while ($i < count($body)) { - if (trim($body[$i]) == $bound) { - $j = $i + 1; + while (($i < count($body)) && (substr($body[$i], 0, strlen("--$bound--")) != "--$bound--")) { + if (trim($body[$i]) == "--$bound") { + $j = $i+1; $p = 0; - while ((substr(trim($body[$j]), 0, strlen($bound)) != $bound) && (trim($body[$j]) != "")) { - $entity_header[$p] = $body[$j]; + /** Lets find the header for this entity **/ + /** If the first line after the boundary is blank, we use default values **/ + if (trim($body[$j]) == "") { + $ent_type0 = "text"; + $ent_type1 = "plain"; + $charset = "us-ascii"; $j++; - $p++; + /** If the first line ISNT blank, read in the header for this entity **/ + } else { + while ((substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") && (trim($body[$j]) != "")) { + $entity_header[$p] = $body[$j]; + $j++; + $p++; + } + /** All of these values are getting passed back to us **/ + fetchEntityHeader($imapConnection, $entity_header, $ent_type0, $ent_type1, $ent_bound, $encoding, $charset, $filename); } - fetchEntityHeader($imapConnection, $entity_header, $ent_type0, $ent_type1, $ent_bound, $encoding, $charset, $filename); - if ($ent_type0 == "text") { - while (substr(trim($body[$j]), 0, strlen($bound)) != $bound) { + /** OK, we have the header information, now lets decide what to do with it **/ + if ($ent_type0 == "multipart") { + $y = 0; + while (substr($body[$j], 0, strlen("--$bound--")) != "--$bound--") { + $ent_body[$y] = $body[$j]; + $y++; + $j++; + } + $ent = decodeMime($ent_body, $ent_bound, $ent_type0, $ent_type1, $entities); + $entities = $ent; + } else if ($ent_type0 == "text") { + while (substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") { $entity_body[$p] = $body[$j]; $j++; $p++; } + $count = count($entities); + $entities[$count] = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset, $filename); + } else { $j++; $entity_body = ""; - while (substr(trim($body[$j]), 0, strlen($bound)) != $bound) { + while (substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") { $entity_body .= $body[$j]; $j++; } + $count = count($entities); + $entities[$count] = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset, $filename); } - $entity = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset, $filename); - - $q = count($full_message); - $full_message[$q] = $entity[0]; } $i++; } } else { - $full_message = getEntity($body, $bound, $type0, $type1); + $count = count($entities); + $entities[$count] = getEntity($body, $bound, $type0, $type1, $encoding, $charset, $filename); } - return $full_message; + return $entities; } /** This gets one entity's properties **/ function getEntity($body, $bound, $type0, $type1, $encoding, $charset, $filename) { - $msg[0]["TYPE0"] = $type0; - $msg[0]["TYPE1"] = $type1; - $msg[0]["ENCODING"] = $encoding; - $msg[0]["CHARSET"] = $charset; - $msg[0]["FILENAME"] = $filename; + $msg["TYPE0"] = $type0; + $msg["TYPE1"] = $type1; + $msg["ENCODING"] = $encoding; + $msg["CHARSET"] = $charset; + $msg["FILENAME"] = $filename; + $msg["BODY"][0] = $body; if ($type0 == "text") { // error correcting if they didn't follow RFC standards if (trim($type1) == "") @@ -70,18 +91,25 @@ if ($type1 == "plain") { for ($p = 0;$p < count($body);$p++) { - $msg[0]["BODY"][$p] = parsePlainTextMessage($body[$p]); + $msg["BODY"][$p] = parsePlainTextMessage($body[$p]); + } + } else if ($type1 == "html") { + for ($p = 0;$p < count($body);$p++) { + $msg["BODY"][$p] = parseHTMLMessage($body[$p]); } } else { - $msg[0]["BODY"] = $body; + $msg["BODY"] = $body; } } else { - $msg[0]["BODY"][0] = $body; + $msg["BODY"][0] = $body; } return $msg; } + /** This will check whether or not the message contains a certain type. It + searches through all the entities for a match. + **/ function containsType($message, $type0, $type1, &$ent_num) { $type0 = strtolower($type0); $type1 = strtolower($type1); @@ -104,13 +132,20 @@ return false; } + /** This returns a parsed string called $body. That string can then be displayed + as the actual message in the HTML. It contains everything needed, including + HTML Tags, Attachments at the bottom, etc. + **/ function formatBody($message) { + /** this if statement checks for the entity to show as the primary message. To + add more of them, just put them in the order that is their priority. + **/ if (containsType($message, "text", "html", $ent_num)) { $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); } else if (containsType($message, "text", "plain", $ent_num)) { $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); - } // add other primary displaying message types here - + } + // add other primary displaying message types here else { // find any type that's displayable if (containsType($message, "text", "any_type", $ent_num)) { @@ -120,7 +155,6 @@ } } - /** Display the ATTACHMENTS: message if there's more than one part **/ if (count($message["ENTITIES"]) > 1) { $pos = count($body); @@ -144,17 +178,17 @@ $display_filename = $filename; } - $urlMailbox = urlencode($message["INFO"]["MAILBOX"]); $id = $message["INFO"]["ID"]; $body[$pos] .= "   " . $display_filename . "  (TYPE: $type0/$type1)
"; - } } - return $body; } + + + /** this function decodes the body depending on the encoding type. **/ function decodeBody($body, $encoding) { $encoding = strtolower($encoding); if ($encoding == "us-ascii") { diff --git a/functions/smtp.php b/functions/smtp.php index 6241c02f..ad6aa4c2 100644 --- a/functions/smtp.php +++ b/functions/smtp.php @@ -61,7 +61,7 @@ fputs($smtpConnection, "X-Mailer: SquirrelMail (version $version)\n"); // Identify SquirrelMail fputs($smtpConnection, "Reply-To: $from\n"); fputs($smtpConnection, "MIME-Version: 1.0\n"); - fputs($smtpConnection, "Content-Type: text\n"); + fputs($smtpConnection, "Content-Type: text/plain\n"); fputs($smtpConnection, "$body\n"); // send the body of the message fputs($smtpConnection, ".\n"); // end the DATA part diff --git a/src/read_body.php b/src/read_body.php index 050f1c5a..1ec73d19 100644 --- a/src/read_body.php +++ b/src/read_body.php @@ -13,7 +13,6 @@ // $message contains all information about the message // including header and body $message = fetchMessage($imapConnection, $passed_id, $mailbox); - echo "$mailbox, $passed_id
"; echo ""; echo "\n"; @@ -79,9 +78,9 @@ $subject = htmlspecialchars(stripslashes($message["HEADER"]["SUBJECT"])); echo "
"; - echo "\n"; + echo "
\n"; echo " "; - echo " \n"; + echo "
"; - echo " "; + echo "
"; echo " "; echo " "; echo "
"; echo " "; @@ -97,11 +96,11 @@ echo "
"; echo "
"; + echo "
"; echo " \n"; echo " \n"; /** subject **/ - echo " \n"; /** from **/ echo " \n"; - echo " \n"; /** date **/ echo " \n"; - echo " \n"; /** to **/ echo " \n"; - echo " \n"; - echo " \n"; echo " \n"; } - echo "
\n"; + echo " \n"; echo " Subject:\n"; echo " \n"; echo " $subject\n"; @@ -109,7 +108,7 @@ echo "
\n"; + echo " \n"; echo " From:\n"; echo " \n"; echo " $from_name\n"; @@ -117,7 +116,7 @@ echo "
\n"; + echo " \n"; echo " Date:\n"; echo " \n"; echo " $dateString\n"; @@ -125,7 +124,7 @@ echo "
\n"; + echo " \n"; echo " To:\n"; echo " \n"; echo " $to_string\n"; @@ -134,17 +133,19 @@ /** cc **/ if ($message["HEADER"]["CC"][0]) { echo "
\n"; + echo " \n"; echo " Cc:\n"; echo " \n"; echo " $cc_string\n"; echo "
"; + echo " "; echo " \n"; $body = formatBody($message); + echo "
"; for ($i = 0; $i < count($body); $i++) { echo "$body[$i]"; -- 2.25.1