📄 pop3.php
字号:
to list the each message unique identifier, otherwise it will return the size of each message listed. If you list all messages the result will be returned in an array. */ Function ListMessages($message,$unique_id) { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($unique_id) $list_command="UIDL"; else $list_command="LIST"; if($this->PutLine("$list_command".($message ? " ".$message : ""))==0) return($this->SetError("Could not send the $list_command command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get message list command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not get the message listing: ".$this->Tokenize("\r\n"))); if($message=="") { for($messages=array();;) { $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get message list response")); if($response==".") break; $message=intval($this->Tokenize($response," ")); if($unique_id) $messages[$message]=$this->Tokenize(" "); else $messages[$message]=intval($this->Tokenize(" ")); } return($messages); } else { $message=intval($this->Tokenize(" ")); $value=$this->Tokenize(" "); return($unique_id ? $value : intval($value)); } } /* RetrieveMessage method - the $message argument indicates the number of a message to be listed. Pass a reference variables that will hold the arrays of the $header and $body lines. The $lines argument tells how many lines of the message are to be retrieved. Pass a negative number if you want to retrieve the whole message. */ Function RetrieveMessage($message,&$headers,&$body,$lines) { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($lines<0) { $command="RETR"; $arguments="$message"; } else { $command="TOP"; $arguments="$message $lines"; } if($this->PutLine("$command $arguments")==0) return($this->SetError("Could not send the $command command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get message retrieval command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not retrieve the message: ".$this->Tokenize("\r\n"))); for($headers=$body=array(),$line=0;;) { $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not retrieve the message")); switch($response) { case ".": return(""); case "": break 2; default: if(substr($response,0,1)==".") $response=substr($response,1,strlen($response)-1); break; } if($this->join_continuation_header_lines && $line>0 && ($response[0]=="\t" || $response[0]==" ")) $headers[$line-1].=$response; else { $headers[$line]=$response; $line++; } } for($line=0;;$line++) { $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not retrieve the message")); switch($response) { case ".": return(""); default: if(substr($response,0,1)==".") $response=substr($response,1,strlen($response)-1); break; } $body[$line]=$response; } return(""); } /* OpenMessage method - the $message argument indicates the number of a message to be opened. The $lines argument tells how many lines of the message are to be retrieved. Pass a negative number if you want to retrieve the whole message. */ Function OpenMessage($message, $lines=-1) { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($lines<0) { $command="RETR"; $arguments="$message"; } else { $command="TOP"; $arguments="$message $lines"; } if($this->PutLine("$command $arguments")==0) return($this->SetError("Could not send the $command command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get message retrieval command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not retrieve the message: ".$this->Tokenize("\r\n"))); $this->state="GETMESSAGE"; $this->message_buffer=""; return(""); } /* GetMessage method - the $count argument indicates the number of bytes to be read from an opened message. The $message returns by reference the data read from the message. The $end_of_message argument returns by reference a boolean value indicated whether it was reached the end of the message. */ Function GetMessage($count, &$message, &$end_of_message) { if($this->state!="GETMESSAGE") return($this->SetError("connection is not in GETMESSAGE state")); $message=""; $end_of_message=0; while($count>strlen($this->message_buffer) && !$end_of_message) { $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not retrieve the message headers")); if(!strcmp($response,".")) { $end_of_message=1; $this->state="TRANSACTION"; break; } else { if(substr($response,0,1)==".") $response=substr($response,1,strlen($response)-1); $this->message_buffer.=$response."\r\n"; } } if($end_of_message || $count>=strlen($this->message_buffer)) { $message=$this->message_buffer; $this->message_buffer=""; } else { $message=substr($this->message_buffer, 0, $count); $this->message_buffer=substr($this->message_buffer, $count); } return(""); } /* DeleteMessage method - the $message argument indicates the number of a message to be marked as deleted. Messages will only be effectively deleted upon a successful call to the Close method. */ Function DeleteMessage($message) { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($this->PutLine("DELE $message")==0) return($this->SetError("Could not send the DELE command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get message delete command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not delete the message: ".$this->Tokenize("\r\n"))); $this->must_update=1; return(""); } /* ResetDeletedMessages method - Reset the list of marked to be deleted messages. No messages will be marked to be deleted upon a successful call to this method. */ Function ResetDeletedMessages() { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($this->PutLine("RSET")==0) return($this->SetError("Could not send the RSET command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not get reset deleted messages command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not reset deleted messages: ".$this->Tokenize("\r\n"))); $this->must_update=0; return(""); } /* IssueNOOP method - Just pings the server to prevent it auto-close the connection after an idle timeout (tipically 10 minutes). Not very useful for most likely uses of this class. It's just here for protocol support completeness. */ Function IssueNOOP() { if($this->state!="TRANSACTION") return($this->SetError("connection is not in TRANSACTION state")); if($this->PutLine("NOOP")==0) return($this->SetError("Could not send the NOOP command")); $response=$this->GetLine(); if(GetType($response)!="string") return($this->SetError("Could not NOOP command response")); if($this->Tokenize($response," ")!="+OK") return($this->SetError("Could not issue the NOOP command: ".$this->Tokenize("\r\n"))); return(""); }};class pop3_stream{ var $opened = 0; var $report_errors = 1; var $read = 0; var $buffer = ""; var $end_of_message=0; Function SetError($error) { if($this->report_errors) trigger_error($error); return(FALSE); } Function ParsePath($path, &$url) { $url=parse_url($path); if(IsSet($url["host"])) $this->pop3->hostname=$url["host"]; if(IsSet($url["port"])) $this->pop3->port=intval($url["port"]); if(IsSet($url["scheme"]) && !strcmp($url["scheme"],"pop3s")) $this->pop3->tls=1; if(!IsSet($url["user"])) return($this->SetError("it was not specified a valid POP3 user")); if(!IsSet($url["pass"])) return($this->SetError("it was not specified a valid POP3 password")); if(!IsSet($url["path"])) return($this->SetError("it was not specified a valid mailbox path")); if(IsSet($url["query"])) { parse_str($url["query"],$query); if(IsSet($query["debug"])) $this->pop3->debug = intval($query["debug"]); if(IsSet($query["html_debug"])) $this->pop3->html_debug = intval($query["html_debug"]); if(IsSet($query["tls"])) $this->pop3->tls = intval($query["tls"]); if(IsSet($query["realm"])) $this->pop3->realm = UrlDecode($query["realm"]); if(IsSet($query["workstation"])) $this->pop3->workstation = UrlDecode($query["workstation"]); if(IsSet($query["authentication_mechanism"])) $this->pop3->realm = UrlDecode($query["authentication_mechanism"]); if(IsSet($query["quit_handshake"])) $this->pop3->quit_handshake = intval($query["quit_handshake"]); } return(TRUE); } Function stream_open($path, $mode, $options, &$opened_path) { $this->report_errors = (($options & STREAM_REPORT_ERRORS) !=0); if(strcmp($mode, "r")) return($this->SetError("the message can only be opened for reading")); $this->pop3=new pop3_class; if(!$this->ParsePath($path, $url)) return(FALSE); $message=substr($url["path"],1); if(strcmp(intval($message), $message) || $message<=0) return($this->SetError("it was not specified a valid message to retrieve")); if(strlen($error=$this->pop3->Open())) return($this->SetError($error)); $this->opened = 1; $apop = (IsSet($url["query"]["apop"]) ? intval($url["query"]["apop"]) : 0); if(strlen($error=$this->pop3->Login(UrlDecode($url["user"]), UrlDecode($url["pass"]),$apop)) || strlen($error=$this->pop3->OpenMessage($message,-1))) { $this->stream_close(); return($this->SetError($error)); } $this->end_of_message=FALSE; if($options & STREAM_USE_PATH) $opened_path=$path; $this->read = 0; $this->buffer = ""; return(TRUE); } Function stream_eof() { if($this->read==0) return(FALSE); return($this->end_of_message); } Function stream_read($count) { if($count<=0) return($this->SetError("it was not specified a valid length of the message to read")); if($this->end_of_message) return(""); if(strlen($error=$this->pop3->GetMessage($count, $read, $this->end_of_message))) return($this->SetError($error)); $this->read += strlen($read); return($read); } Function stream_close() { if($this->opened) { $this->pop3->Close(); $this->opened = 0; } }};?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -