| | |
| | | $error = sprintf("Empty startup greeting (%s:%d)", $host, $this->prefs['port']); |
| | | |
| | | $this->setError(self::ERROR_BAD, $error); |
| | | $this->close(); |
| | | $this->closeConnection(); |
| | | return false; |
| | | } |
| | | |
| | |
| | | $res = $this->execute('STARTTLS'); |
| | | |
| | | if ($res[0] != self::ERROR_OK) { |
| | | $this->close(); |
| | | $this->closeConnection(); |
| | | return false; |
| | | } |
| | | |
| | | if (!stream_socket_enable_crypto($this->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { |
| | | $this->setError(self::ERROR_BAD, "Unable to negotiate TLS"); |
| | | $this->close(); |
| | | $this->closeConnection(); |
| | | return false; |
| | | } |
| | | |
| | |
| | | // Prevent from sending credentials in plain text when connection is not secure |
| | | if ($auth_method == 'LOGIN' && $this->getCapability('LOGINDISABLED')) { |
| | | $this->setError(self::ERROR_BAD, "Login disabled by IMAP server"); |
| | | $this->close(); |
| | | $this->closeConnection(); |
| | | return false; |
| | | } |
| | | // replace AUTH with CRAM-MD5 for backward compat. |
| | |
| | | return true; |
| | | } |
| | | |
| | | // Close connection |
| | | $this->close(); |
| | | $this->closeConnection(); |
| | | |
| | | return false; |
| | | } |
| | |
| | | return ($this->fp && $this->logged) ? true : false; |
| | | } |
| | | |
| | | function close() |
| | | function closeConnection() |
| | | { |
| | | if ($this->putLine($this->nextTag() . ' LOGOUT')) { |
| | | $this->readReply(); |
| | |
| | | $this->fp = false; |
| | | } |
| | | |
| | | /** |
| | | * Executes SELECT command (if mailbox is already not in selected state) |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return boolean True on success, false on error |
| | | * @access public |
| | | */ |
| | | function select($mailbox) |
| | | { |
| | | if (!strlen($mailbox)) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Executes STATUS comand |
| | | * Executes STATUS command |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * @param array $items Additional requested item names. By default |
| | |
| | | return false; |
| | | } |
| | | |
| | | function checkForRecent($mailbox) |
| | | /** |
| | | * Executes EXPUNGE command |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * @param string $messages Message UIDs to expunge |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | */ |
| | | function expunge($mailbox, $messages=NULL) |
| | | { |
| | | if (!strlen($mailbox)) { |
| | | $mailbox = 'INBOX'; |
| | | if (!$this->select($mailbox)) { |
| | | return false; |
| | | } |
| | | |
| | | $this->select($mailbox); |
| | | // Clear internal status cache |
| | | unset($this->data['STATUS:'.$mailbox]); |
| | | |
| | | if ($this->selected == $mailbox) { |
| | | return $this->data['RECENT']; |
| | | if ($messages) |
| | | $result = $this->execute('UID EXPUNGE', array($messages), self::COMMAND_NORESPONSE); |
| | | else |
| | | $result = $this->execute('EXPUNGE', null, self::COMMAND_NORESPONSE); |
| | | |
| | | if ($result == self::ERROR_OK) { |
| | | $this->selected = ''; // state has changed, need to reselect |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * Executes CLOSE command |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | * @since 0.5 |
| | | */ |
| | | function close() |
| | | { |
| | | $result = $this->execute('CLOSE', NULL, self::COMMAND_NORESPONSE); |
| | | |
| | | if ($result == self::ERROR_OK) { |
| | | $this->selected = ''; |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * Executes SUBSCRIBE command |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | */ |
| | | function subscribe($mailbox) |
| | | { |
| | | $result = $this->execute('SUBSCRIBE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | /** |
| | | * Executes UNSUBSCRIBE command |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | */ |
| | | function unsubscribe($mailbox) |
| | | { |
| | | $result = $this->execute('UNSUBSCRIBE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | /** |
| | | * Executes DELETE command |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | */ |
| | | function deleteFolder($mailbox) |
| | | { |
| | | $result = $this->execute('DELETE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | /** |
| | | * Removes all messages in a folder |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return boolean True on success, False on error |
| | | * @access public |
| | | */ |
| | | function clearFolder($mailbox) |
| | | { |
| | | $num_in_trash = $this->countMessages($mailbox); |
| | | if ($num_in_trash > 0) { |
| | | $this->delete($mailbox, '1:*'); |
| | | } |
| | | |
| | | $res = $this->close(); |
| | | // $res = $this->expunge($mailbox); |
| | | |
| | | return $res; |
| | | } |
| | | |
| | | /** |
| | | * Returns count of all messages in a folder |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return int Number of messages, False on error |
| | | * @access public |
| | | */ |
| | | function countMessages($mailbox, $refresh = false) |
| | | { |
| | | if ($refresh) { |
| | |
| | | $counts = $this->status($mailbox); |
| | | if (is_array($counts)) { |
| | | return (int) $counts['MESSAGES']; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * Returns count of messages with \Recent flag in a folder |
| | | * |
| | | * @param string $mailbox Mailbox name |
| | | * |
| | | * @return int Number of messages, False on error |
| | | * @access public |
| | | */ |
| | | function countRecent($mailbox) |
| | | { |
| | | if (!strlen($mailbox)) { |
| | | $mailbox = 'INBOX'; |
| | | } |
| | | |
| | | $this->select($mailbox); |
| | | |
| | | if ($this->selected == $mailbox) { |
| | | return $this->data['RECENT']; |
| | | } |
| | | |
| | | return false; |
| | |
| | | return $result; |
| | | } |
| | | |
| | | function expunge($mailbox, $messages=NULL) |
| | | { |
| | | if (!$this->select($mailbox)) { |
| | | return false; |
| | | } |
| | | |
| | | // Clear internal status cache |
| | | unset($this->data['STATUS:'.$mailbox]); |
| | | |
| | | if ($messages) |
| | | $result = $this->execute('UID EXPUNGE', array($messages), self::COMMAND_NORESPONSE); |
| | | else |
| | | $result = $this->execute('EXPUNGE', null, self::COMMAND_NORESPONSE); |
| | | |
| | | if ($result == self::ERROR_OK) { |
| | | $this->selected = ''; // state has changed, need to reselect |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | function modFlag($mailbox, $messages, $flag, $mod) |
| | | { |
| | |
| | | function renameFolder($from, $to) |
| | | { |
| | | $result = $this->execute('RENAME', array($this->escape($from), $this->escape($to)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | function deleteFolder($mailbox) |
| | | { |
| | | $result = $this->execute('DELETE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | function clearFolder($mailbox) |
| | | { |
| | | $num_in_trash = $this->countMessages($mailbox); |
| | | if ($num_in_trash > 0) { |
| | | $this->delete($mailbox, '1:*'); |
| | | } |
| | | return ($this->expunge($mailbox) >= 0); |
| | | } |
| | | |
| | | function subscribe($mailbox) |
| | | { |
| | | $result = $this->execute('SUBSCRIBE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |
| | | } |
| | | |
| | | function unsubscribe($mailbox) |
| | | { |
| | | $result = $this->execute('UNSUBSCRIBE', array($this->escape($mailbox)), |
| | | self::COMMAND_NORESPONSE); |
| | | |
| | | return ($result == self::ERROR_OK); |