function downloadFromMailbox(&$_reload, $_type, $_server, $_port, $_password, $_account, $_secure, $_delete, $_test = false)
{
    global $CONFIG;
    $starttime = time();
    $executiontime = setTimeLimit(CALLER_TIMEOUT - 10);
    loadLibrary("ZEND", "Zend_Mail");
    $list = array();
    $config = array('host' => $_server, 'auth' => 'login', 'user' => $_account, 'password' => $_password, 'port' => $_port);
    if (!empty($_secure)) {
        $config['ssl'] = $_secure == 1 ? 'SSL' : 'TLS';
    }
    try {
        if ($_type == "IMAP") {
            loadLibrary("ZEND", "Zend_Mail_Storage_Imap");
            $mail = new Zend_Mail_Storage_Imap($config);
        } else {
            loadLibrary("ZEND", "Zend_Mail_Storage_Pop3");
            $mail = new Zend_Mail_Storage_Pop3($config);
        }
    } catch (Exception $e) {
        if ($_test) {
            throw $e;
        } else {
            handleError("111", $_server . " " . $_type . " mailbox connection error: " . $e->getMessage(), "functions.global.inc.php", 0);
        }
        return $list;
    }
    $message = null;
    $delete = array();
    $subject = "";
    try {
        $counter = 0;
        foreach ($mail as $mnum => $message) {
            if ($_test) {
                return count($mail);
            }
            try {
                $temail = new TicketEmail();
                if ($message->headerExists("subject")) {
                    $subject = $temail->Subject = mimeHeaderDecode($message->Subject);
                }
                if ($message->headerExists("message-id")) {
                    $temail->Id = str_replace(array("<", ">"), "", $message->MessageId);
                }
                if (empty($temail->Id)) {
                    $temail->Id = getId(32);
                }
                if ($_delete) {
                    $delete[$mnum] = $temail->Id;
                }
                if (strpos($message->From, "<") !== false) {
                    $fromparts = explode("<", str_replace(">", "", $message->From));
                    if (!empty($fromparts[0])) {
                        $temail->Name = str_replace(array("\""), "", mimeHeaderDecode(trim($fromparts[0])));
                    }
                    $temail->Email = trim($fromparts[1]);
                } else {
                    $temail->Email = trim($message->From);
                }
                if (strpos($message->To, "<") !== false) {
                    $toparts = explode("<", str_replace(">", "", $message->To));
                    $temail->ReceiverEmail = trim($toparts[1]);
                } else {
                    $temail->ReceiverEmail = trim($message->To);
                }
                if ($message->headerExists("reply-to")) {
                    if (strpos($message->ReplyTo, "<") !== false) {
                        $rtoparts = explode("<", str_replace(">", "", $message->ReplyTo));
                        $temail->ReplyTo = trim($rtoparts[1]);
                    } else {
                        $temail->ReplyTo = trim($message->ReplyTo);
                    }
                }
                $parts = array();
                if ($message->isMultipart()) {
                    foreach (new RecursiveIteratorIterator($message) as $part) {
                        $parts[] = $part;
                    }
                } else {
                    $parts[] = $message;
                }
                foreach ($parts as $part) {
                    try {
                        if ($part->headerExists("content-type")) {
                            $ctype = $part->contentType;
                        } else {
                            $ctype = 'text/html';
                        }
                        if ($part->headerExists("content-disposition")) {
                            $ctype .= "; " . $part->contentDisposition;
                        }
                        $charset = "";
                        $hparts = explode(";", str_replace(" ", "", $ctype));
                        foreach ($hparts as $hpart) {
                            if (strpos(strtolower($hpart), "charset=") === 0) {
                                $charset = trim(str_replace(array("charset=", "'", "\""), "", strtolower($hpart)));
                            }
                        }
                        $isatt = strpos(strtolower($ctype), "name=") !== false || strpos(strtolower($ctype), "filename=") !== false;
                        if (DEBUG_MODE) {
                            logit(" PROCESSING EMAIL / charset:" . $ctype . " - " . $charset . " - " . $subject . " - " . $isatt);
                        }
                        if (!$isatt && (($html = strpos(strtolower($ctype), 'text/html') !== false) || strpos(strtolower($ctype), 'text/plain') !== false)) {
                            $content = $part->getContent();
                            foreach ($part->getHeaders() as $name => $value) {
                                if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'quoted-printable') !== false) {
                                    $content = quoted_printable_decode($content);
                                } else {
                                    if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'base64') !== false) {
                                        $content = base64_decode($content);
                                    }
                                }
                            }
                            if ($html) {
                                if (!empty($CONFIG["gl_avhe"])) {
                                    $temail->BodyHTML = max($temail->BodyHTML, $content);
                                }
                                @set_error_handler("ignoreError");
                                try {
                                    require_once LIVEZILLA_PATH . "_lib/trdp/html2text.php";
                                    $content = convert_html_to_text($content);
                                } catch (Exception $e) {
                                    $content = preg_replace("/<style\\b[^>]*>(.*?)<\\/style>/s", "", $content);
                                    $content = trim(html_entity_decode(strip_tags($content), ENT_COMPAT, "UTF-8"));
                                    $content = preg_replace('/[\\s\\s\\s\\s\\s\\s]+/', " ", $content);
                                }
                                @set_error_handler("handleError");
                            }
                            if ((!$html || empty($temail->Body)) && !empty($content)) {
                                if (strpos(strtolower($charset), 'utf-8') === false && !empty($charset)) {
                                    if (DEBUG_MODE) {
                                        logit(" PROCESSING EMAIL / iconv | " . strtoupper($charset) . " | " . 'UTF-8' . " | " . $subject);
                                    }
                                    $temail->Body = @iconv(strtoupper($charset), 'UTF-8', $content);
                                } else {
                                    if ($html && empty($charset)) {
                                        $temail->Body = utf8_encode($content);
                                    } else {
                                        $temail->Body = $content;
                                    }
                                }
                            }
                        } else {
                            $filename = "";
                            $fileid = getId(32);
                            $unknown = getId(32);
                            $filesid = $CONFIG["gl_lzid"] . "_" . $fileid;
                            foreach ($hparts as $hpart) {
                                $hpart = mimeHeaderDecode($hpart);
                                if (strpos(strtolower(trim($hpart)), "name=") === 0 || strpos(strtolower(trim($hpart)), "filename=") === 0) {
                                    $filename = trim(str_replace(array("filename=", "name=", "'", "\""), "", strtolower($hpart)));
                                } else {
                                    if ($part->headerExists("content-id") && empty($filename)) {
                                        $filename = trim(str_replace(array("<", ">", "'", "\""), "", strtolower($part->contentId)));
                                    } else {
                                        if (strpos(strtolower($ctype), 'message/rfc822') !== false && $part->headerExists("subject") && empty($filename)) {
                                            $filename = trim($part->Subject) . ".eml";
                                        } else {
                                            if (strpos(strtolower($ctype), 'message/rfc822') !== false) {
                                                $unknown = "unknown.eml";
                                            }
                                        }
                                    }
                                }
                            }
                            $base64dec = !(strpos(strtolower($ctype), 'message/rfc822') !== false || strpos(strtolower($ctype), 'text/plain') !== false);
                            foreach ($part->getHeaders() as $name => $value) {
                                if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'base64') !== false) {
                                    $base64dec = true;
                                }
                            }
                            $filename = empty($filename) ? $unknown : str_replace(array("\\", ":", "?", "*", "<", ">", "|", "/", "\""), "", $filename);
                            $content = !$base64dec ? $part->getContent() : base64_decode($part->getContent());
                            $temail->Attachments[$fileid] = array($filesid, $filename, $content);
                            if (DEBUG_MODE) {
                                logit("ADD ATT: " . $filesid . " - " . $filename . " - " . $ctype);
                            }
                        }
                    } catch (Exception $e) {
                        handleError("112", $_server . " imap Email Part Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
                    }
                }
                $temail->Created = strtotime($message->Date);
                if ((!is_numeric($temail->Created) || empty($temail->Created)) && $message->headerExists("delivery-date")) {
                    $temail->Created = strtotime($message->DeliveryDate);
                }
                if (!is_numeric($temail->Created) || empty($temail->Created)) {
                    $temail->Created = time();
                }
                $list[] = $temail;
                if (time() - $starttime >= $executiontime / 2 || $counter++ > DATA_ITEM_LOADS) {
                    $_reload = true;
                    break;
                }
            } catch (Exception $e) {
                if ($_test) {
                    throw $e;
                } else {
                    handleError("115", $_type . " Email Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
                }
            }
        }
        try {
            krsort($delete);
            foreach ($delete as $num => $id) {
                $mail->removeMessage($num);
            }
        } catch (Exception $e) {
            if ($_test) {
                throw $e;
            } else {
                handleError("114", $_type . " Email delete error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
            }
        }
    } catch (Exception $e) {
        if ($_test) {
            throw $e;
        } else {
            handleError("113", $_type . " Email Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
        }
    }
    return $list;
}
 private function ZENDParseEmails(&$_reload, $mails, $_delete, $_test)
 {
     $list = array();
     $message = null;
     $starttime = time();
     $executiontime = Server::SetTimeLimit(CALLER_TIMEOUT - 10);
     $delete = array();
     $subject = "";
     try {
         $counter = 0;
         foreach ($mails as $mnum => $message) {
             if ($_test) {
                 return count($mails);
             }
             try {
                 $temail = new TicketEmail();
                 if ($message->headerExists("subject")) {
                     $subject = $temail->Subject = mimeHeaderDecode($message->Subject);
                 }
                 if ($message->headerExists("message-id")) {
                     $temail->Id = str_replace(array("<", ">"), "", $message->MessageId);
                 }
                 if (empty($temail->Id)) {
                     $temail->Id = getId(32);
                 }
                 if ($_delete) {
                     $delete[$mnum] = $temail->Id;
                 }
                 if (strpos($message->From, "<") !== false) {
                     $fromparts = explode("<", str_replace(">", "", $message->From));
                     if (!empty($fromparts[0])) {
                         $temail->Name = str_replace(array("\""), "", mimeHeaderDecode(trim($fromparts[0])));
                     }
                     $temail->Email = trim($fromparts[1]);
                 } else {
                     $temail->Email = trim($message->From);
                 }
                 if (strpos($message->To, "<") !== false) {
                     $toparts = explode("<", str_replace(">", "", $message->To));
                     $temail->ReceiverEmail = trim($toparts[1]);
                 } else {
                     $temail->ReceiverEmail = trim($message->To);
                 }
                 if ($message->headerExists("reply-to")) {
                     if (strpos($message->ReplyTo, "<") !== false) {
                         $rtoparts = explode("<", str_replace(">", "", $message->ReplyTo));
                         $temail->ReplyTo = trim($rtoparts[1]);
                     } else {
                         $temail->ReplyTo = trim($message->ReplyTo);
                     }
                 }
                 $parts = array();
                 if ($message->isMultipart()) {
                     foreach (new RecursiveIteratorIterator($message) as $part) {
                         $parts[] = $part;
                     }
                 } else {
                     $parts[] = $message;
                 }
                 foreach ($parts as $part) {
                     try {
                         if ($part->headerExists("content-type")) {
                             $ctype = $part->contentType;
                         } else {
                             $ctype = 'text/html';
                         }
                         if ($part->headerExists("content-disposition")) {
                             $ctype .= "; " . $part->contentDisposition;
                         }
                         $charset = "";
                         $hparts = explode(";", str_replace(" ", "", $ctype));
                         foreach ($hparts as $hpart) {
                             if (strpos(strtolower($hpart), "charset=") === 0) {
                                 $charset = trim(str_replace(array("charset=", "'", "\""), "", strtolower($hpart)));
                             }
                         }
                         $isatt = strpos(strtolower($ctype), "name=") !== false || strpos(strtolower($ctype), "filename=") !== false;
                         if (DEBUG_MODE) {
                             Logging::GeneralLog(" PROCESSING EMAIL / charset:" . $ctype . " - " . $charset . " - " . $subject . " - " . $isatt);
                         }
                         if (!$isatt && (($html = strpos(strtolower($ctype), 'text/html') !== false) || strpos(strtolower($ctype), 'text/plain') !== false)) {
                             $content = $part->getContent();
                             foreach ($part->getHeaders() as $name => $value) {
                                 if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'quoted-printable') !== false) {
                                     $content = quoted_printable_decode($content);
                                 } else {
                                     if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'base64') !== false) {
                                         $content = base64_decode($content);
                                     }
                                 }
                             }
                             if ($html) {
                                 $temail->BodyHTML = max($temail->BodyHTML, $content);
                                 $content = MailSystem::DownConvertHTML($content);
                             }
                             if ((!$html || empty($temail->Body)) && !empty($content)) {
                                 if (strpos(strtolower($charset), 'utf-8') === false && !empty($charset)) {
                                     if (DEBUG_MODE) {
                                         Logging::GeneralLog(" PROCESSING EMAIL / iconv | " . strtoupper($charset) . " | " . 'UTF-8' . " | " . $subject);
                                     }
                                     $temail->Body = @iconv(strtoupper($charset), 'UTF-8', $content);
                                 } else {
                                     if ($html && empty($charset)) {
                                         $temail->Body = utf8_encode($content);
                                     } else {
                                         $temail->Body = $content;
                                     }
                                 }
                             }
                         } else {
                             $filename = "";
                             $fileid = getId(32);
                             $unknown = getId(32);
                             $filesid = Server::$Configuration->File["gl_lzid"] . "_" . $fileid;
                             foreach ($hparts as $hpart) {
                                 $hpart = mimeHeaderDecode($hpart);
                                 if (strpos(strtolower(trim($hpart)), "name=") === 0 || strpos(strtolower(trim($hpart)), "filename=") === 0) {
                                     $filename = trim(str_replace(array("filename=", "name=", "'", "\""), "", strtolower($hpart)));
                                 } else {
                                     if ($part->headerExists("content-id") && empty($filename)) {
                                         $filename = trim(str_replace(array("<", ">", "'", "\""), "", strtolower($part->contentId)));
                                     } else {
                                         if (strpos(strtolower($ctype), 'message/rfc822') !== false && $part->headerExists("subject") && empty($filename)) {
                                             $filename = trim($part->Subject) . ".eml";
                                         } else {
                                             if (strpos(strtolower($ctype), 'message/rfc822') !== false) {
                                                 $unknown = "unknown.eml";
                                             }
                                         }
                                     }
                                 }
                             }
                             $base64dec = !(strpos(strtolower($ctype), 'message/rfc822') !== false || strpos(strtolower($ctype), 'text/plain') !== false);
                             foreach ($part->getHeaders() as $name => $value) {
                                 if (strpos(strtolower($name), 'content-transfer-encoding') !== false && strpos(strtolower($value), 'base64') !== false) {
                                     $base64dec = true;
                                 }
                             }
                             $filename = empty($filename) ? $unknown : str_replace(array("\\", ":", "?", "*", "<", ">", "|", "/", "\""), "", $filename);
                             $content = !$base64dec ? $part->getContent() : base64_decode($part->getContent());
                             $temail->Attachments[$fileid] = array($filesid, $filename, $content);
                             if (DEBUG_MODE) {
                                 Logging::GeneralLog("ADD ATT: " . $filesid . " - " . $filename . " - " . $ctype);
                             }
                         }
                     } catch (Exception $e) {
                         handleError("112", "IMAP Email Part Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
                     }
                 }
                 $temail->Created = strtotime($message->Date);
                 if ((!is_numeric($temail->Created) || empty($temail->Created)) && $message->headerExists("delivery-date")) {
                     $temail->Created = strtotime($message->DeliveryDate);
                 }
                 if (!is_numeric($temail->Created) || empty($temail->Created)) {
                     $temail->Created = time();
                 }
                 $list[] = $temail;
                 if (time() - $starttime >= $executiontime / 2 || $counter++ > DATA_ITEM_LOADS) {
                     $_reload = true;
                     break;
                 }
             } catch (Exception $e) {
                 if ($_test) {
                     throw $e;
                 } else {
                     handleError("115", "Email Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
                 }
             }
         }
         try {
             krsort($delete);
             foreach ($delete as $num => $id) {
                 $mails->removeMessage($num);
             }
         } catch (Exception $e) {
             if ($_test) {
                 throw $e;
             } else {
                 handleError("114", "Email delete error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
             }
         }
     } catch (Exception $e) {
         if ($_test) {
             throw $e;
         } else {
             handleError("113", "Email Error: " . $e->getMessage() . ", email: " . $subject, "functions.global.inc.php", 0);
         }
     }
     return $list;
 }