source: trunk/expressoMail1_2/inc/class.message_components.inc.php @ 5134

Revision 5134, 13.4 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus, do modulo ExpressoMail?.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2    class message_components {
3
4        /**
5         *+----------------------------------------------------------------------------------------------------+
6         *| IMAP message scanner - scans information provided by imap_fetchstructure()                         |
7         *|                                                                                                    |
8         *| Author: Richard York                                                                               |
9         *| mailto:richy at smilingsouls.net                                                                    |
10         *| http://www.smilingsouls.net                                                                        |
11         *|                                                                                                    |
12         *| (c) Copyright 2004, Richard York, All Rights Reseverd                                              |
13         *+----------------------------------------------------------------------------------------------------+
14         **
15        */
16
17        var $mailbox;           // (resource)              Imap stream
18
19        var $data_types;        // (array)(string)         Various message part types
20        var $encoding_types;    // (array)(string)         Various encoding types
21
22        // first array uses message id as key
23        // nested array is offset corresponding with the number of parts
24       
25        var $structure;         // (array)(object)         Contains the complete body structure
26        var $pid;               // (array)(array)(str)     part id
27        var $file_type;         // (array)(array)(str)     mime type
28        var $disposition;       // (array)(array)(str)     inline | attachment
29        var $fsize;             // (array)(array)(int)     part size in bytes
30        var $encoding;          // (array)(array)(str)     message encoding
31        var $charset;           // (array)(array)(int)     message charset
32        var $fname;             // (array)(array)(str)     original file name
33        var $inline_id;         // (array)(array)(str)     string containing the id for multipart/related
34        var $has_attachments;   // (array)(array)(bool)
35
36        /**
37         * CONSTRUCTOR
38         *
39         * void message_components(resource imap stream)
40         **
41        */
42       
43        function message_components($mailbox)
44        {
45            $this->data_types = array();
46
47                $this->data_types[0] = 'text';
48                $this->data_types[1] = 'multipart';
49                $this->data_types[2] = 'message';
50                $this->data_types[3] = 'application';
51                $this->data_types[4] = 'audio';
52                $this->data_types[5] = 'image';
53                $this->data_types[6] = 'video';
54                $this->data_types[7] = 'other';
55
56            $this->encoding_types = array();
57
58                $this->encoding_types[0] = '7bit';
59                $this->encoding_types[1] = '8bit';
60                $this->encoding_types[2] = 'binary';
61                $this->encoding_types[3] = 'base64';
62                $this->encoding_types[4] = 'quoted-printable';
63                $this->encoding_types[5] = 'other';
64
65            $this->mailbox = $mailbox;
66
67            return;
68        }
69       
70        /**
71         * void fetch_structure(int message id[, array recursive subpart[, array recursive parent part id[, int recursive counter[, bool recursive is a sub part[, bool recursive skip part]]]]])
72         * Indexes the structure of a message body.
73         *
74         * Gather message information returned by imap_fetchstructure()
75         * Recursively iterate through each parts array
76         * Concatenate part numbers in the following format `1.1` each part id is separated by a period, each referring
77         * to a part or subpart of a multipart message.  Create part numbers as such that they are compatible with imap_fetchbody()
78         **
79        */
80
81        function fetch_structure($mid, $sub_part = null, $sub_pid = null, $n = 0, $is_sub_part = false, $skip_part = false)
82        {
83            if (!is_array($sub_part))
84            {
85                $this->structure[$mid] = imap_fetchstructure($this->mailbox, $mid, FT_UID);
86            }
87            if (isset($this->structure[$mid]->parts) || is_array($sub_part))
88            {
89                if ($is_sub_part == false)
90                {
91                    $parts = $this->structure[$mid]->parts;
92                }
93                else
94                {
95                    $parts = $sub_part;
96                    $n++;
97                }
98
99                for($p = 0, $i = 1; $p < count($parts); $n++, $p++, $i++)
100                {
101                    // Skip the following...
102                    // Skip multipart/mixed!
103                    // Skip subsequent multipart/alternative if this part is message/rfc822
104                    // Skip multipart/related
105
106                    $ftype        = (empty($parts[$p]->type))?           $this->data_types[0].'/'.strtolower($parts[$p]->subtype) : $this->data_types[$parts[$p]->type].'/'.strtolower($parts[$p]->subtype);
107                    $encoding     = (isset($parts[$p]->encoding) && !empty($parts[$p]->encoding) && isset($this->encoding_types[$parts[$p]->encoding]) )?      $this->encoding_types[$parts[$p]->encoding]  : $this->encoding_types[0];
108                 
109                    if(!preg_match("/5./",phpversion()))
110                            $charset      = $parts[$p]->parameters[0]->value;
111                    else
112                                                $charset      = ( isset( $parts->p->parameters[0]->value ) ) ? $parts->p->parameters[0]->value : NULL;
113                    $skip_next    = ($ftype == 'message/rfc822')?        true : false;
114
115                    if ($ftype == 'multipart/report' || $skip_part == true && ( $ftype == 'multipart/alternative' && strpos( strtolower( $parts[$p]->parts[0]->subtype ), array( 'html', 'plain' ) ) === false ) || ( $ftype == 'multipart/related' && strtolower( $parts[$p]->parts[0]->subtype ) == 'alternative' ) )
116                    {
117                        $n--;
118                    }
119                    else
120                    {
121                        $this->pid[$mid][$n]       = ($is_sub_part == false || $skip_part && $ftype == 'multipart/related' )? $i : ($sub_pid == '' ? '1' : $sub_pid).'.'.$i;
122                        $this->file_type[$mid][$n] = $ftype;
123                        $this->encoding[$mid][$n]  = $encoding;
124                                                $this->charset[$mid][$n]   = $charset;
125                        $this->fsize[$mid][$n]     = (!isset($parts[$p]->bytes) || empty($parts[$p]->bytes))? 0 : $parts[$p]->bytes;
126                                                $hasAttachment = false;
127                        # Force inline disposition if none is present
128                        //if ($parts[$p]->ifdisposition == true)
129                        //{ por niltonneto, as vezes, inline anexos nao eram exibidos.
130                            $this->disposition[$mid][$n] = ( isset( $parts[$p]->disposition ) ) ? strtolower($parts[$p]->disposition) : NULL;
131
132                            //if (strtolower($parts[$p]->disposition) == 'attachment')
133                            //{ por jakjr, as vezes, inline anexos nao eram exibidos.
134                                if ($parts[$p]->ifdparameters == true)
135                                {
136                                    $params = $parts[$p]->dparameters;
137
138                                    foreach ($params as $param)
139                                    {
140                                        if((strtolower($param->attribute) == 'filename') || (strtolower($param->attribute) == 'name'))
141                                        {
142                                            $this->fname[$mid][$n] = $param->value;
143                                            $hasAttachment = true;
144                                            break;
145                                        }                                       
146                                    }
147                                }
148                               
149                                // Alguns web-mails utilizam o parameters
150                                if ($parts[$p]->ifparameters == true && !$hasAttachment)
151                                {
152                                    $params = $parts[$p]->parameters;
153                                    foreach ($params as $param)
154                                    {
155                                        if((strtolower($param->attribute) == 'filename') || (strtolower($param->attribute) == 'name'
156                                         || strtolower($param->attribute) == 'filename*') || strtolower($param->attribute) == 'name*')
157                                        {
158                                                if(strstr(strtolower($param->value), "iso-8859-1''")){
159                                                       
160                                                        $value = explode("''",$param->value);
161                                                        $this->fname[$mid][$n] = rawurldecode($value[1]);
162                                                }
163                                                else
164                                                $this->fname[$mid][$n] = $param->value;
165                                               
166                                            break;
167                                        }
168                                        if(strtolower($param->attribute) == 'charset'){
169                                                if($this->charset[$mid][$n] == '')
170                                                        $this->charset[$mid][$n] = $param->value;                                               
171                                        }
172                                    }
173                                                                }
174                            //}
175                        /*}
176                        else
177                        {
178                            $this->disposition[$mid][$n] = 'inline';
179                        }*/
180
181                        if ($parts[$p]->ifid == true)
182                        {
183                            $this->inline_id[$mid][$n] = $parts[$p]->id;
184                        }
185                    }
186
187                    if (isset($parts[$p]->parts) && is_array($parts[$p]->parts))
188                    {
189                        $this->has_attachments[$mid][$n] = true;
190                        $n = $this->fetch_structure($mid, $parts[$p]->parts, $this->pid[$mid][$n], $n, true, $skip_next);
191                    }
192                    else
193                    {
194                        $this->has_attachments[$mid][$n] = false;
195                    }
196                }
197
198                if ($is_sub_part == true)
199                {
200                    return $n;
201                }
202            }
203
204            // $parts is not an array... message is flat
205            else
206            {
207                $this->pid[$mid][0] = 1;
208
209                if (empty($this->structure[$mid]->type))
210                {
211                    $this->structure[$mid]->type        = (int) 0;
212                }
213               
214                if (isset($this->structure[$mid]->subtype))
215                {
216                    $this->file_type[$mid][0]            = $this->data_types[$this->structure[$mid]->type].'/'.strtolower($this->structure[$mid]->subtype);
217                }
218           
219                if (empty($this->structure[$mid]->encoding))
220                {
221                    $this->structure[$mid]->encoding    = (int) 0;
222                }
223               
224                $this->encoding[$mid][0]              = $this->encoding_types[$this->structure[$mid]->encoding];
225                if(!preg_match("/5./",phpversion()))
226                                        $this->charset[$mid][0] = $this->structure[$mid]->parameters[0]->value;
227                                else
228                                        $this->charset[$mid][0] = ( isset( $this->structure->mid->parameters[0]->value ) ) ? $this->structure->mid->parameters[0]->value : NULL;
229
230                if (isset($this->structure[$mid]->bytes))
231                {
232                    $this->fsize[$mid][0]                = strtolower($this->structure[$mid]->bytes);
233                }
234               
235                                if (isset($this->structure[$mid]->ifdparameters))
236                                {
237                                        $params = ( isset( $this->structure[$mid]->dparameters ) ) ? $this->structure[$mid]->dparameters : NULL;
238                                        $n = 0;
239                                        if($params)
240                                        foreach ($params as $param)
241                                        {
242                                                if((strtolower($param->attribute) == 'filename') || (strtolower($param->attribute) == 'name'))
243                                                {
244                                                        $this->fname[$mid][$n] = $param->value;
245                                                        break;
246                                                }
247                                                $n++;
248                                        }
249                                }
250                                if (isset($this->structure[$mid]->ifparameters))
251                                {
252                                        $params = $this->structure[$mid]->parameters;
253                                        $n = 0;
254                                        if($params)
255                                        foreach ($params as $param)
256                                        {
257                                                if(strtolower($param->attribute) == 'charset'){
258                                if($this->charset[$mid][$n] == '')
259                                $this->charset[$mid][$n] = $param->value;
260                                                        $n++;
261                        }
262                                        }
263                                }
264                                $this->disposition[$mid][0] = ( isset( $this->structure[$mid]->disposition ) ) ? $this->structure[$mid]->disposition : NULL;
265                //$this->disposition[$mid][0] = 'inline';
266            }
267
268            return;
269        }               
270    }
271   
272/*
273    // Example usage -- dump part ids for the specified message..
274
275    $msg =& new message_components($mb);
276    $msg->fetch_structure(12905);
277
278    echo '<pre>';   
279    //print_r($msg->pid[12905]);
280    echo count ($msg->fname[12905]);
281    echo '</pre>';
282
283    // also important to note that the offset numbering in the sub array isn't precise... $msg->pid[$mid][0]..
284    // I have a bug somewhere in there.. but I use foreach when accessing these arrays anyway.
285*/
286?>
Note: See TracBrowser for help on using the repository browser.