POP3、SMTP邮件收发程序
<?php 
if ($EMAIL_INC) return; 
$EMAIL_INC=  "defined"
define"SmtpPort",25); 

class 
Pop3 
    var 
$subject;                          // 邮件主题  
    
var $from_email;                       // 发件人地址
    
var $from_name;                        // 发件人姓名
    
var $to_email;                         // 收件人地址
    
var $to_name;                          // 收件人姓名
    
var $body;                             // 邮件内容
    
var $filename;                         // 文件名
    
var $socket;                 // 当前的 socket 
    
var $Line
    var 
$Status

    function 
pop3_open($server$port)   
    { 

        
$this->Socket fsockopen($server$port); 
        if (
$this->Socket <= 0){ 
            return 
false
        } 
    
$this->Line fgets($this->Socket1024); 
    
$this->Status"LASTRESULT"] = substr($this->Line01); 
    
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

    if (
$this->Status"LASTRESULT"] <>  "+") return false
    return 
true
    } 

    function 
pop3_user($user
    { 

        if (
$this->Socket 0){ 
          return 
false
        } 
        
fputs($this->Socket,  "USER $this->userrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return false

        return 
true
    } 

    function 
pop3_pass$pass
    { 

        
fputs($this->Socket,  "PASS $passrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0

        return 
1
    } 
     
    function 
pop3_stat() 
    { 

        
fputs($this->Socket,  "STATrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0

        if (!
eregi"+OK (.*) (.*)"$this->Line$regs))  
            return 
0

        return 
$regs[1]; 
    } 

    function 
pop3_list() 
    { 
        
fputs($this->Socket,  "LISTrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0

        
$i 0
        while  (
substr($this->Line  =  fgets($this->Socket1024),  0,  1)  <>   "."
        { 
            
$articles[$i] = $this->Line
            
$i++; 
        } 
        
$articles"count"] = $i

        return 
$articles
    } 

    function 
pop3_retr($nr
    { 
     
        
fputs($this->Socket,  "RETR $nrrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0

        while  (
substr($this->Line  =  fgets($this->Socket1024),  0,  1)  <>   "."
        { 
            
$data[$i] = $this->Line
            
$i++; 
        } 
        
$data"count"] = $i

        return 
$data
    } 

    function 
pop3_dele$nr
    { 

        
fputs($this->Socket,  "DELE $nrrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0
        return 
1
    } 

    function 
pop3_quit() 
    { 

        
fputs($this->Socket,  "QUITrn"); 
        
$this->Line fgets($this->Socket1024); 
        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "+") return 0

        return 
1
    } 


class 
Smtp 

    var 
$Subject;              // string the email's subject  
    
var $FromName;                 // string sender's name (opt)  
    
var $ToName;                   // string recipient's name (opt)  
    
var $Body;                     // string body copy  
    
var $Attachment;         // attachment (optional) 
    
var $AttachmentType
    var 
$Socket
    var 
$Line
    var 
$Status

    function 
Smtp($Server =  "localhost",$Port SmtpPort
    {     
        return 
$this->Open($Server$Port); 
    } 
     
    function 
SmtpMail($FromEmail$FromName$ToEmail$ToName$Subject$Body$Attachment=null$AttachmentType"TEXT"
    { 
        
$this->Subject   $Subject
        
$this->ToName    $ToName

        
$this->FromName    $FromName
        
$this->Body      $Body

        
$this->Attachment $Attachment
        
$this->AttachmentType $AttachmentType

        if (
$this->Helo() == false){ 
            return 
false
        } 
        if (
$this->MailFrom($FromEmail) == false){ 
            return 
false
        } 
        if (
$this->RcptTo($ToEmail) == false){ 
            return 
false
        } 
        if (
$this->Body() == false){ 
            return 
false
        } 
        if (
$this->Quit() == false){ 
            return 
false
        } 
    } 

    function 
Open($Server$Port
    { 

     
$this->Socket fsockopen($Server$Port); 
     if (
$this->Socket 0) return false

     
$this->Line fgets($this->Socket1024); 

     
$this->Status"LASTRESULT"] = substr($this->Line01); 
     
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

     if (
$this->Status"LASTRESULT"] <>  "2") return false

     return 
true
    } 

  
    function 
Helo() 
    { 
        if (
fputs($this->Socket,  "helorn") < ){ 
            return 
false
        } 
        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "2") return false

        return 
true;   
    } 
  
    function 
Ehlo() 
    { 

         
/* Well, let's use "helo" for now.. Until we need the 
        extra func's   [Unk] 
        */ 
        
if(fputs($this->Socket,  "helo localhostrn")<0){ 
            return 
false
        } 
        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "2") return false

        return 
true
    } 


    function 
MailFrom($FromEmail
    { 

        if (
fputs($this->Socket,  "MAIL FROM: <$FromEmail>rn")<0){ 
            return 
false
        } 

        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "2") return false

        return 
true
    } 
  
    function 
RcptTo($ToEmail
    { 

        if(
fputs($this->Socket,  "RCPT TO: <$ToEmail>rn")<0){ 
            return 
false
        } 
        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "2") return false
            return 
true
    } 

    function 
Body() 
    { 
        
$FileSize 0
        
$Attachment null
        
$fp null

        
$buffer sprintf"From: %srnTo:%srnSubject:%srn"$this->FromName$this->ToName$this->Subject); 

        if(
fputs($this->Socket,  "DATArn")<0){ 
            return 
false
        } 
        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "3") return false
         
        if(
fputs($this->Socket$buffer)<0){ 
            return 
false
        } 


        if (
$this->Attachment == null){ 

            if(
fputs($this->Socket,  "MIME-Version: 1.0rnContent-Type: text/plain; charset=ISO-8859-1rnContent-Transfer-Encoding: 7bitrnrn")<0){ 
                return 
false
            } 
            if(
fputs($this->Socket,  "$this->Bodyrnrn")<0){ 
                return 
false
            } 
     
            if(
fputs($this->Socket,  ".rn")<0){ 
                return 
false
            } 

            
$this->Line fgets($this->Socket1024); 
            if (
substr($this->Line01) <>  "2"){ 
                return 
false;  
            }else{ 
                return 
true
            } 
        }else{ 
            if(
fputs($this->Socket"MIME-Version: 1.0rnContent-Type: multipart/mixed; boundary="----=_NextPart_000_01BCFA61.A3697360"rn"
                 
"Content-Transfer-Encoding: 7bitrnrn"
                 
"This is a multi-part message in MIME format.rn"
                 
"rn------=_NextPart_000_01BCFA61.A3697360rn"
                 
"Content-Type: text/plain; charset=ISO-8859-1rn"
                 
"Content-Transfer-Encoding: 7bitrn"
                 
"rn")<0){ 
                return 
false
            } 
     

             
/* 输出邮件内容 */ 
            
if(fputs($this->Socket,  "$this->Bodyrnrn")<0){ 
                return 
false
            } 

            if ( 
fputs($this->Socket"rn------=_NextPart_000_01BCFA61.A3697360rn")<0){ 
                return 
false
            } 
            
$FileSize filesize($this->Attachment); 
            if (
$FileSize == false){ 
                return 
false
            } 
            if ((
$fp fopen($this->Attachment"r"))== false) { 
                return 
false
            }else{ 
                
$Attachment fread($fp,$FileSize);     
            } 

             
// 如果没有附件的目录 
            
if (($AttachName strrchr($this->Attachment'/')) == false){ 

                
$AttachName $this->Attachment
            } 

            if( 
fputs($this->Socket
                 
"Content-Type: application/octet-stream; rnname="$AttachName"rn"
                 
"Content-Transfer-Encoding: quoted-printablern"
                 
"Content-Description: $AttachNamern"
                 
"Content-Disposition: attachment; rntfilename="$AttachName"rn"
                 
"rn")<0){ 
                return 
false
            } 
     
             
/* 输出附件*/ 
            
if( fputs($this->Socket$Attachment)<0){ 
                return 
false
            } 
            if ( 
fputs($this->Socket"rnrn------=_NextPart_000_01BCFA61.A3697360--rn")<0){ 
                return 
false
            } 

            if( 
fputs($this->Socket".rn")<0){ 
                return 
false
            } 

            
$this->Line fgets($this->Socket1024); 
            if (
substr($this->Line01) <>  "2"
                return 
false;  

            return 
true

        } 
    } 
  
    function 
Quit() 
    { 

        if(
fputs($this->Socket,  "QUITrn")<0){ 
            return 
false
        } 
        
$this->Line fgets($this->Socket1024); 

        
$this->Status"LASTRESULT"] = substr($this->Line01); 
        
$this->Status"LASTRESULTTXT"] = substr($this->Line01024); 

        if (
$this->Status"LASTRESULT"] <>  "2") return 0

        return 
1
    }  
    function 
Close() 
    { 
        
fclose($this->Socket); 
    } 

/* 

怎样使用这个程序的一个示例 

$MailTo = new Smtp(); 
$MailTo->SmtpMail("[email protected]","Dave Cramer", 
           "[email protected]","David", 
           "Test Mail",$MailMessage,"service.tab",0); 
$MailTo->Close(); 
$MailTo=null; 

*/ 
/* 
 $pop3 = pop3_open("localhost", "110"); 
 if (!$pop3) { 
                printf("[ERROR] Failed to connect to localhost<BR>n"); 
                return 0; 
 } 
  
 if (!pop3_user($pop3, "unk")) { 
                printf("[ERROR] Username failed!<BR>n"); 
                return 0; 
 } 
  
 if (!pop3_pass($pop3, "secret")) { 
                printf("[ERROR] PASS failed!<BR>n"); 
                return 0; 
 } 

 $articles = pop3_list($pop3); 
 if (!$articles) { 
                printf("[ERROR] LIST failed!<BR>n"); 
                return 0; 
 } 
  
 for ($i = 1; $i < $articles ["count"] + 1; $i++) 
 { 
                printf("i=$i<BR>n"); 
                $data = pop3_retr($pop3,$i); 
                if (!$data) { 
                                printf("data goes wrong on '$i'<BR>n"); 
                                return 0; 
                } 

                for ($j = 0; $j < $data["count"]; $j++) 
                { 
                                printf("$data[$j]<BR>n"); 
                } 
 } 
*/ 
?>