* @package AgileBill * @version 1.4.93 */ class email_piping { var $results; var $delete_action=true; var $move_mbox='Trash'; var $get_attachments=true; var $max_attachment=2048; // max filesize of attachment in KB /** * Start the email retrieval * * @param int $id email_setup.id */ function email_piping($id) { global $C_debug; # check for imap support: if(!is_callable('imap_open')) { $C_debug->error('core::email_piping','email_piping()', 'imap_open() - not supported'); return; } $db = &DB(); $sql = 'SELECT * FROM ' . AGILE_DB_PREFIX . 'setup_email WHERE site_id = ' . $db->qstr(DEFAULT_SITE) . ' AND id = ' . $db->qstr($id); $result = $db->Execute($sql); if($result && $result->RecordCount()) { $this->cfg = $result->fields; $this->delete_action = $this->cfg['piping_action']; $type = $this->cfg['piping']; // imap/pop // get imap_open connection string $constr = $this->get_connection_string($type, $this->cfg['piping_host']); // attempt connection error_reporting(0); @$mbox = imap_open($constr, $this->cfg['piping_username'], $this->cfg['piping_password']); // attempt alternate conneciton if(!$mbox) { $constr = $this->get_connection_string($type+2, $this->cfg['piping_host']); @$mbox = imap_open($constr, $this->cfg['piping_username'], $this->cfg['piping_password']); } // error log if(!$mbox) { $C_debug->error('core::email_piping','email_piping()', imap_last_error() .' -- '. $constr ); return false; } // check for messages if (@$hdr = imap_check($mbox)) { $msgCount = $hdr->Nmsgs; if($msgCount==0) return false; } else { return false; // no messages } // get folder overview @$overview=imap_fetch_overview($mbox,"1:$msgCount",0); $size=sizeof($overview); // loop through messages for($i=$size-1;$i>=0;$i--) { $val=$overview[$i]; $msg=$val->msgno; $this->attachments[$msg]=false; // formatting for from e-mail address $from=$val->from; $sender=$from=$val->from; $from=ereg_replace("\"","",$from); if(ereg("<",$from)) { $f=explode("<", $from); $sender=$f[0]; $from=$f[1]; $from=str_replace(">","",$from); } // retrieve body $body = $this->get_part($mbox, $msg, "TEXT/PLAIN"); if(empty($body)) { $body = $this->get_part($mbox, $msg, "TEXT/HTML"); if(!empty($body)) $body=str_replace("
", "\r\n", $body); } // get attachements if($this->get_attachments) { $struct=imap_fetchstructure($mbox,$msg); $contentParts = count($struct->parts); if ($contentParts >= 2) { for ($ii=2; $ii<=$contentParts; $ii++) { $c=($ii-2); $att[$c] = imap_bodystruct($mbox,$msg,$ii); } // download tmp file and add to attachemnt array for ($k=0;$kdownload_file($mbox, $msg, $k, $att[$k]->parameters[0]->value); } } } // Set the result array: $this->results[] = Array('uniqueId' => $val->message_id, 'date' => $val->date, 'from' => trim($from), 'to' => $val->to, 'sender' => trim($sender), 'subject' => trim($val->subject), 'body' => trim($body), 'attach' => $this->attachments[$msg]); // mark for deletion or move if($this->cfg['piping_action'] == 1) { if($this->delete_action) imap_delete($mbox, $msg); else if(($type==2 || $type==4 ) && !empty($this->move_mbox)) imap_mail_move($mbox, $msg, $this->move_mbox); } } imap_close($mbox, CL_EXPUNGE); } } /** * Get an attached file */ function download_file(&$mbox, $msg, $file, $filename) { $filetype = strrev(substr(strrev($filename),0,3)); $filecontent = imap_fetchbody($mbox,$msg,$file+2); if(empty($filecontent)) return false; $tmp = PATH_FILES.'/'. md5('piping'.$filename.microtime()); file_put_contents($tmp,$filecontent); $this->attachments[$msg][] = Array('tmp'=>$tmp, 'file'=>$filename, 'type'=> $filetype); } /** * Get MIME Type */ function get_mime_type(&$structure) { $primary_mime_type = array("TEXT", "MULTIPART","MESSAGE", "APPLICATION", "AUDIO","IMAGE", "VIDEO", "OTHER"); if($structure->subtype) { return $primary_mime_type[(int) $structure->type] . '/' .$structure->subtype; } return "TEXT/PLAIN"; } /** * Get Message Part */ function get_part($stream, $msg_number, $mime_type, $structure=false, $part_number=false) { if(!$structure) { $structure = imap_fetchstructure($stream, $msg_number); } if($structure) { if($mime_type == $this->get_mime_type($structure)) { if(!$part_number) { $part_number = "1"; } $text = imap_fetchbody($stream, $msg_number, $part_number); if($structure->encoding == 3) { return imap_base64($text); } else if($structure->encoding == 4) { return imap_qprint($text); } else { return $text; } } // multipart if($structure->type == 1) { while(list($index, $sub_structure) = each($structure->parts)) { if($part_number) { $prefix = $part_number . '.'; } $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, @$prefix.($index + 1)); if($data) { return $data; } } } } return false; } /** * Get a connection string to use * * @param string $type 1=pop3, 2=imap, 3=pop3 alternate, 4=imap alternate * @param string $host HOSTNAME OR HOSTNAME:PORT|MBOX * @return string Connection string for imap_open() */ function get_connection_string($type,$host,$port=false,$mbox=false) { # Determine the path, host, & mbox name: if(ereg(":", $host)) { $arr = explode(":", $host); # host @$host = $arr[0]; # port if(!$port && is_numeric($arr[1])) @$port = $arr[1]; # mbox elseif(preg_match('[|]', $arr[1])) { $arr2 = explode('|', $arr[1]); if(!$port && is_numeric($arr2[0]) ) @$port = $arr2[0]; if(!$mbox) @$mbox = $arr2[1]; } } # defaults: if(empty($port) && $type==1 || $type==3) $port = "110"; if(empty($port) && $type==2 || $type==4) ; if(empty($mbox)) $mbox = "INBOX"; // pop3 if($type==1) { if(empty($port)) $port = "110"; return "{".$host.":".$port."/pop3}".$mbox; } // pop3 alternate if($type==3) { if(empty($port)) $port = "110"; return "{".$host.":".$port."/pop3/notls/novalidate-cert}".$mbox; } // imap if($type==2 ) { if(empty($port)) $port = "143"; return "{".$host.":".$port."}".$mbox; } // imap alternate if($type==4 ) { if(empty($port)) $port = "143"; return "{".$host.":".$port."/imap/notls/novalidate-cert}".$mbox; } return string; } } ?>