X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmime.php;h=9573299476485b30265996cdc405c229d91457e2;hb=a9e67ec391e80d1df7fe52c21d7f106ddc3c5583;hp=aabd9cd88ec5ea5f2faad34127325f6fe77cf212;hpb=14d10786d1a604815a1867805143e4b279737bc0;p=squirrelmail.git
diff --git a/functions/mime.php b/functions/mime.php
index aabd9cd8..95732994 100644
--- a/functions/mime.php
+++ b/functions/mime.php
@@ -1,137 +1,1603 @@
-
- /** mime.php
- **
- ** This contains the functions necessary to detect and decode MIME messages.
- **/
-
-
- function decodeMime($body, $bound, $type0, $type1) {
- echo "$type0/$type1
";
- 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;
- $p = 0;
-
- while (substr(trim($body[$j]), 0, strlen($bound)) != $bound) {
- $entity_body[$p] = $body[$j];
- $j++;
- $p++;
- }
- fetchEntityHeader($imapConnection, $entity_body, $ent_type0, $ent_type1, $ent_bound, &$encoding, &$charset);
- $entity = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset);
+parseStructure($read);
+ $msg = $res[0];
+ $msg->setEnt('0');
+ if (count($flags)) {
+ foreach ($flags as $flag) {
+ $char = strtoupper($flag{1});
+ switch ($char) {
+ case 'S':
+ if (strtolower($flag) == '\\seen') {
+ $msg->is_seen = true;
+ }
+ break;
+ case 'A':
+ if (strtolower($flag) == '\\answered') {
+ $msg->is_answered = true;
+ }
+ break;
+ case 'D':
+ if (strtolower($flag) == '\\deleted') {
+ $msg->is_deleted = true;
+ }
+ break;
+ case 'F':
+ if (strtolower($flag) == '\\flagged') {
+ $msg->is_flagged = true;
+ }
+ break;
+ case 'M':
+ if (strtolower($flag) == '$mdnsent') {
+ $msg->is_mdnsent = true;
+ }
+ break;
+ default:
+ break;
}
- $i++;
- }
- } else {
- $full_message = getEntity($body, $bound, $type0, $type1);
- }
+ }
+ }
+ // listEntities($msg);
+ return( $msg );
+}
- return $full_message;
- }
+/* this starts the parsing of a particular structure. It is called recursively,
+ * so it can be passed different structures. It returns an object of type
+ * $message.
+ * First, it checks to see if it is a multipart message. If it is, then it
+ * handles that as it sees is necessary. If it is just a regular entity,
+ * then it parses it and adds the necessary header information (by calling out
+ * to mime_get_elements()
+ */
+
+function mime_fetch_body($imap_stream, $id, $ent_id) {
+ global $uid_support;
+ /*
+ * do a bit of error correction. If we couldn't find the entity id, just guess
+ * that it is the first one. That is usually the case anyway.
+ */
+ if (!$ent_id) {
+ $ent_id = 1;
+ }
+ $cmd = "FETCH $id BODY[$ent_id]";
+
+ $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message, $uid_support);
+ do {
+ $topline = trim(array_shift( $data ));
+ } while( $topline && $topline[0] == '*' && !preg_match( '/\* [0-9]+ FETCH.*/i', $topline )) ;
+
+ $wholemessage = implode('', $data);
+ if (ereg('\\{([^\\}]*)\\}', $topline, $regs)) {
+
+ $ret = substr( $wholemessage, 0, $regs[1] );
+ /*
+ There is some information in the content info header that could be important
+ in order to parse html messages. Let's get them here.
+ */
+ if ( $ret{0} == '<' ) {
+ $data = sqimap_run_command ($imap_stream, "FETCH $id BODY[$ent_id.MIME]", true, $response, $message, $uid_support);
+ }
+ } else if (ereg('"([^"]*)"', $topline, $regs)) {
+ $ret = $regs[1];
+ } else {
+ global $where, $what, $mailbox, $passed_id, $startMessage;
+ $par = 'mailbox=' . urlencode($mailbox) . "&passed_id=$passed_id";
+ if (isset($where) && isset($what)) {
+ $par .= '&where='. urlencode($where) . "&what=" . urlencode($what);
+ } else {
+ $par .= "&startMessage=$startMessage&show_more=0";
+ }
+ $par .= '&response=' . urlencode($response) .
+ '&message=' . urlencode($message).
+ '&topline=' . urlencode($topline);
+
+ echo '
' .
+ '' .
+ ' ' .
+ '' .
+ _("Body retrieval error. The reason for this is most probably that the message is malformed. Please help us making future versions better by submitting this message to the developers knowledgebase!") .
+ "
" .
+ _("Submit message") . '
' .
+ '' . _("Command:") . " $cmd " .
+ '' . _("Response:") . " $response " .
+ '' . _("Message:") . " $message " .
+ '' . _("FETCH line:") . " $topline " .
+ "
' . implode("\n", $body_ary) . ''; +} + + +/* 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($imap_stream, $message, $color, $wrap_at, $ent_num, $id, $mailbox='INBOX') { + // 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. + global $startMessage, $username, $key, $imapServerAddress, $imapPort, + $show_html_default, $has_unsafe_images, $view_unsafe_images, $sort; + + $has_unsafe_images= 0; + $body = ''; + $urlmailbox = urlencode($mailbox); + $body_message = getEntity($message, $ent_num); + if (($body_message->header->type0 == 'text') || + ($body_message->header->type0 == 'rfc822')) { + $body = mime_fetch_body ($imap_stream, $id, $ent_num); + $body = decodeBody($body, $body_message->header->encoding); + $hookResults = do_hook("message_body", $body); + $body = $hookResults[1]; + + // If there are other types that shouldn't be formatted, add + // them here + + if ($body_message->header->type1 == 'html') { + if ( $show_html_default <> 1 ) { + $entity_conv = array(' ' => ' ', + '>' => '>', + '<' => '<'); + $body = strip_tags( $body ); + $body = strtr($body, $entity_conv); + $body = trim($body); + translateText($body, $wrap_at, + $body_message->header->getParameter('charset')); + } else { + $body = magicHTML( $body, $id, $message, $mailbox ); + } + } else { + translateText($body, $wrap_at, + $body_message->header->getParameter('charset')); + } + + if ($has_unsafe_images) { + if ($view_unsafe_images) { + $body .= "