一个可以发送附件及HTML格式邮件的PHP类
一个用Php Class写的发信程序
这个类里显示了发送MIME的方法,也就是HTML格式信件和附件发送的问题。

<? 
/* 
Mail: An object to encapsulate the sending of email. Allows user-specified  
From: addresses, handles the encoding of attachments; conforms more or less to  
MIME standards.. Uses sendmail to send the mail, mimencode to do the MIME  
encoding, and zip to automatically zip attachments. 

Contacting the author(s): 
Brought to you by the team at Sequoia Softworks, http://www.sequoiasoft.com 
Feel free to contact [email protected] and tell us how you like it! 
(Or to complain bitterly, report bugs, or suggest new features.) 

Known shortcomings/bugs: 
o guessMIMEType()only knows about a few MIME types. You can expand this as  
  you need. 
o $mime_boundary in the Send() method should be randomly generated, but it  
  isn't likely to ever hurt anything in its current form 

Example: 
 require("Mail.phtml"); 
 $mymessage = new Mail(); 
 $mymessage->from = "[email protected]"; 
 $mymessage->to = "[email protected]"; 
 $mymessage->subject = "This is your lucky day"; 
 $mymessage->headers["Reply-To"] = "[email protected]"; 
 $mymessage->headers["X-Extra-Header"] = "Pointless Header v3.0"; 
 $mymessage->body = "Doesn't it feel good to get mail?nEspecially with files  
 attached!n"; 
 $mymessage->attachments[0] = "tarball.tar.gz"; 
 $mymessage->attachments[1] = "images/smiling_countenance.gif"; 
 $mymessage->attachments[2] = "/usr/share/reference/jargondict.html"; 
 $mymessage->attachments[3] = "./core"; 
 $mymessage->attachments[4] = "/etc/passwd";  //naughty naughty!! 
 $mymessage->ZipAttachments("your_files.zip"); //uncomment this to zip all  
                                               //the attachments into one big  
                                               //attachment. 
 $mymessage->Send(); 
*/ 
class Mail 
    var 
$from//The sender 
    
var $to//The recipient 
    
var $subject//The subject line 
    
var $headers//A hash of additional headers (headername => headervalue) 
    
var $zipname//The name of the file the attachments are zipped into 
                  //($zipname == false if attachments are to be sent  
                      //individually) 
    
var $attachments//An array of files to attach 
    
var $body//The body text of the message 
     
    //Mail constructor: initializes vars to default values. 'Nuff said. 
    
function Mail() { 
        
$this->from ""
        
$this->to ""
        
$this->subject ""
        
$this->headers = array(); 
        
$this->zipname false
        
$this->attachments = array(); 
        
$this->body ""
    } 
     
    
//Auxiliary method, used to guess a file's MIME type 
    //based on its extension. Doesn't know about too many 
    //extensions right now 
    
function guessMIMEType($filename) { 
        
//GUESS MIME TYPE 
        
$filename basename($filename); 
        if(
strrchr($filename,".") == false) { 
            return(
"application/octet-stream"); 
        } 
         
        
$ext strrchr($filename,"."); 
        switch(
$ext) { 
            case 
".gif"
                return 
"image/gif"
                break; 
            case 
".gz"
                return 
"application/x-gzip"
            case 
".htm"
            case 
".html"
                return 
"text/html"
                break; 
            case 
".jpg"
                return 
"image/jpeg"
                break; 
            case 
".tar"
                return 
"application/x-tar"
                break; 
            case 
".txt"
                return 
"text/plain"
                break; 
            case 
".zip"
                return 
"application/zip"
                break; 
            default: 
                return 
"application/octet-stream"
                break; 
        } 
    } 

    
//Cute little convenience method. Supply it with a filename to  
    //zip attachments to, or supply it with false if attachments are 
    //sent individually 
    
function ZipAttachments($name) { 
        
$this->zipname $name
    } 

    
//The workhorse method, does the actually sending of the mail. 
    //Doesn't check for errors so be careful! 
    
