imap.php
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 1,840 行 · 第 1/4 页
PHP
1,840 行
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar> |
// +----------------------------------------------------------------------+
require_once 'Net/IMAPProtocol.php';
/**
* Provides an implementation of the IMAP protocol using PEAR's
* Net_Socket:: class.
*
* @package Net_IMAP
* @author Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>
*/
class Net_IMAP extends Net_IMAPProtocol {
/**
* Constructor
*
* Instantiates a new Net_SMTP object, overriding any defaults
* with parameters that are passed in.
*
* @param string The server to connect to.
* @param int The port to connect to.
* @param string The value to give when sending EHLO or HELO.
*/
function Net_IMAP($host = 'localhost', $port = 143)
{
$this->Net_IMAPProtocol();
$ret = $this->connect( $host , $port );
}
/**
* Attempt to connect to the IMAP server located at $host $port
* @param string $host The IMAP server
* @param string $port The IMAP port
*
* It is only useful in a very few circunstances
* because the contructor already makes this job
* @return true on success or PEAR_Error
*
* @access public
* @since 1.0
*/
function connect($host, $port)
{
$ret=$this->cmdConnect($host,$port);
if($ret === true ){
return $ret;
}
if(empty($ret)){
return new PEAR_Error("Unexpected response on connection");
}
if(PEAR::isError($ret) ){
return $ret;
}
if(isset( $ret["RESPONSE"]["CODE"] ) ){
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
}
return $ret;
}
/**
* Attempt to authenticate to the IMAP server.
* @param string $user The userid to authenticate as.
* @param string $pass The password to authenticate with.
* @param string $useauthenticate true: authenticate using
* the IMAP AUTHENTICATE command. false: authenticate using
* the IMAP AUTHENTICATE command. 'string': authenticate using
* the IMAP AUTHENTICATE command but using the authMethod in 'string'
* @param boolean $selectMailbox automaticaly select inbox on login (false does not)
*
* @return true on success or PEAR_Error
*
* @access public
* @since 1.0
*/
function login($user, $pass, $useauthenticate = true, $selectMailbox=true)
{
if ( $useauthenticate ){
//$useauthenticate is a string if the user hardcodes an AUTHMethod
// (the user calls $imap->login("user","password","CRAM-MD5"); for example!
$method = is_string( $useauthenticate ) ? $useauthenticate : null;
//Try the selected Auth method
if ( PEAR::isError( $ret = $this->cmdAuthenticate( $user , $pass , $method ) ) ) {
// Verify the methods that we have in common with the server
if(is_array($this->_serverAuthMethods)){
$commonMethods=array_intersect ($this->supportedAuthMethods, $this->_serverAuthMethods );
}else{
$this->_serverAuthMethods=null;
}
if($this->_serverAuthMethods == null || count($commonMethods) == 0 || $this->supportedAuthMethods == null ){
// The server does not have any auth method, so I try LOGIN
if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) {
return $ret;
}
}else{
return $ret;
}
}
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
}else{
//The user request "PLAIN" auth, we use the login command
if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) {
return $ret;
}
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
}
if($selectMailbox){
//Select INBOX
if ( PEAR::isError( $ret=$this->cmdSelect( $this->getCurrentMailbox() ) ) ) {
return $ret;
}
}
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
return true;
}
/*
* Disconnect function. Sends the QUIT command
* and closes the socket.
*
* @return bool Success/Failure
*/
function disconnect($expungeOnExit = false)
{
if($expungeOnExit){
$ret=$this->cmdExpunge();
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
$ret=$this->cmdLogout();
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
}
$ret=$this->cmdLogout();
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
return true;
}
/*
* Changes the default/current mailbox th $mailbox
*
*
* @return bool Success/Pear_Error Failure
*/
function selectMailbox($mailbox)
{
$ret=$this->cmdSelect($mailbox);
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
return true;
}
/*
* Checks the mailbox $mailbox
*
*
* @return bool Success/Pear_Error Failure
*/
function examineMailbox($mailbox)
{
$ret=$this->cmdExamine($mailbox);
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
//$ret_aux["EXISTS"]=$ret["PARSED"]["EXISTS"];
//$ret_aux["RECENT"]=$ret["PARSED"]["RECENT"];
return $ret;
}
/*
* Returns the raw headers of the specified message.
*
* @param $msg_id Message number
* @return mixed Either raw headers or false on error
*/
function getRawHeaders($msg_id)
{
$ret=$this->cmdFetch($msg_id, "BODY[HEADER]");
if(strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
$ret=$ret["PARSED"][0]["EXT"]["BODY[HEADER]"]["CONTENT"];
return $ret;
}
/*
* Returns the headers of the specified message in an
* associative array. Array keys are the header names, array
* values are the header values. In the case of multiple headers
* having the same names, eg Received:, the array value will be
* an indexed array of all the header values.
*
* @param $msg_id Message number
* @return mixed Either array of headers or false on error
*/
function getParsedHeaders($msg_id)
{
$ret=$this->getRawHeaders($msg_id);
$raw_headers = rtrim($ret);
$raw_headers = preg_replace("/\r\n[ \t]+/", ' ', $raw_headers); // Unfold headers
$raw_headers = explode("\r\n", $raw_headers);
foreach ($raw_headers as $value) {
$name = substr($value, 0, $pos = strpos($value, ':'));
$value = ltrim(substr($value, $pos + 1));
if (isset($headers[$name]) AND is_array($headers[$name])) {
$headers[$name][] = $value;
} elseif (isset($headers[$name])) {
$headers[$name] = array($headers[$name], $value);
} else {
$headers[$name] = $value;
}
}
return $headers;
}
/*
* Returns an array containing the message ID, the size and the UID
* of each message selected.
* message selection can be a valid IMAP command, a number or an array of
* messages
*
* @param $msg_id Message number
* @return mixed Either array of message data or PearError on error
*/
function getMessagesList($msg_id = null)
{
if( $msg_id != null){
if(is_array($msg_id)){
$message_set=$this->_getSearchListFromArray($msg_id);
}else{
$message_set=$msg_id;
}
}else{
$message_set="1:*";
}
$ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID)");
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
foreach($ret["PARSED"] as $msg){
$ret_aux[]=array("msg_id"=>$msg["NRO"],"size" => $msg["EXT"]["RFC822.SIZE"],"uidl"=> $msg["EXT"]["UID"]);
}
return $ret_aux;
}
function getSummary($msg_id = null)
{
if( $msg_id != null){
if(is_array($msg_id)){
$message_set=$this->_getSearchListFromArray($msg_id);
}else{
$message_set=$msg_id;
}
}else{
$message_set="1:*";
}
$ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE)");
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
if(isset( $ret["PARSED"] ) ){
for($i=0; $i<count($ret["PARSED"]) ; $i++){
$a=$ret["PARSED"][$i]['EXT']['ENVELOPE'];
$a['MSG_NUM']=$ret["PARSED"][$i]['NRO'];
$a['UID']=$ret["PARSED"][$i]['EXT']['UID'];
$a['FLAGS']=$ret["PARSED"][$i]['EXT']['FLAGS'];
$a['INTERNALDATE']=$ret["PARSED"][$i]['EXT']['INTERNALDATE'];
$a['SIZE']=$ret["PARSED"][$i]['EXT']['RFC822.SIZE'];
$env[]=$a;
$a=null;
}
return $env;
}
//return $ret;
}
/*
* Returns the body of the message with given message number.
*
* @param $msg_id Message number
* @return mixed Either message body or false on error
*/
function getBody($msg_id)
{
$ret=$this->cmdFetch($msg_id,"BODY[TEXT]");
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
$ret=$ret["PARSED"][0]["EXT"]["BODY[TEXT]"]["CONTENT"];
//$ret=$resp["PARSED"][0]["EXT"]["RFC822"]["CONTENT"];
return $ret;
}
/*
* Returns the entire message with given message number.
*
* @param $msg_id Message number
* @return mixed Either entire message or false on error
*/
function getMessages($msg_id = null, $indexIsMessageNumber=true)
{
//$resp=$this->cmdFetch($msg_id,"(BODY[TEXT] BODY[HEADER])");
if( $msg_id != null){
if(is_array($msg_id)){
$message_set=$this->_getSearchListFromArray($msg_id);
}else{
$message_set=$msg_id;
}
}else{
$message_set="1:*";
}
$ret=$this->cmdFetch($message_set,"RFC822");
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
if(isset($ret["PARSED"])){
foreach($ret["PARSED"] as $msg){
if(isset($msg["EXT"]["RFC822"]["CONTENT"])){
if($indexIsMessageNumber){
$ret_aux[$msg["NRO"]]=$msg["EXT"]["RFC822"]["CONTENT"];
}else{
$ret_aux[]=$msg["EXT"]["RFC822"]["CONTENT"];
}
}
}
return $ret_aux;
}
return array();
}
/*
* Returns number of messages in this mailbox
*
* @param string $mailbox the mailbox
* @return mixed Either number of messages or Pear_Error on error
*/
function getNumberOfMessages($mailbox = '')
{
if ( $mailbox == '' || $mailbox == null ){
$mailbox=$this->getCurrentMailbox();
}
$ret=$this->cmdStatus( $mailbox , "MESSAGES" );
if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
}
if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"] ) ){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?