📄 imap.php
字号:
$result[] = $this->escapeString($string); } return $result; } /** * escape a list with literals or lists * * @param array $list list with literals or lists as PHP array * @return string escaped list for imap */ public function escapeList($list) { $result = array(); foreach ($list as $k => $v) { if (!is_array($v)) {// $result[] = $this->escapeString($v); $result[] = $v; continue; } $result[] = $this->escapeList($v); } return '(' . implode(' ', $result) . ')'; } /** * Login to IMAP server. * * @param string $user username * @param string $password password * @return bool success * @throws Zend_Mail_Protocol_Exception */ public function login($user, $password) { return $this->requestAndResponse('LOGIN', $this->escapeString($user, $password), true); } /** * logout of imap server * * @return bool success */ public function logout() { $result = false; if ($this->_socket) { try { $result = $this->requestAndResponse('LOGOUT', array(), true); } catch (Zend_Mail_Protocol_Exception $e) { // ignoring exception } fclose($this->_socket); $this->_socket = null; } return $result; } /** * Get capabilities from IMAP server * * @return array list of capabilities * @throws Zend_Mail_Protocol_Exception */ public function capability() { $response = $this->requestAndResponse('CAPABILITY'); if (!$response) { return $response; } $capabilities = array(); foreach ($response as $line) { $capabilities = array_merge($capabilities, $line); } return $capabilities; } /** * Examine and select have the same response. The common code for both * is in this method * * @param string $command can be 'EXAMINE' or 'SELECT' and this is used as command * @param string $box which folder to change to or examine * @return bool|array false if error, array with returned information * otherwise (flags, exists, recent, uidvalidity) * @throws Zend_Mail_Protocol_Exception */ public function examineOrSelect($command = 'EXAMINE', $box = 'INBOX') { $this->sendRequest($command, array($this->escapeString($box)), $tag); $result = array(); while (!$this->readLine($tokens, $tag)) { if ($tokens[0] == 'FLAGS') { array_shift($tokens); $result['flags'] = $tokens; continue; } switch ($tokens[1]) { case 'EXISTS': case 'RECENT': $result[strtolower($tokens[1])] = $tokens[0]; break; case '[UIDVALIDITY': $result['uidvalidity'] = (int)$tokens[2]; break; default: // ignore } } if ($tokens[0] != 'OK') { return false; } return $result; } /** * change folder * * @param string $box change to this folder * @return bool|array see examineOrselect() * @throws Zend_Mail_Protocol_Exception */ public function select($box = 'INBOX') { return $this->examineOrSelect('SELECT', $box); } /** * examine folder * * @param string $box examine this folder * @return bool|array see examineOrselect() * @throws Zend_Mail_Protocol_Exception */ public function examine($box = 'INBOX') { return $this->examineOrSelect('EXAMINE', $box); } /** * fetch one or more items of one or more messages * * @param string|array $items items to fetch from message(s) as string (if only one item) * or array of strings * @param int $from message for items or start message if $to !== null * @param int|null $to if null only one message ($from) is fetched, else it's the * last message, INF means last message avaible * @return string|array if only one item of one message is fetched it's returned as string * if items of one message are fetched it's returned as (name => value) * if one items of messages are fetched it's returned as (msgno => value) * if items of messages are fetchted it's returned as (msgno => (name => value)) * @throws Zend_Mail_Protocol_Exception */ public function fetch($items, $from, $to = null) { if (is_array($from)) { $set = implode(',', $from); } else if ($to === null) { $set = (int)$from; } else if ($to === INF) { $set = (int)$from . ':*'; } else { $set = (int)$from . ':' . (int)$to; } $items = (array)$items; $itemList = $this->escapeList($items); $this->sendRequest('FETCH', array($set, $itemList), $tag); $result = array(); while (!$this->readLine($tokens, $tag)) { // ignore other responses if ($tokens[1] != 'FETCH') { continue; } // ignore other messages if ($to === null && !is_array($from) && $tokens[0] != $from) { continue; } // if we only want one item we return that one directly if (count($items) == 1) { if ($tokens[2][0] == $items[0]) { $data = $tokens[2][1]; } else { // maybe the server send an other field we didn't wanted $count = count($tokens[2]); // we start with 2, because 0 was already checked for ($i = 2; $i < $count; $i += 2) { if ($tokens[2][$i] != $items[0]) { continue; } $data = $tokens[2][$i + 1]; break; } } } else { $data = array(); while (key($tokens[2]) !== null) { $data[current($tokens[2])] = next($tokens[2]); next($tokens[2]); } } // if we want only one message we can ignore everything else and just return if ($to === null && !is_array($from) && $tokens[0] == $from) { // we still need to read all lines while (!$this->readLine($tokens, $tag)); return $data; } $result[$tokens[0]] = $data; } if ($to === null && !is_array($from)) { /** * @see Zend_Mail_Protocol_Exception */ require_once 'Zend/Mail/Protocol/Exception.php'; throw new Zend_Mail_Protocol_Exception('the single id was not found in response'); } return $result; } /** * get mailbox list * * this method can't be named after the IMAP command 'LIST', as list is a reserved keyword * * @param string $reference mailbox reference for list * @param string $mailbox mailbox name match with wildcards * @return array mailboxes that matched $mailbox as array(globalName => array('delim' => .., 'flags' => ..)) * @throws Zend_Mail_Protocol_Exception */ public function listMailbox($reference = '', $mailbox = '*') { $result = array(); $list = $this->requestAndResponse('LIST', $this->escapeString($reference, $mailbox)); if (!$list) { return $result; } foreach ($list as $item) { if (count($item) != 4 || $item[0] != 'LIST') { continue; } $result[$item[3]] = array('delim' => $item[2], 'flags' => $item[1]); } return $result; } /** * set flags * * @param array $flags flags to set, add or remove - see $mode * @param int $from message for items or start message if $to !== null * @param int|null $to if null only one message ($from) is fetched, else it's the * last message, INF means last message avaible * @param string|null $mode '+' to add flags, '-' to remove flags, everything else sets the flags as given * @param bool $silent if false the return values are the new flags for the wanted messages * @return bool|array new flags if $silent is false, else true or false depending on success * @throws Zend_Mail_Protocol_Exception */ public function store(array $flags, $from, $to = null, $mode = null, $silent = true) { $item = 'FLAGS'; if ($mode == '+' || $mode == '-') { $item = $mode . $item; } if ($silent) { $item .= '.SILENT'; } $flags = $this->escapeList($flags); $set = (int)$from; if ($to != null) { $set .= ':' . ($to == INF ? '*' : (int)$to); } $result = $this->requestAndResponse('STORE', array($set, $item, $flags), $silent); if ($silent) { return $result ? true : false; } $tokens = $result; $result = array(); foreach ($tokens as $token) { if ($token[1] != 'FETCH' || $token[2][0] != 'FLAGS') { continue; } $result[$token[0]] = $token[2][1]; } return $result; } /** * append a new message to given folder * * @param string $folder name of target folder * @param string $message full message content * @param array $flags flags for new message * @param string $date date for new message * @return bool success * @throws Zend_Mail_Protocol_Exception */ public function append($folder, $message, $flags = null, $date = null) { $tokens = array(); $tokens[] = $this->escapeString($folder); if ($flags !== null) { $tokens[] = $this->escapeList($flags); } if ($date !== null) { $tokens[] = $this->escapeString($date); } $tokens[] = $this->escapeString($message); return $this->requestAndResponse('APPEND', $tokens, true); } /** * copy message set from current folder to other folder * * @param string $folder destination folder * @param int|null $to if null only one message ($from) is fetched, else it's the * last message, INF means last message avaible * @return bool success * @throws Zend_Mail_Protocol_Exception */ public function copy($folder, $from, $to = null) { $set = (int)$from; if ($to != null) { $set .= ':' . ($to == INF ? '*' : (int)$to); } return $this->requestAndResponse('COPY', array($set, $this->escapeString($folder)), true); } /** * create a new folder (and parent folders if needed) * * @param string $folder folder name * @return bool success */ public function create($folder) { return $this->requestAndResponse('CREATE', array($this->escapeString($folder)), true); } /** * rename an existing folder * * @param string $old old name * @param string $new new name * @return bool success */ public function rename($old, $new) { return $this->requestAndResponse('RENAME', $this->escapeString($old, $new), true); } /** * remove a folder * * @param string $folder folder name * @return bool success */ public function delete($folder) { return $this->requestAndResponse('DELETE', array($this->escapeString($folder)), true); } /** * permanently remove messages * * @return bool success */ public function expunge() { // TODO: parse response? return $this->requestAndResponse('EXPUNGE'); } /** * send noop * * @return bool success */ public function noop() { // TODO: parse response return $this->requestAndResponse('NOOP'); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -