日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用PHP實現POP3郵件的收取(二)

瀏覽:24日期:2023-12-28 10:15:43

用PHP實現POP3收取郵件的類

現在讓我們來用PHP實現一個通過POP3協議收取信件的類吧,這個類中所用到的一些sock操作的函數,不另做特殊說明,請參考php的有關資料。通過這個實例,相信你也會和我一樣,感覺到PHP中對于sock操作的靈活、方便和功能的強大。

首先,我們來說明一下這個類中需要用到的一些內部成員變量:(這些變量應該都是對外封閉的,可是由于php對類的成員變量沒有private與publice之類的分別,只好就這么直接定義了。這是PHP的一個令人遺憾的地方。)

1.成員變量說明

class pop3{

var $hostname=''; // POP主機名

var $port=110; // 主機的POP3端口,一般是110號端口

var $timeout=5;// 連接主機的最大超時時間 

var $connection=0; // 保存與主機的連接

var $state='DISCONNECTED'; // 保存當前的狀態 

var $debug=0;// 做為標識,是否在調試狀態,是的話,輸出調試信息

var $err_str='';// 如果出錯,這里保存錯誤信息

var $err_no; //如果出錯,這里保存錯誤號碼

var $resp; // 臨時保存服務器的響應信息

var $apop; // 指示需要使用加密方式進行密碼驗證,一般服務器不需要

var $messages; // 郵件數

var $size; //各郵件的總大小

var $mail_list; // 一個數組,保存各個郵件的大小及其在郵件服務器上序號  

var $head=array(); // 郵件頭的內容,數組

var $body=array(); // 郵件體的內容,數組;

2.當然,這其中的有些變量,僅通過這樣一個簡單的說明并不能完全了解如何使用,下面我就逐個來說明這個類實現中的一些主要方法:Function pop3($server='192.100.100.1',$port=110,$time_out=5)

{$this->hostname=$server;

$this->port=$port;

$this->timeout=$time_out;

return true;}

熟悉面向對象編程的朋友一看就會知道,這是這個類的構造函數,在初始化這個類時,可以給出這幾個最基本的參數:pop3服務器的地址,端口號,及連接服務器時的最大超時時間。一般來說,只需要給出POP3服務器的地址就行了。

Function open(){if($this->hostname=='')

{$this->err_str='無效的主機名!!';

return false; }  

if ($this->debug) echo '正在打開 $this->hostname,$this->port,&$err_no, &$err_str, $this->timeout<BR>';

if (!$this->connection=fsockopen($this->hostname,$this->port,&$err_no, &$err_str, $this->timeout)) {

$this->err_str='連接到POP服務器失敗,錯誤信息:'.$err_str.'錯誤號:'.$err_no;

return false;

} else { $this->getresp();

if($this->debug)

$this->outdebug($this->resp);

if (substr($this->resp,0,3)!='+OK')

{$this->err_str='服務器返回無效的信息:'.$this->resp.'請檢查POP服務器是否正確';

return false; }

$this->state='AUTHORIZATION';

return true;

}

}

該方法不需要任何參數就可建立與POP3服務器的sock連接。該方法又用到了另一個類中的方法$this->getresp();下面是這個方法的聲明:

Function getresp()

{

for($this->resp='';;)

{

if(feof($this->connection))

return false;

$this->resp.=fgets($this->connection,100);

$length=strlen($this->resp);

if($length>=2 && substr($this->resp,$length-2,2)=='rn')

{

$this->resp=strtok($this->resp,'rn');

return true;

}}}

這個方法取得服務器端的返回信息并進行簡單的處理:去掉最后的回車換行符,將返回信息保存在resp這個內部變量中。這個方法在后面的多個操作中都將用到。另外,還有個小方法也在后面的多個操作中用到:

Function outdebug($message){ echo htmlspecialchars($message).'<br>n';}

它的作用就是把調試信息$message顯示出來,并把一些特殊字符進行轉換以及在行尾加上<br>標簽,這樣是為了使其輸出的調試信息便于閱讀和分析。

建立起與服務器的sock連接之后,就要給服務器發送相關的命令了(請參見上面的與服務器對話的過程)從上面對 POP對話的分析可以看到,每次都是發送一條命令,然后服務器給予一定的回應,如果命令的執行是對的,回應一般是以+OK開頭,后面是一些描述信息,所以,我們可以做一個通過發送命令的方法:

Function command($command,$return_lenth=1,$return_code='+'){ if ($this->connection==0) { $this->err_str='沒有連接到任何服務器,請檢查網絡連接';

return false; }

if ($this->debug) $this->outdebug('>>> $command');

if (!fputs($this->connection,'$commandrn'))

{

$this->err_str='無法發送命令'.$command;

return false; } else {

$this->getresp();

if($this->debug)

$this->outdebug($this->resp);

if (substr($this->resp,0,$return_lenth)!=$return_code)

{

$this->err_str=$command.' 命令服務器返回無效:'.$this->resp;

return false;

}

else

return true;

}}

這個方法可以接受三個參數: $command--> 發送給服務器的命令; $return_lenth,$return_code ,指定從服務器的返回中取多長的值做為命令返回的標識以及這個標識的正確值是什么。對于一般的pop操作來說,如果服務器的返回第一個字符為'+',則可以認為命令是正確執行了。也可以用前面提到過的三個字符'+OK'做為判斷的標識。

下面介紹的幾個方法則可以按照前述收取信件的對話去理解,因為有關的內容已經在前面做了說明,因此下面的方法不做詳細的說明,請參考其中的注釋:

Function Login($user,$password) //發送用戶名及密碼,登錄到服務器{

if($this->state!='AUTHORIZATION') {

$this->err_str='還沒有連接到服務器或狀態不對';

return false; }

if (!$this->apop) //服務器是否采用APOP用戶認證 {

if (!$this->command('USER $user',3,'+OK')) return false;

if (!$this->command('PASS $password',3,'+OK')) return false;

}

