source: companies/celepar/expressoMail1_2/inc/class.message_components.inc.php @ 763

Revision 763, 13.0 KB checked in by niltonneto, 15 years ago (diff)

Importação inicial do Expresso da Celepar

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