function Send($sendmail "sendmail") { 
        if(
$this->from == ""
            
$fp popen($sendmail " -i " $this->to"w"); 
        else 
            
$fp popen($sendmail " -i -f"" . $this->from . ""  
$this->to"w"); 

        
$mime_boundary "-1747901728-1448367683-913849620=:4553"
         
        if(
$fp == false
            return 
false
         
        
//Write subject header     
        
fwrite($fp,"Subject: " $this->subject "n"); 
     
        
//Write user-defined headers     
        
reset($this->headers); 
        while(list(
$hdrname,$hdrval) = each($this->headers)) { 
            
fwrite($fp,$hdrname ": " $hdrval "n"); 
        } 
         
        
//If there are attachments, this needs to be a MIME message 
        
if(count($this->attachments) > 0) { 
            
//Write MIME headers 
            
fwrite($fp,"MIME-Version: 1.0n"); 
            
fwrite($fp,"Content-Type: multipart/mixed; BOUNDARY=""  
. $mime_boundary . ""n"
); 
            
fwrite($fp,"n"); 
            
//Write dummy message body 
            
fwrite($fp,"  This message is in MIME format.  The  
first part should be readable text,n"
); 
            
fwrite($fp,"  while the remaining parts are likely  
unreadable without MIME-aware tools.n"
); 
            
fwrite($fp,"  Send mail to  
[email protected] for more info.n"
); 
            
fwrite($fp,"n"); 
             
            
//Write message text 
            
fwrite($fp,"--" "$mime_boundary" "n"); 
            
fwrite($fp,"Content-Type: text/plain; charset=US- 
ASCIIn"
); 
            
fwrite($fp,"n"); 
            
fwrite($fp,$this->body); 
            
fwrite($fp,"n"); 
             
            
//Handle attachments 
            
if($this->zipname != false) { //IF we've been told to  
                                                      //zip the attachments 
                
fwrite($fp,"--" $mime_boundary "n"); 
                
fwrite($fp,"Content-Type: application/zip; name= 
"". $this
->zipname . ""n"); 
                
fwrite($fp,"Content-Transfer-Encoding: base64 
n"
); 
                  
//fwrite($fp,"Content-ID: " . $content_ID . "n"); 
                
fwrite($fp,"Content-Description:n"); 
                
fwrite($fp,"n"); 
                
$cmdline "zip - "
        while(list(
$key$attachment_name) =  each($this->attachments)) 
                    
$cmdline .= "$attachment_name "
                
$cmdline .= "| mimencode -b"
                
$pp popen($cmdline,"r"); 
                while(!
feof($pp)) { 
                    
$data fread($pp,4096); 
                    
fwrite($fp,$data); 
                } 
                
pclose($pp); 
            } 
            else { 
//no need to zip the attachments, attach them  
                               //separately 
        
while(list($key$attachment_name) = each($this->attachments)) { 
                
fwrite($fp,"--" $mime_boundary "n"); 
      
fwrite($fp,"Content-Type: " $this->guessMIMEType($attachment_name) . ";  
      name="". basename($attachment_name) . ""n"
); 
            
fwrite($fp,"Content-Transfer-Encoding: base64n"); 
                    
//fwrite($fp,"Content-ID: " .  
                                        //$content_ID . "n"); 
                    
fwrite($fp,"Content-Description:n"); 
                    
fwrite($fp,"n"); 
                     
$pp popen("mimencode -b $attachment_name","r"); 
                    while(!
feof($pp)) { 
                        
$data fread($pp,4096); 
                        
fwrite($fp,$data); 
                    } 
                    
pclose($pp); 
                } 
            } 
             
            
fwrite($fp,"--" $mime_boundary "--n"); 
        } 
        
//No need for a MIME message, so it's an RFC822 message 
        
else { 
            
fwrite($fp,"n"); 
            
fwrite($fp,$this->body); 
        } 
         
         
        
pclose($fp); 
    } 

?>