else

{

//echo $this->resp=strtok($this->resp,'rn');

if (!$this->command('APOP $user '.md5($this->greeting.$password),3,'+OK')) return false;

}

$this->state='TRANSACTION'; // 用戶認證通過,進入傳送模式

return true;}

Function stat() // 對應著stat命令,取得總的郵件數與總的大小{if($this->state!='TRANSACTION') {

$this->err_str='還沒有連接到服務器或沒有成功登錄';

return false; }

if (!$this->command('STAT',3,'+OK')) return false;

else

{

$this->resp=strtok($this->resp,' ');

$this->messages=strtok(' '); // 取得郵件總數

$this->size=strtok(' '); //取得總的字節大小

return true; }}

Function listmail($mess=null,$uni_id=null) //對應的是LIST命令,取得每個郵件的大小及序號。一般來說用到的是List命令,如果指定了$uni_id ,則使用UIDL命令,返回的是每個郵件的標識符,事實上,這個標識符一般是沒有什么用的。取得的各個郵件的大小返回到類的內部變量mail_list這個二維數組里。

{if($this->state!='TRANSACTION') {

$this->err_str='還沒有連接到服務器或沒有成功登錄';

return false; }

if ($uni_id)

$command='UIDL ';

else

$command='LIST ';

if ($mess)

$command.=$mess; 

if (!$this->command($command,3,'+OK')) {

//echo $this->err_str;

return false;

} else {

$i=0;

$this->mail_list=array();

$this->getresp();

while ($this->resp!='.')

{ $i++;

if ($this->debug) {

$this->outdebug($this->resp); }

if ($uni_id) { $this->mail_list[$i][num]=strtok($this->resp,' ');

$this->mail_list[$i][size]=strtok(' '); } else { $this->mail_list[$i]['num']=intval(strtok($this->resp,' '));

$this->mail_list[$i]['size']=intval(strtok(' '));

}

$this->getresp();

}

return true; }}

