ryxeo-glpi-git / htdocs / inc / mailgate.class.php @ 1c14bcc4
Historique | Voir | Annoter | Télécharger (21,5 ko)
1 | 1c14bcc4 | Eric Seigne | <?php
|
---|---|---|---|
2 | /*
|
||
3 | * @version $Id: mailgate.class.php 7763 2009-01-06 18:44:50Z moyo $
|
||
4 | -------------------------------------------------------------------------
|
||
5 | GLPI - Gestionnaire Libre de Parc Informatique
|
||
6 | Copyright (C) 2003-2009 by the INDEPNET Development Team.
|
||
7 | |||
8 | http://indepnet.net/ http://glpi-project.org
|
||
9 | -------------------------------------------------------------------------
|
||
10 | |||
11 | LICENSE
|
||
12 | |||
13 | This file is part of GLPI.
|
||
14 | |||
15 | GLPI is free software; you can redistribute it and/or modify
|
||
16 | it under the terms of the GNU General Public License as published by
|
||
17 | the Free Software Foundation; either version 2 of the License, or
|
||
18 | (at your option) any later version.
|
||
19 | |||
20 | GLPI is distributed in the hope that it will be useful,
|
||
21 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
22 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
23 | GNU General Public License for more details.
|
||
24 | |||
25 | You should have received a copy of the GNU General Public License
|
||
26 | along with GLPI; if not, write to the Free Software
|
||
27 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
28 | --------------------------------------------------------------------------
|
||
29 | */
|
||
30 | |||
31 | // ----------------------------------------------------------------------
|
||
32 | // Original Author of file:
|
||
33 | // Purpose of file:
|
||
34 | // ----------------------------------------------------------------------
|
||
35 | |||
36 | if (!defined('GLPI_ROOT')){ |
||
37 | die("Sorry. You can't access directly to this file"); |
||
38 | } |
||
39 | |||
40 | /// Mailgate class
|
||
41 | class Mailgate extends CommonDBTM { |
||
42 | |||
43 | |||
44 | /**
|
||
45 | * Constructor
|
||
46 | **/
|
||
47 | function Mailgate () { |
||
48 | $this->table="glpi_mailgate"; |
||
49 | $this->type=MAILGATE_TYPE; |
||
50 | } |
||
51 | function prepareInputForUpdate($input) { |
||
52 | |||
53 | if (isset($input['password'])&&empty($input['password'])){ |
||
54 | unset($input['password']); |
||
55 | } |
||
56 | if (isset ($input['mail_server']) && !empty ($input['mail_server'])) |
||
57 | $input["host"] = constructMailServerConfig($input); |
||
58 | return $input; |
||
59 | } |
||
60 | |||
61 | function prepareInputForAdd($input) { |
||
62 | |||
63 | if (isset ($input['mail_server']) && !empty ($input['mail_server'])) |
||
64 | $input["host"] = constructMailServerConfig($input); |
||
65 | return $input; |
||
66 | } |
||
67 | |||
68 | /**
|
||
69 | * Print the mailgate form
|
||
70 | *
|
||
71 | *@param $target filename : where to go when done.
|
||
72 | *@param $ID Integer : Id of the item to print
|
||
73 | *
|
||
74 | *@return boolean item found
|
||
75 | **/
|
||
76 | function showForm ($target,$ID) { |
||
77 | |||
78 | global $CFG_GLPI, $LANG; |
||
79 | |||
80 | if (!haveRight("config","r")) return false; |
||
81 | |||
82 | $spotted = false; |
||
83 | |||
84 | if(empty($ID)) { |
||
85 | if($this->getEmpty()) $spotted = true; |
||
86 | } else {
|
||
87 | if($this->getFromDB($ID)) $spotted = true; |
||
88 | } |
||
89 | |||
90 | if ($spotted){ |
||
91 | |||
92 | echo "<div class='center'><form method='post' name=form action=\"$target\">"; |
||
93 | |||
94 | echo "<table class='tab_cadre' cellpadding='2'>"; |
||
95 | |||
96 | echo "<tr><th align='center' colspan='2'>"; |
||
97 | if (empty($ID)){ |
||
98 | echo $LANG["mailgate"][1]; |
||
99 | } else {
|
||
100 | echo $LANG["mailgate"][0].": ".$this->fields["ID"]; |
||
101 | } |
||
102 | |||
103 | echo "</th></tr>"; |
||
104 | if (!function_exists('mb_list_encodings')||!function_exists('mb_convert_encoding')){ |
||
105 | echo "<tr class='tab_bg_1'><td align='center' colspan='2'>"; |
||
106 | echo $LANG["mailgate"][4]; |
||
107 | echo "</td></tr>"; |
||
108 | } |
||
109 | echo "<tr class='tab_bg_2'><td>".$LANG["common"][16].": </td><td>"; |
||
110 | autocompletionTextField("name","glpi_mailgate","name",$this->fields["name"],20); |
||
111 | echo "</td></tr>"; |
||
112 | |||
113 | echo "<tr class='tab_bg_2'><td>".$LANG["entity"][0].": </td><td>"; |
||
114 | dropdownValue("glpi_entities", "FK_entities",$this->fields["FK_entities"],1,$_SESSION['glpiactiveentities']); |
||
115 | echo "</td></tr>"; |
||
116 | |||
117 | showMailServerConfig($this->fields["host"]); |
||
118 | |||
119 | echo "<tr class='tab_bg_2'><td>".$LANG["login"][6].": </td><td>"; |
||
120 | autocompletionTextField("login","glpi_mailgate","login",$this->fields["login"],20); |
||
121 | echo "</td></tr>"; |
||
122 | |||
123 | echo "<tr class='tab_bg_2'><td>".$LANG["login"][7].": </td><td>"; |
||
124 | echo "<input type='password' name='password' value='' size='20'>"; |
||
125 | echo "</td></tr>"; |
||
126 | |||
127 | |||
128 | if (haveRight("config","w")) { |
||
129 | |||
130 | echo "<tr class='tab_bg_1'>"; |
||
131 | if(empty($ID)){ |
||
132 | |||
133 | echo "<td valign='top' colspan='2'>"; |
||
134 | echo "<div class='center'><input type='submit' name='add' value=\"".$LANG["buttons"][8]."\" class='submit'></div>"; |
||
135 | echo "</td>"; |
||
136 | echo "</tr>"; |
||
137 | } else {
|
||
138 | |||
139 | echo "<td valign='top' align='center'>"; |
||
140 | echo "<input type='hidden' name='ID' value=\"$ID\">\n"; |
||
141 | echo "<input type='submit' name='update' value=\"".$LANG["buttons"][7]."\" class='submit'>"; |
||
142 | echo "</td>"; |
||
143 | echo "<td valign='top'>\n"; |
||
144 | echo "<div class='center'>"; |
||
145 | echo "<input type='submit' name='delete' value=\"".$LANG["buttons"][6]."\" class='submit'>"; |
||
146 | echo "</div>"; |
||
147 | echo "</td>"; |
||
148 | echo "</tr>"; |
||
149 | echo "<tr class='tab_bg_1'><td colspan='2' align='center'><input type='submit' name='get_mails' value=\"".$LANG["mailgate"][2]."\" class='submit'>"; |
||
150 | echo "</td></tr>"; |
||
151 | } |
||
152 | |||
153 | |||
154 | } |
||
155 | |||
156 | echo "</table></form></div>"; |
||
157 | |||
158 | return true; |
||
159 | } |
||
160 | else {
|
||
161 | echo "<div class='center'><strong>".$LANG["common"][54]."</strong></div>"; |
||
162 | return false; |
||
163 | } |
||
164 | |||
165 | } |
||
166 | |||
167 | } |
||
168 | |||
169 | |||
170 | // modif and debug by INDEPNET Development Team.
|
||
171 | // Merge with collect GLPI system after big modification in it
|
||
172 | /* Original class ReceiveMail 1.0 by Mitul Koradia Created: 01-03-2006
|
||
173 | * Description: Reciving mail With Attechment
|
||
174 | * Email: mitulkoradia@gmail.com
|
||
175 | */
|
||
176 | /// Mailcollect class
|
||
177 | class MailCollect { |
||
178 | /// working entity
|
||
179 | var $entity; |
||
180 | /// working charset of the mail
|
||
181 | var $charset=""; |
||
182 | |||
183 | /// IMAP / POP server
|
||
184 | var $server=''; |
||
185 | /// IMAP / POP login
|
||
186 | var $username=''; |
||
187 | /// IMAP / POP password
|
||
188 | var $password=''; |
||
189 | |||
190 | /// IMAP / POP connection
|
||
191 | var $marubox=''; |
||
192 | |||
193 | /// ID of the current message
|
||
194 | var $mid = -1; |
||
195 | /// structure used to store the mail structure
|
||
196 | var $structure = false; |
||
197 | /// structure used to store files attached to a mail
|
||
198 | var $files; |
||
199 | /// Message to add to body to build ticket
|
||
200 | var $addtobody; |
||
201 | /// Number of ferchs emails
|
||
202 | var $fetch_emails=0; |
||
203 | |||
204 | /**
|
||
205 | * Constructor
|
||
206 | * @param $server IMAP/POP server address
|
||
207 | * @param $username IMAP/POP user name
|
||
208 | * @param $password IMAP/POP password
|
||
209 | * @param $entity entity ID used
|
||
210 | * @param $display display messages in MessageAfterRedirect or just return error
|
||
211 | * @return if $display = false return messages result string
|
||
212 | */
|
||
213 | function collect($server,$username,$password,$entity,$display=0){ |
||
214 | global $LANG; |
||
215 | $this->entity=$entity; |
||
216 | |||
217 | $this->server = $server; |
||
218 | $this->username = $username; |
||
219 | $this->password = $password; |
||
220 | $this->mid = -1; |
||
221 | |||
222 | $this->fetch_emails = 0; |
||
223 | //Connect to the Mail Box
|
||
224 | $this->connect();
|
||
225 | |||
226 | if ($this->marubox){ |
||
227 | // Get Total Number of Unread Email in mail box
|
||
228 | $tot=$this->getTotalMails(); //Total Mails in Inbox Return integer value |
||
229 | $error=0; |
||
230 | |||
231 | for($i=1;$i<=$tot && $i<= MAX_MAILS_RETRIEVED;$i++){ |
||
232 | $tkt= $this->buildTicket($i); |
||
233 | $this->deleteMails($i); // Delete Mail from Mail box |
||
234 | $result=imap_fetchheader($this->marubox,$i); |
||
235 | |||
236 | // Is a mail responding of an already existgin ticket ?
|
||
237 | if (array_key_exists('tracking',$tkt) ) { |
||
238 | // Deletion of message with sucess
|
||
239 | if (false === is_array($result)){ |
||
240 | $fup=new Followup(); |
||
241 | $fup->add($tkt); |
||
242 | } else {
|
||
243 | $error++;
|
||
244 | } |
||
245 | } else { // New ticket |
||
246 | // Deletion of message with sucess
|
||
247 | if (false === is_array($result)){ |
||
248 | $track=new job; |
||
249 | $track->add($tkt); |
||
250 | } else {
|
||
251 | $error++;
|
||
252 | } |
||
253 | } |
||
254 | $this->fetch_emails++;
|
||
255 | } |
||
256 | imap_expunge($this->marubox);
|
||
257 | $this->close_mailbox(); //Close Mail Box |
||
258 | |||
259 | if ($display){ |
||
260 | addMessageAfterRedirect($LANG["mailgate"][3].": ".$this->fetch_emails." ".($error>0?"($error ".$LANG["common"][63].")":"")); |
||
261 | } else {
|
||
262 | return $LANG["mailgate"][3].": ".$this->fetch_emails." ".($error>0?"($error ".$LANG["common"][63].")":""); |
||
263 | } |
||
264 | |||
265 | }else{
|
||
266 | if ($display){ |
||
267 | addMessageAfterRedirect($LANG["log"][41]); |
||
268 | } else {
|
||
269 | return $LANG["log"][41]; |
||
270 | } |
||
271 | // return 0;
|
||
272 | } |
||
273 | } // end function MailCollect
|
||
274 | |||
275 | |||
276 | |||
277 | /** function buildTicket - Builds,and returns, the major structure of the ticket to be entered .
|
||
278 | * @param $i mail ID
|
||
279 | * @return ticket fields array
|
||
280 | */
|
||
281 | function buildTicket($i){ |
||
282 | global $DB,$LANG,$CFG_GLPI; |
||
283 | |||
284 | $head=$this->getHeaders($i); // Get Header Info Return Array Of Headers **Key Are (subject,to,toOth,toNameOth,from,fromName) |
||
285 | |||
286 | $tkt= array (); |
||
287 | |||
288 | // max size = 0 : no import attachments
|
||
289 | if ($CFG_GLPI['mailgate_filesize_max']>0){ |
||
290 | if (is_writable(GLPI_DOC_DIR."/_tmp/")){ |
||
291 | $_FILES=$this->getAttached($i,GLPI_DOC_DIR."/_tmp/",$CFG_GLPI['mailgate_filesize_max']); |
||
292 | } else {
|
||
293 | logInFile('mailgate',GLPI_DOC_DIR."/_tmp/ is not writable"); |
||
294 | } |
||
295 | } |
||
296 | |||
297 | // Who is the user ?
|
||
298 | $tkt['author']=0; |
||
299 | $query="SELECT ID from glpi_users WHERE email='".$head['from']."'"; |
||
300 | $result=$DB->query($query); |
||
301 | if ($result&&$DB->numrows($result)){ |
||
302 | $tkt['author']=$DB->result($result,0,"ID"); |
||
303 | } |
||
304 | //RYXEO hack no spam please, utilisateur inconnu ? passe ta route
|
||
305 | else {
|
||
306 | return ;
|
||
307 | } |
||
308 | |||
309 | // AUto_import
|
||
310 | $tkt['_auto_import']=1; |
||
311 | $tkt['_do_not_check_author']=1; |
||
312 | $body=$this->getBody($i); |
||
313 | |||
314 | // Do it before using charset variable
|
||
315 | $head['subject']=$this->decodeMimeString($head['subject']); |
||
316 | |||
317 | if (!empty($this->charset)&&function_exists('mb_convert_encoding')){ |
||
318 | $body=mb_convert_encoding($body, 'utf-8',$this->charset); |
||
319 | } |
||
320 | if (!seems_utf8($body)){ |
||
321 | $tkt['contents']= utf8_encode($body); |
||
322 | }else{
|
||
323 | $tkt['contents']= $body; |
||
324 | } |
||
325 | // Add message from getAttached
|
||
326 | if ($this->addtobody) { |
||
327 | $tkt['contents'] .= $this->addtobody; |
||
328 | } |
||
329 | |||
330 | $exists = false; |
||
331 | //RYXEO special a cause des loopback to myself
|
||
332 | if ( preg_match('/Nouveau ticket/',$head['subject'],$match) ) { |
||
333 | return;
|
||
334 | } |
||
335 | if ( preg_match('/\[SUPPORT RYXEO #(\d+)/',$head['subject'],$match) ) { |
||
336 | // it's a reply to a previous ticket
|
||
337 | $ID = (int)$match[1]; |
||
338 | $tkt['tracking'] = $ID; |
||
339 | $job=new Job(); |
||
340 | $job->getfromDB($ID); |
||
341 | // the job exists and the author is the same
|
||
342 | if ( $job->getFromDB($ID) && ($job->fields["author"] == $tkt['author']) ) { |
||
343 | |||
344 | $exists = true; |
||
345 | $content=explode("\n",$tkt['contents']); |
||
346 | $tkt['contents']=""; |
||
347 | $first_comment=true; |
||
348 | $to_keep=array(); |
||
349 | foreach($content as $ID => $val){ |
||
350 | if (isset($val[0])&&$val[0]=='>'){ |
||
351 | // Delete line at the top of the first comment
|
||
352 | if ($first_comment){ |
||
353 | $first_comment=false; |
||
354 | if (isset($to_keep[$ID-1])){ |
||
355 | unset($to_keep[$ID-1]); |
||
356 | } |
||
357 | } |
||
358 | } else {
|
||
359 | // Detect a signature if already keep lines
|
||
360 | if (isset($val[0])&&$val[0]=='-' |
||
361 | &&isset($val[1])&&$val[1]=='-' |
||
362 | &&count($tokeep)){ |
||
363 | |||
364 | break;
|
||
365 | } else {
|
||
366 | |||
367 | $to_keep[$ID]=$ID; |
||
368 | } |
||
369 | } |
||
370 | } |
||
371 | foreach($to_keep as $ID ){ |
||
372 | $tkt['contents'].=$content[$ID]."\n"; |
||
373 | } |
||
374 | } |
||
375 | } |
||
376 | //RYXEO: do not create tickets on mail ... due to spam
|
||
377 | //ou evite de creer un ticket a la racine quand on recoit un mail
|
||
378 | //de supportteam ... ie moi-meme !
|
||
379 | else {
|
||
380 | return;
|
||
381 | } |
||
382 | |||
383 | //RYXEO: do not create tickets on mail ... due to spam
|
||
384 | if ( ! $exists ) { |
||
385 | unset($tkt['tracking']); |
||
386 | // Mail followup
|
||
387 | /*
|
||
388 | $tkt['uemail']=$head['from'];
|
||
389 | $tkt['emailupdates']=1;
|
||
390 | // Which entity ?
|
||
391 | $tkt['FK_entities']=$this->entity;
|
||
392 |
|
||
393 | //$tkt['Subject']= $head['subject']; // not use for the moment
|
||
394 | $tkt['name']=$this->textCleaner($head['subject']);
|
||
395 | // Medium
|
||
396 | $tkt['priority']= "3";
|
||
397 | // No hardware associated
|
||
398 | $tkt['device_type']="0";
|
||
399 | // Mail request type
|
||
400 | $tkt['request_type']="2";
|
||
401 | */
|
||
402 | } |
||
403 | $tkt['contents']=clean_cross_side_scripting_deep(html_clean($tkt['contents'])); |
||
404 | |||
405 | $tkt=addslashes_deep($tkt); |
||
406 | |||
407 | return $tkt; |
||
408 | } |
||
409 | |||
410 | |||
411 | /** function textCleaner - Strip out unwanted/unprintable characters from the subject.
|
||
412 | * @param $text text to clean
|
||
413 | * @return clean text
|
||
414 | */
|
||
415 | function textCleaner($text) |
||
416 | { |
||
417 | //$text= str_replace("'", "", $text);
|
||
418 | $text= str_replace("=20", "\n", $text); |
||
419 | return $text; |
||
420 | } |
||
421 | |||
422 | |||
423 | ///return supported encodings in lowercase.
|
||
424 | function mb_list_lowerencodings() { |
||
425 | $r=mb_list_encodings();
|
||
426 | for ($n=sizeOf($r); $n--; ) { |
||
427 | $r[$n]=strtolower($r[$n]); |
||
428 | } |
||
429 | return $r; |
||
430 | } |
||
431 | |||
432 | /** Receive a string with a mail header and returns it
|
||
433 | // decoded to a specified charset.
|
||
434 | // If the charset specified into a piece of text from header
|
||
435 | // isn't supported by "mb", the "fallbackCharset" will be
|
||
436 | // used to try to decode it.
|
||
437 | * @param $mimeStr mime header string
|
||
438 | * @param $inputCharset input charset
|
||
439 | * @param $targetCharset target charset
|
||
440 | * @param $fallbackCharset charset used if input charset not supported by mb
|
||
441 | * @return decoded string
|
||
442 | */
|
||
443 | function decodeMimeString($mimeStr, $inputCharset='utf-8', $targetCharset='utf-8', $fallbackCharset='iso-8859-1') { |
||
444 | if (function_exists('mb_list_encodings')&&function_exists('mb_convert_encoding')){ |
||
445 | $encodings=$this->mb_list_lowerencodings(); |
||
446 | $inputCharset=strtolower($inputCharset); |
||
447 | $targetCharset=strtolower($targetCharset); |
||
448 | $fallbackCharset=strtolower($fallbackCharset); |
||
449 | |||
450 | $decodedStr=''; |
||
451 | $mimeStrs=imap_mime_header_decode($mimeStr); |
||
452 | for ($n=sizeOf($mimeStrs), $i=0; $i<$n; $i++) { |
||
453 | $mimeStr=$mimeStrs[$i]; |
||
454 | $mimeStr->charset=strtolower($mimeStr->charset); |
||
455 | if (($mimeStr == 'default' && $inputCharset == $targetCharset) |
||
456 | || $mimeStr->charset == $targetCharset) { |
||
457 | $decodedStr.=$mimeStr->text; |
||
458 | } else {
|
||
459 | if (in_array($mimeStr->charset, $encodings)){ |
||
460 | $this->charset= $mimeStr->charset; |
||
461 | } |
||
462 | |||
463 | $decodedStr.=mb_convert_encoding(
|
||
464 | $mimeStr->text, $targetCharset, |
||
465 | (in_array($mimeStr->charset, $encodings) ? |
||
466 | $mimeStr->charset : $fallbackCharset) |
||
467 | ); |
||
468 | } |
||
469 | } return $decodedStr; |
||
470 | } else {
|
||
471 | return $mimeStr; |
||
472 | } |
||
473 | |||
474 | } |
||
475 | |||
476 | ///Connect To the Mail Box
|
||
477 | function connect() |
||
478 | { |
||
479 | $this->marubox=imap_open($this->server,$this->username,$this->password); |
||
480 | } |
||
481 | |||
482 | /**
|
||
483 | * get the message structure if not already retrieved
|
||
484 | *
|
||
485 | * @param $mid : Message ID.
|
||
486 | *
|
||
487 | */
|
||
488 | function getStructure ($mid) |
||
489 | { |
||
490 | if ($mid != $this->mid || !$this->structure) { |
||
491 | $this->structure = imap_fetchstructure($this->marubox,$mid); |
||
492 | if ($this->structure) { |
||
493 | $this->mid = $mid; |
||
494 | } |
||
495 | } |
||
496 | } |
||
497 | /**
|
||
498 | *This function is use full to Get Header info from particular mail
|
||
499 | *
|
||
500 | * @param $mid = Mail Id of a Mailbox
|
||
501 | *
|
||
502 | * @return Return Associative array with following keys
|
||
503 | * subject => Subject of Mail
|
||
504 | * to => To Address of that mail
|
||
505 | * toOth => Other To address of mail
|
||
506 | * toNameOth => To Name of Mail
|
||
507 | * from => From address of mail
|
||
508 | * fromName => Form Name of Mail
|
||
509 | */
|
||
510 | function getHeaders($mid) // Get Header info |
||
511 | { |
||
512 | $mail_header=imap_header($this->marubox,$mid); |
||
513 | $sender=$mail_header->from[0]; |
||
514 | $sender_replyto=$mail_header->reply_to[0]; |
||
515 | if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster') |
||
516 | { |
||
517 | $mail_details=array( |
||
518 | 'from'=>strtolower($sender->mailbox).'@'.$sender->host, |
||
519 | //'fromName'=>$sender->personal,
|
||
520 | //'toOth'=>strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host,
|
||
521 | //'toNameOth'=>$sender_replyto->personal,
|
||
522 | 'subject'=>$mail_header->subject, |
||
523 | //'to'=>strtolower($mail_header->toaddress)
|
||
524 | ); |
||
525 | } |
||
526 | return $mail_details; |
||
527 | } |
||
528 | |||
529 | /**Get Mime type Internal Private Use
|
||
530 | * @param $structure mail structure
|
||
531 | * @return mime type
|
||
532 | */
|
||
533 | function get_mime_type(&$structure) { |
||
534 | $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); |
||
535 | |||
536 | if($structure->subtype) { |
||
537 | return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype; |
||
538 | } |
||
539 | return "TEXT/PLAIN"; |
||
540 | } |
||
541 | |||
542 | |||
543 | /**Get Part Of Message Internal Private Use
|
||
544 | * @param $stream An IMAP stream returned by imap_open
|
||
545 | * @param $msg_number The message number
|
||
546 | * @param $mime_type mime type of the mail
|
||
547 | * @param $structure struture of the mail
|
||
548 | * @param $part_number The part number.
|
||
549 | * @return data of false if error
|
||
550 | */
|
||
551 | function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) { |
||
552 | if($structure) { |
||
553 | if($mime_type == $this->get_mime_type($structure)){ |
||
554 | if(!$part_number) { |
||
555 | $part_number = "1"; |
||
556 | } |
||
557 | $text = imap_fetchbody($stream, $msg_number, $part_number); |
||
558 | if($structure->encoding == 3) { |
||
559 | return imap_base64($text); |
||
560 | } else if($structure->encoding == 4) { |
||
561 | return imap_qprint($text); |
||
562 | } else {
|
||
563 | return $text; |
||
564 | } |
||
565 | } |
||
566 | if($structure->type == 1){ /* multipart */ |
||
567 | $prefix=""; |
||
568 | reset($structure->parts); |
||
569 | while(list($index, $sub_structure) = each($structure->parts)){ |
||
570 | if($part_number){ |
||
571 | $prefix = $part_number . '.'; |
||
572 | } |
||
573 | $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); |
||
574 | if($data){ |
||
575 | return $data; |
||
576 | } |
||
577 | } |
||
578 | } |
||
579 | } |
||
580 | return false; |
||
581 | } |
||
582 | |||
583 | /**
|
||
584 | * used to get total unread mail from That mailbox
|
||
585 | *
|
||
586 | * Return :
|
||
587 | * Int Total Mail
|
||
588 | */
|
||
589 | function getTotalMails() //Get Total Number off Unread Email In Mailbox |
||
590 | { |
||
591 | $headers=imap_headers($this->marubox); |
||
592 | return count($headers); |
||
593 | } |
||
594 | |||
595 | /**
|
||
596 | *GetAttech($mid,$path) / Prefer use getAttached
|
||
597 | *Save attached file from mail to given path of a particular location
|
||
598 | *
|
||
599 | * @param $mid mail id
|
||
600 | * @param $path path where to save
|
||
601 | *
|
||
602 | * @return String of filename with coma separated
|
||
603 | *like a.gif,pio.jpg etc
|
||
604 | */
|
||
605 | function GetAttech($mid,$path) { |
||
606 | $struckture = imap_fetchstructure($this->marubox,$mid); |
||
607 | $ar=""; |
||
608 | if (isset($struckture->parts)&&count($struckture->parts)>0){ |
||
609 | foreach($struckture->parts as $key => $value) |
||
610 | { |
||
611 | $enc=$struckture->parts[$key]->encoding; |
||
612 | if($struckture->parts[$key]->ifdparameters) |
||
613 | { |
||
614 | $name=$struckture->parts[$key]->dparameters[0]->value; |
||
615 | $message = imap_fetchbody($this->marubox,$mid,$key+1); |
||
616 | if ($enc == 0) |
||
617 | $message = imap_7bit($message); |
||
618 | if ($enc == 1) |
||
619 | $message = imap_8bit ($message); |
||
620 | if ($enc == 2) |
||
621 | $message = imap_binary ($message); |
||
622 | if ($enc == 3) |
||
623 | $message = imap_base64 ($message); |
||
624 | if ($enc == 4) |
||
625 | $message = quoted_printable_decode($message); |
||
626 | if ($enc == 5) |
||
627 | $message = $message; |
||
628 | $fp=fopen($path.$name,"w"); |
||
629 | fwrite($fp,$message); |
||
630 | fclose($fp); |
||
631 | $ar=$ar.$name.","; |
||
632 | } |
||
633 | } |
||
634 | } |
||
635 | $ar=substr($ar,0,(strlen($ar)-1)); |
||
636 | return $ar; |
||
637 | } |
||
638 | |||
639 | /**
|
||
640 | * Private function : Recursivly get attached documents
|
||
641 | *
|
||
642 | * @param $mid : message id
|
||
643 | * @param $path : temporary path
|
||
644 | * @param $maxsize : of document to be retrieved
|
||
645 | * @param $structure : of the message or part
|
||
646 | * @param $part : part for recursive
|
||
647 | *
|
||
648 | * Result is stored in $this->files
|
||
649 | *
|
||
650 | */
|
||
651 | function getRecursiveAttached ($mid, $path, $maxsize, $structure, $part="") |
||
652 | { |
||
653 | global $LANG; |
||
654 | |||
655 | if ($structure->type == 1) { // multipart |
||
656 | reset($structure->parts); |
||
657 | while(list($index, $sub) = each($structure->parts)) { |
||
658 | $this->getRecursiveAttached($mid, $path, $maxsize, $sub, ($part ? $part.".".($index+1) : ($index+1))); |
||
659 | } |
||
660 | } else if ($structure->ifdparameters) { |
||
661 | |||
662 | //get filename of attachment if present
|
||
663 | $filename=''; |
||
664 | // if there are any dparameters present in this part
|
||
665 | if (count($structure->dparameters)>0){ |
||
666 | foreach ($structure->dparameters as $dparam){ |
||
667 | if ((strtoupper($dparam->attribute)=='NAME') ||(strtoupper($dparam->attribute)=='FILENAME')) $filename=$dparam->value; |
||
668 | } |
||
669 | } |
||
670 | //if no filename found
|
||
671 | if ($filename==''){ |
||
672 | // if there are any parameters present in this part
|
||
673 | if (count($structure->parameters)>0){ |
||
674 | foreach ($structure->parameters as $param){ |
||
675 | if ((strtoupper($param->attribute)=='NAME') ||(strtoupper($param->attribute)=='FILENAME')) $filename=$param->value; |
||
676 | } |
||
677 | } |
||
678 | } |
||
679 | $filename=$this->decodeMimeString($filename); |
||
680 | |||
681 | if ($structure->bytes > $maxsize) { |
||
682 | $this->addtobody .= "<br>".$LANG["mailgate"][6]." (" . getSize($structure->bytes) . "): ".$filename; |
||
683 | return false; |
||
684 | } |
||
685 | if (!isValidDoc($filename)){ |
||
686 | $this->addtobody .= "<br>".$LANG["mailgate"][5]." (" . $this->get_mime_type($structure) . "): ".$filename; |
||
687 | return false; |
||
688 | } |
||
689 | if ($message=imap_fetchbody($this->marubox, $mid, $part)) { |
||
690 | switch ($structure->encoding) |
||
691 | { |
||
692 | case 0: $message = imap_7bit($message); break; |
||
693 | case 1: $message = imap_8bit($message); break; |
||
694 | case 2: $message = imap_binary($message); break; |
||
695 | case 3: $message = imap_base64($message); break; |
||
696 | case 4: $message = quoted_printable_decode($message); break; |
||
697 | } |
||
698 | $fp=fopen($path.$filename,"w"); |
||
699 | if ($fp) { |
||
700 | fwrite($fp,$message); |
||
701 | fclose($fp); |
||
702 | |||
703 | $this->files['multiple'] = true; |
||
704 | $j = count($this->files)-1; |
||
705 | $this->files[$j]['filename']['size'] = $structure->bytes; |
||
706 | $this->files[$j]['filename']['name'] = $filename; |
||
707 | $this->files[$j]['filename']['tmp_name'] = $path.$filename; |
||
708 | $this->files[$j]['filename']['type'] = $this->get_mime_type($structure); |
||
709 | } |
||
710 | } // fetchbody
|
||
711 | } // ifdparameters
|
||
712 | } |
||
713 | |||
714 | /**
|
||
715 | * Public function : get attached documents in a mail
|
||
716 | *
|
||
717 | * @param $mid : message id
|
||
718 | * @param $path : temporary path
|
||
719 | * @param $maxsize : of document to be retrieved
|
||
720 | *
|
||
721 | * @return array like $_FILES
|
||
722 | *
|
||
723 | */
|
||
724 | function getAttached ($mid, $path, $maxsize) |
||
725 | { |
||
726 | $this->getStructure($mid); |
||
727 | $this->files = array(); |
||
728 | $this->addtobody=""; |
||
729 | $this->getRecursiveAttached($mid, $path, $maxsize, $this->structure); |
||
730 | |||
731 | return ($this->files); |
||
732 | } |
||
733 | /**
|
||
734 | * Get The actual mail content from this mail
|
||
735 | *
|
||
736 | * @param $mid : mail Id
|
||
737 | */
|
||
738 | function getBody($mid) // Get Message Body |
||
739 | { |
||
740 | $this->getStructure($mid); |
||
741 | |||
742 | $body = $this->get_part($this->marubox, $mid, "TEXT/HTML", $this->structure); |
||
743 | if ($body == "") { |
||
744 | $body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN", $this->structure); |
||
745 | } |
||
746 | if ($body == "") { |
||
747 | return ""; |
||
748 | } |
||
749 | return $body; |
||
750 | } |
||
751 | |||
752 | /**
|
||
753 | * Delete mail from that mail box
|
||
754 | *
|
||
755 | * @param $mid : mail Id
|
||
756 | */
|
||
757 | function deleteMails($mid) { |
||
758 | imap_delete($this->marubox,$mid); |
||
759 | } |
||
760 | |||
761 | /**
|
||
762 | * Close The Mail Box
|
||
763 | *
|
||
764 | */
|
||
765 | function close_mailbox() { |
||
766 | imap_close($this->marubox,CL_EXPUNGE); |
||
767 | } |
||
768 | |||
769 | } |
||
770 | |||
771 | ?> |