imapprotocol.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 2,517 行 · 第 1/5 页
SVN-BASE
2,517 行
return array( "CONTENT"=> $content , "CONTENT_SIZE" =>$size ); } /** * Parses the ENVELOPE response * * @param string the IMAP's server response * * @return Array containing the parsed response * @access private * @since 1.0 */ function _parseENVELOPEresponse(&$str) { $content = ''; $this->_parseSpace($str , __LINE__ , __FILE__ ); $this->_getNextToken($str,$parenthesis); if( $parenthesis != '(' ){ $this->_prot_error("must be a '(' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); } // Get the email's Date $this->_getNextToken($str,$date); $this->_parseSpace($str , __LINE__ , __FILE__ ); // Get the email's Subject: $this->_getNextToken($str,$subject); //$subject=$this->decode($subject); $this->_parseSpace($str , __LINE__ , __FILE__ ); //FROM LIST; $from_arr = $this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); //"SENDER LIST\n"; $sender_arr = $this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); //"REPLY-TO LIST\n"; $reply_to_arr=$this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); //"TO LIST\n"; $to_arr = $this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); //"CC LIST\n"; $cc_arr = $this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); //"BCC LIST|$str|\n"; $bcc_arr = $this->_getAddressList($str); $this->_parseSpace($str , __LINE__ , __FILE__ ); $this->_getNextToken($str,$in_reply_to); $this->_parseSpace($str , __LINE__ , __FILE__ ); $this->_getNextToken($str,$message_id); $this->_getNextToken($str,$parenthesis); if( $parenthesis != ')' ){ $this->_prot_error("must be a ')' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); } return array( "DATE"=> $date , "SUBJECT" => $subject,"FROM" => $from_arr, "SENDER" => $sender_arr , "REPLY_TO" => $reply_to_arr, "TO" => $to_arr, "CC" =>$cc_arr, "BCC"=> $bcc_arr, "IN_REPLY_TO" =>$in_reply_to, "MESSAGE_ID"=>$message_id ); } /** * Parses the ARRDLIST as defined in RFC * * @param string the IMAP's server response * * @return Array containing the parsed response * @access private * @since 1.0 */ function _getAddressList(&$str) { $params_arr = $this->_arrayfy_content($str); if( !isset( $params_arr ) ){ return $params_arr; } if( is_array($params_arr) ){ $personal_name = $params_arr[0][0]; $at_domain_list = $params_arr[0][1]; $mailbox_name = $params_arr[0][2]; $host_name = $params_arr[0][3]; if( $mailbox_name!='' && $host_name!='' ){ $email=$mailbox_name . "@" . $host_name; }else{ $email=false; } if($email==false){ $rfc822_email=false; }else{ if(!isset($personal_name)){ $rfc822_email= "<". $email . ">"; }else{ $rfc822_email= "\"". $personal_name ."\" <". $email . ">"; } } $email_arr[] = array ( "PERSONAL_NAME"=> $personal_name , "AT_DOMAIN_LIST"=>$at_domain_list , "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name), "HOST_NAME"=> $host_name, "EMAIL"=>$email , "RFC822_EMAIL" => $rfc822_email ); return $email_arr; } return array(); } /** * Utility funcion to find the closing parenthesis ")" Position it takes care of quoted ones * * @param string the IMAP's server response * * @return int containing the pos of the closing parenthesis ")" * @access private * @since 1.0 */ function _getClosingBracesPos($str_line, $startDelim ='(', $stopDelim = ')' ) { $len = strlen( $str_line ); $pos = 0; // ignore all extra characters // If inside of a string, skip string -- Boundary IDs and other // things can have ) in them. if ( $str_line[$pos] != $startDelim ) { $this->_prot_error("_getClosingParenthesisPos: must start with a '(' but is a '". $str_line[$pos] ."'!!!!\n" . "STR_LINE:$str_line|size:$len|POS: $pos\n" , __LINE__ , __FILE__ ); return( $len ); } for( $pos = 1 ; $pos < $len ; $pos++ ){ if ($str_line[$pos] == $stopDelim ) { break; } if ($str_line[$pos] == '"') { $pos++; while ( $str_line[$pos] != '"' && $pos < $len ) { if ($str_line[$pos] == "\\" && $str_line[$pos + 1 ] == '"' ) $pos++; if ($str_line[$pos] == "\\" && $str_line[$pos + 1 ] == "\\" ) $pos++; $pos++; } } if ( $str_line[$pos] == $startDelim ) { $str_line_aux = substr( $str_line , $pos ); $pos_aux = $this->_getClosingBracesPos( $str_line_aux ); $pos+=$pos_aux; } } if( $str_line[$pos] != $stopDelim ){ $this->_prot_error("_getClosingBracesPos: must be a $stopDelim but is a '". $str_line[$pos] ."'|POS:$pos|STR_LINE:$str_line!!!!" , __LINE__ , __FILE__ ); } if( $pos >= $len ) return false; return $pos; } /** * Utility funcion to get from here to the end of the line * * @param string the IMAP's server response * * @return string containing the string to the end of the line * @access private * @since 1.0 */ function _getToEOL(&$str , $including = true) { $len = strlen( $str ); if( $including ){ for($i=0;$i<$len;$i++){ if( $str[$i] =="\n" ) break; } $content=substr($str,0,$i + 1); $str=substr($str,$i + 1); return $content; }else{ for( $i = 0 ; $i < $len ; $i++ ){ if( $str[$i] =="\n" || $str[$i] == "\r") break; } $content = substr( $str ,0 , $i ); $str = substr( $str , $i ); return $content; } } /** * Fetches the next IMAP token or parenthesis * * @param string the IMAP's server response * @param string the next token * @param boolean true: the parenthesis IS a token, false: I consider * all the response in parenthesis as a token * * @return int containing the content size * @access private * @since 1.0 */ function _getNextToken(&$str, &$content, $parenthesisIsToken=true,$colonIsToken=true){ $len = strlen($str); $pos = 0; $content_size = false; $content = false; if($str == '' || $len < 2 ){ $content=$str; return $len; } switch( $str[0] ){ case '{': if( ($posClosingBraces = $this->_getClosingBracesPos($str, '{' , '}' )) == false ){ $this->_prot_error("_getClosingBracesPos() error!!!" , __LINE__ , __FILE__ ); } if(! is_numeric( ( $strBytes = substr( $str , 1 , $posClosingBraces - 1) ) ) ){ $this->_prot_error("must be a number but is a '" . $strBytes ."'!!!!" , __LINE__ , __FILE__ ); } if( $str[$posClosingBraces] != '}' ){ $this->_prot_error("must be a '}' but is a '" . $str[$posClosingBraces] ."'!!!!" , __LINE__ , __FILE__ ); } if( $str[$posClosingBraces + 1] != "\r" ){ $this->_prot_error("must be a '\\r' but is a '" . $str[$posClosingBraces + 1] ."'!!!!" , __LINE__ , __FILE__ ); } if( $str[$posClosingBraces + 2] != "\n" ){ $this->_prot_error("must be a '\\n' but is a '" . $str[$posClosingBraces + 2] ."'!!!!" , __LINE__ , __FILE__ ); } $content = substr( $str , $posClosingBraces + 3 , $strBytes ); if( strlen( $content ) != $strBytes ){ $this->_prot_error("content size is ". strlen($content) . " but the string reports a size of $strBytes!!!\n" , __LINE__ , __FILE__ ); } $content_size = $strBytes; //Advance the string $str = substr( $str , $posClosingBraces + $strBytes + 3 ); break; case '"': if($colonIsToken){ for($pos=1;$pos<$len;$pos++){ if ( $str[$pos] == "\"" ) { break; } if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) $pos++; if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) $pos++; } if($str[$pos] != '"' ){ $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); } $content_size = $pos; $content = substr( $str , 1 , $pos - 1 ); //Advance the string $str = substr( $str , $pos + 1 ); }else{ for($pos=1;$pos<$len;$pos++){ if ( $str[$pos] == "\"" ) { break; } if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) $pos++; if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) $pos++; } if($str[$pos] != '"' ){ $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); } $content_size = $pos; $content = substr( $str , 0 , $pos + 1 ); //Advance the string $str = substr( $str , $pos + 1 ); } break; case "\r": $pos = 1; if( $str[1] == "\n") $pos++; $content_size = $pos; $content = substr( $str , 0 , $pos ); $str = substr( $str , $pos ); break; case "\n": $pos = 1; $content_size = $pos; $content = substr( $str , 0 , $pos ); $str = substr( $str , $pos ); break; case '(': if( $parenthesisIsToken == false ){ $pos = $this->_getClosingBracesPos( $str ); $content_size = $pos + 1; $content = substr( $str , 0 , $pos + 1 ); $str = substr( $str , $pos + 1 ); }else{ $pos = 1; $content_size = $pos; $content = substr( $str , 0 , $pos ); $str = substr( $str , $pos ); } break; case ')': $pos = 1; $content_size = $pos; $content = substr( $str , 0 , $pos ); $str = substr( $str , $pos ); break; case ' ': $pos = 1; $content_size = $pos; $content = substr( $str , 0 , $pos ); $str = substr( $str , $pos ); break; default: for( $pos = 0 ; $pos < $len ; $pos++ ){ if ( $str[$pos] == ' ' || $str[$pos] == "\r" || $str[$pos] == ')' || $str[$pos] == '(' || $str[$pos] == "\n" ) { break; } if ( $str[$pos] == "\\" && $str[$pos + 1 ] == ' ' ) $pos++; if ( $str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) $pos++; } //Advance the string if( $pos == 0 ){ $content_size = 1; $content = substr( $str , 0 , 1 ); $str = substr( $str , 1 ); }else{ $content_size = $pos; $content = substr( $str , 0 , $pos ); if($pos < $len){ $str = substr( $str , $pos ); }else{ //if this is the end of the string... exit the switch break; } } break; } return $content_size; } /** * Utility funcion to display to console the protocol errors * * @param string the error * @param int the line producing the error * @param string file where the error was produced * * @return string containing the error * @access private * @since 1.0 */ function _prot_error($str , $line , $file,$printError=true) { if($printError){ echo "$line,$file,PROTOCOL ERROR!:$str\n"; } } function _getEXTarray(&$str , $startDelim = '(' , $stopDelim = ')'){ /* I let choose the $startDelim and $stopDelim to allow parsing the OK response so I also can parse a response like this * OK [UIDNEXT 150] Predicted next UID */ $this->_getNextToken( $str , $parenthesis ); if( $parenthesis != $startDelim ){ $this->_prot_error("must be a '$startDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); } $parenthesis = ''; $struct_arr = array(); while( $parenthesis != $stopDelim && $str != '' ){ // The command $this->_getNextToken( $str , $token ); $token = strtoupper( $token ); if( ( $ret = $this->_retrParsedResponse( $str , $token ) ) != false ){ //$struct_arr[$token] = $ret; $struct_arr=array_merge($struct_arr, $ret); } $parenthesis=$token; }//While if( $parenthesis != $stopDelim ){ $this->_prot_error("1_must be a '$stopDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); } return $struct_arr; } function _retrParsedResponse( &$str , $token, $previousToken = null) { //echo "\n\nTOKEN:$token\r\n"; switch( $token ){ case "RFC822.SIZE" : return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); break;// case "RFC822.TEXT" :// case "RFC822.HEADER" : case "RFC822" : return array($token=>$this->_parseContentresponse( $str , $token )); break; case "FLAGS" : case "PERMANENTFLAGS" : return array($token=>$this->_parseFLAGSresponse( $str )); break; case "ENVELOPE" : return array($token=>$this->_parseENVELOPEresponse( $str )); break; case "EXPUNGE" : return false; break; case "UID" : case "UIDNEXT" : case "UIDVALIDITY" : case "UNSEEN" : case "MESSAGES" : case "UIDNEXT" : case "UIDVALIDITY" : case "UNSEEN" : case "INTERNALDATE" : return array($token=>$this->_parseOneStringResponse( $str
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?