function getmail($num=1,$line=-1) // 取得郵件的內容,$num是郵件的序號,$line是指定共取得正文的多少行。有些時候,如郵件比較大而我們只想先查看郵件的主題時是必須指定行數的。默認值$line=-1,即取回所有的郵件內容,取得的內容存放到內部變量$head,$body兩個數組里,數組里的每一個元素對應的是郵件源代碼的一行。

{

if($this->state!='TRANSACTION') { $this->err_str='不能收取信件,還沒有連接到服務器或沒有成功登錄';

return false; }

if ($line<0)

$command='RETR $num';

else

$command='TOP $num $line';

if (!$this->command('$command',3,'+OK'))

return false;

else {

$this->getresp();

$is_head=true;

while ($this->resp!='.') // . 號是郵件結束的標識 {

if ($this->debug)

$this->outdebug($this->resp);

if (substr($this->resp,0,1)=='.')

$this->resp=substr($this->resp,1,strlen($this->resp)-1);

if (trim($this->resp)=='') // 郵件頭與正文部分的是一個空行

$is_head=false;

if ($is_head)

$this->head[]=$this->resp;

else

$this->body[]=$this->resp;

$this->getresp();

}

return true; } } // end function

function dele($num) // 刪除指定序號的郵件,$num 是服務器上的郵件序號

{

if($this->state!='TRANSACTION') {

$this->err_str='不能刪除遠程信件,還沒有連接到服務器或沒有成功登錄';

return false; }

if (!$num) {

$this->err_str='刪除的參數不對';

return false; }

if ($this->command('DELE $num ',3,'+OK')) return true;

else

return false;}

通過以上幾個方法,我們已經可以實現郵件的查看、收取、刪除的操作,不過別忘了最后要退出,并關閉與服務器的連接,調用下面的這個方法:

Function Close(){

if($this->connection!=0) {

if($this->state=='TRANSACTION')

$this->command('QUIT',3,'+OK');

fclose($this->connection);

$this->connection=0;

$this->state='DISCONNECTED'; }

}

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产小视频| 精品亚洲精品| 一区二区国产在线观看| 三级欧美韩日大片在线看| 日本国产欧美| 卡一精品卡二卡三网站乱码| 97精品在线| 成人美女视频| 99riav1国产精品视频| 日韩综合在线| 日韩精品国产精品| 老牛影视精品| 亚洲黄色在线| 亚洲免费婷婷| 精品国产亚洲一区二区三区大结局| 亚洲精品日本| 日韩一区免费| 在线看片福利| 亚洲精品国产精品粉嫩| 久久精品官网| 日本精品久久| 久久久免费人体| 91精品成人| 国产精品九九| 久久亚洲一区| 国产福利一区二区精品秒拍| 99精品视频在线| 欧美午夜三级| 国产亚洲毛片在线| 91一区二区三区四区| 日韩国产一二三区| 999国产精品视频| 日韩精品一级中文字幕精品视频免费观看 | 日精品一区二区三区| 国产亚洲毛片| 91一区二区三区四区| 国产伊人久久| 欧美专区一区二区三区| 国产传媒av在线| 在线视频日韩| 亚洲性图久久| 国产精品久久免费视频| 国产91在线精品| 伊人国产精品| 久久精品免费看| 欧美影院三区| 日韩国产网站| 亚洲风情在线资源| 欧美日韩国产探花| 美女少妇全过程你懂的久久| 麻豆视频在线看| 99视频精品| 狠狠爱www人成狠狠爱综合网| 91欧美在线| 91久久亚洲| 国内精品福利| 成人在线免费观看91| 国产精品av一区二区| 久久狠狠婷婷| 精品国模一区二区三区| 亚洲精品888| 久热精品在线| 91成人小视频| 男女男精品视频网| 麻豆精品视频在线观看免费| 亚洲欧美高清| 97精品在线| 国产成人免费视频网站视频社区| 亚洲精品电影| 日韩精品亚洲专区| 亚洲资源网站| 国产精品欧美日韩一区| 欧美精品一区二区三区精品| 国产一区清纯| 欧美福利在线| 中文字幕亚洲影视| 亚洲成人三区| 欧美成人精品| 蜜桃tv一区二区三区| 国产成人精品一区二区免费看京 | 欧美~级网站不卡| 伊人影院久久| 国产日韩视频| 蜜桃视频一区二区三区在线观看| 久久精品动漫| 国产精品精品| 麻豆91在线播放| 国产精品国产三级国产在线观看| 成人羞羞视频播放网站| 国产精品久久久久久模特| 一区二区精品伦理...| 好看不卡的中文字幕| 日本不卡一区二区| 亚洲欧美视频| 青草国产精品| 久久精品亚洲人成影院 | 蜜臀国产一区二区三区在线播放 | 日韩久久精品| 91日韩欧美| 亚洲bt欧美bt精品777| 高清日韩中文字幕| 免费不卡中文字幕在线| av资源中文在线天堂| 日韩在线短视频| 日韩精品国产精品| 黄色日韩在线| av资源亚洲| 日韩精品一区二区三区中文在线 | 日韩国产一区二| 欧美理论视频| 亚洲性色av| 久久av综合| 国产乱人伦精品一区| 日韩欧美高清一区二区三区| 亚洲免费一区二区| 欧美成人综合| 免费精品国产| 伊人精品一区| 激情综合自拍| 国产一区二区三区四区五区| 国产精久久久| 国产毛片一区二区三区| 国产精品一区亚洲| 精品国产中文字幕第一页| 日韩av三区| 日韩国产欧美在线视频| 婷婷精品在线| 国产一精品一av一免费爽爽| 欧美日韩99| 91精品日本| 国产精品一区二区av交换| 国产精品亚洲综合色区韩国| 国产视频一区二区在线播放| 国产乱码精品一区二区亚洲| 蜜桃视频免费观看一区| 蜜桃视频在线观看一区| 午夜性色一区二区三区免费视频| 亚洲专区视频| 日韩精品国产精品| 国产女人18毛片水真多18精品| 国产精品一区二区三区四区在线观看| 久久精品 人人爱| 欧美激情aⅴ一区二区三区| 久久99性xxx老妇胖精品| 国产另类在线| 国产精品激情电影| 日韩不卡一二三区| 国产精品第十页| 国产一区二区三区精品在线观看| 国产欧美日韩一区二区三区四区| 国产精品高潮呻吟久久久久| 精品免费av一区二区三区| 丁香六月综合| 在线一区欧美| 深夜福利亚洲| 日韩88av| 亚洲精一区二区三区| 国产欧美亚洲一区| 亚洲精品88| 男女男精品网站| 国产精品毛片aⅴ一区二区三区| 岛国av在线网站| 亚洲资源av| 国产精品亚洲欧美日韩一区在线| 国产区精品区| 成人午夜国产| 日韩在线网址| 国产一区二区三区四区二区| 亚洲福利专区| 日本不卡在线视频| 成人黄色av| 午夜在线精品偷拍| 国产精品麻豆成人av电影艾秋| 日韩欧美三级| 综合色就爱涩涩涩综合婷婷| 老司机精品视频在线播放| 亚洲福利久久| 免费亚洲婷婷| 日韩精品视频中文字幕| 欧美黑人做爰爽爽爽| 激情五月综合网| 国产欧美日韩视频在线| 美女毛片一区二区三区四区| 欧美亚洲色图校园春色| 丝袜av一区| 久久国内精品| 影音国产精品| 精品视频免费| 亚洲精品美女| 91日韩在线| 青草综合视频| 欧美亚洲国产一区| 国产精品亚洲综合久久| 夜夜嗨一区二区| 国产精品一区二区av交换| 欧美va天堂在线| 老司机免费视频一区二区| 国产精品美女| 伊人久久大香线蕉av不卡| 黄色欧美在线|