This is a pretty robust PHP Email class that I wrote a few years back. Has the capability to do text or html e-mails with multiple attachments. Enjoy!
<?php /******************************************************************************\ -- -- Class Name: eMail -- Purpose: Handles various aspects of sending/generating e-mails in PHP. -- Current Capabilities: - Allows multiple "To" recipients - Allows multiple "Cc" recipients - Allows multiple "Bcc" recipients - Allows "From" header to be modified - Allows "Sender" header to be modified - Allows "Content-Type" for text or html - Allows for multiple attachments - Checks e-mail addresses via regular expressions to verify they will not cause errors - -- \******************************************************************************/ //Define class class eMail { /******************************************************************************\ -- -- User Specific Variables -- Purpose: Variables which should/may be modified by the user. This -- defines defaults used in the program that can be changed later. -- \******************************************************************************/ //Set Default Variables var $replyTo = 'System <system@example.com>'; //Default reply address var $from = 'System <system@example.com>'; //Default From address var $sender = 'System <system@example.com>'; //Default Sender address var $isHTML = false; //False sends e-mail in plain text by default var $nl = "\n"; // New Line character, either \r\n or \n /******************************************************************************\ -- -- Constant variables -- Purpose: The constant variables should not be changed/modified unless -- you know what you are messing with. -- \******************************************************************************/ //Constants var $errors = null; //Array to hold any errors which may occur var $attachments = null; //Array to hold attachments var $mime_boundary = null; //boundary set for using attachments var $to = null; //Array to hold recipients var $cc = null; //Array to hold recipients var $bcc = null; //Array to hold recipients var $header = null; //Header used to send e-mail var $subject = null; //Subject of the e-mail var $body = null; //Message portion of the e-mail var $message = null; //used to build message when mail is sent /******************************************************************************\ -- -- Regular Expressions -- Purpose: Used in error checking e-mail addresses and various parts of -- the emails. -- \******************************************************************************/ //Regular Expressions for Error Checking //Email address with no name attached var $regex_email = '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$'; //Email address with name attached var $regex_email2 = '^([\._A-Za-z0-9-]+[ ]+)+[<][_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+[>]$'; //Regular Expression for limiting body of message var $regex_body = '^.*$'; //Regular Expression for limiting subject of message var $regex_subject = '^.+$'; /******************************************************************************\ -- -- User Functions -- Purpose: Allows user to add recipients, attachments, body, subject,etc. -- \******************************************************************************/ //Class Constructor, automatically called when a new object is created function eMail(){} //Adds a recipient for the e-mail function addTo($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->to[sizeOf($this->to)] = $email_addr; return true; } else{ return false; } } //Adds a Carbon Copy address for the e-mail function addCC($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->cc[sizeOf($this->cc)] = $email_addr; return true; } else{ return false; } } //Adds a Blind Carbon Copy address for the e-mail function addBCC($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->bcc[sizeOf($this->bcc)] = $email_addr; return true; } else{ return false; } } //Sets the from header for the e-mail function setFrom($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->from = $email_addr; return true; } else{ $this->addError("Invalid Format for FROM e-mail address"); return false; } } //Sets the ReplyTo header for the e-mail function setReplyTo($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->replyTo = $email_addr; return true; } else{ $this->addError("Invalid Format for ReplyTo e-mail address"); return false; } } //Sets the Sender header for the e-mail function setSender($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->replyTo = $email_addr; return true; } else{ $this->addError("Invalid Format for Sender e-mail address"); return false; } } //Sets the From, ReplyTo, and Sender header with one e-mail function setSenderInfo($email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ $this->replyTo = $email_addr; $this->sender = $email_addr; $this->from = $email_addr; return true; } else{ $this->addError("Invalid Format for From, Sender, and ReplyTo e-mail addresses"); return false; } } //Sets the subject of the e-mail and verifies that all characters are allowed function setSubject($subjectIn){ if($this->verify_subject($subjectIn)){ $this->subject = $subjectIn; return true; } else{ return false; } } //Sets the body of the e-mail and verifies that all characters in the body is allowed function setBody($bodyIn, $html_flag = false){ $this->isHTML = $html_flag; if($this->verify_body($bodyIn)){ $this->body = $bodyIn; return true; } else{ return false; } } //Adds an attachment to be sent with the email function addAttachment($fileData, $fileName = "unknown", $fileType = ""){ $currSize = sizeOf($this->attachments); $this->attachments[$currSize][0] = $fileData; $this->attachments[$currSize][1] = $fileName; $this->attachments[$currSize][2] = $fileType; } /******************************************************************************\ -- -- Send Mail Function -- Purpose: Sends the e-mail after everything is setup. -- \******************************************************************************/ //Sets the mail headers for HTML, generates all the e-mail parameters and sends it function sendMail(){ //Check body content via regular expression $this->verify_body($this->body); //Check subject content via regular expression $this->verify_subject($this->subject); //Verify at least on "To","Cc", or "Bcc" address is contained if($this->to==null && $this->cc==null && $this->bcc==null){ $this->addError("E-mail must contain at least one \"To\",\"Cc\", or \"Bcc\" address"); } //Begin to build the header $this->header = ""; //Set a MIME-version $this->header .= "MIME-version: 1.0" . $this->nl; //Setup Sender, From, Bcc, CC, and ReplyTo regardless of mail format $this->replyTo = $this->clean_email($this->replyTo); if($this->replyTo != null){ if($this->verify_email($this->replyTo)){ $this->header .= "Reply-To: $this->replyTo" . $this->nl; } else{ $this->addError("Invalid Reply-To Header: $this->replyTo"); } } //Setup sender $this->sender = $this->clean_email($this->sender); if($this->sender != null){ if($this->verify_email($this->sender)){ $this->header .= "Sender: $this->sender" . $this->nl; } else{ $this->addError("Invalid Sender Header: $this->sender"); } } //Setup from $this->from = $this->clean_email($this->from); if($this->from != null){ if($this->verify_email($this->from)){ $this->header .= "From: $this->from" . $this->nl; } else{ $this->addError("Invalid From Header: $this->from"); } } //Verify all addresses in cc if($this->cc!=null){ foreach($this->cc as $email_addr){ $email_addr = $this->clean_email($email_addr); $this->verify_email($email_addr); $email_addr = $email_addr; $this->header .= "Cc: $email_addr" . $this->nl; } } //Verify all addresses in bcc if($this->bcc != null){ foreach($this->bcc as $email_addr){ $email_addr = $this->clean_email($email_addr); $this->verify_email($email_addr); $email_addr = $email_addr; $this->header .= "Bcc: $email_addr" . $this->nl; } } //If contains attachments, generate mail with multiple parts if($this->attachments!=null){ //Generate a boundary to separate the message body // and attachments $this->mime_boundary = "==Multipart_Boundary_x{".md5(time())."}x"; //Set Content type to multipart for attachments $this->header .= "Content-type: multipart/mixed;" . $this->nl; //Put boundary in header of e-mail $this->header .= " boundary=\"{$this->mime_boundary}\""; //Setup the boundary for the body content $this->message .= "--{$this->mime_boundary}" . $this->nl; //If html set content type to that in message, else plain text if($this->isHTML){ $this->message .= "Content-Type: text/html; charset=ISO-8859-1" . $this->nl; } else{ $this->message .= "Content-type: text/plain; charset=ISO-8859-1" . $this->nl; } //Set transfer encoding $this->message .= "Content-Transfer-Encoding: 7bit" . $this->nl . $this->nl; //Add the body to the message $this->message .= $this->body . $this->nl . $this->nl; //Add attachments for($i=0;$i<sizeOf($this->attachments);$i++){ //Put boundary before each attachment $this->message .= "--{$this->mime_boundary}" . $this->nl; //Set content type of attachment $this->message .= "Content-Type: {$this->attachments[$i][2]};" . $this->nl; //Set name for the attachment $this->message .= " name=\"".$this->attachments[$i][1]."\"" . $this->nl; //Let message know this is an attachment $this->message .= "Content-Disposition: attachment;" . $this->nl; //Set filename for the attachment $this->message .= " filename=\"".$this->attachments[$i][1]."\"" . $this->nl; //Set to base64 content encoding $this->message .= "Content-Transfer-Encoding: base64" . $this->nl . $this->nl; //Add attachment and encode to base64 $this->message .= chunk_split(base64_encode($this->attachments[$i][0])) . $this->nl; } //Close off attachments $this->message .= "--{$this->mime_boundary}--" . $this->nl . $this->nl; } //Does not contain attachments, generate mail normally else { //If html set header to define it if($this->isHTML){ $this->header .= "Content-type: text/html; charset=iso-8859-1" . $this->nl; } else{ $this->header .= "Content-type: text/plain; charset=ISO-8859-1" . $this->nl; } //Add body to the message $this->message = $this->body; } //Generate To: recipients $to_string = ""; if($this->to!=null){ $this->count=0; foreach($this->to as $email_addr){ $email_addr = $this->clean_email($email_addr); if($this->verify_email($email_addr)){ if($this->count>0){ $to_string .= ', '; } $to_string .= $email_addr; $this->count++; } } } //If an error has occurred, do not send the message and return the last error if($this->errors!=null){ return false; } else{ //Close off the header of the message $this->header .= $this->nl; //Send the message return mail($to_string, $this->subject, $this->message, $this->header); } } /******************************************************************************\ -- -- Error Functions -- Purpose: Internal functions to store errors and public ones to retrieve -- them. -- \******************************************************************************/ //Returns the array of errors function getErrors(){ return $this->errors; } //Returns only the last error which was logged function getLastError(){ if($this->errors!=null){ return $this->errors[sizeOf($this->errors)-1]; } else { return false; } } //Adds an error to the error array function addError($errorIn){ $this->errors[sizeOf($this->errors)] = $errorIn; } /******************************************************************************\ -- -- Message Compilation Functions -- Purpose: Functions which return different components of the message -- \******************************************************************************/ //Returns the message header function getHeader(){ return $this->header; } //Returns the message contents, not generated until after mail is sent function getMessage(){ return $this->message; } //Returns the body portion of the e-mail function getBody(){ return $this->body; } /******************************************************************************\ -- -- Error Checking/Cleansing Functions -- Purpose: Functions to remove common errors from input and to verify -- different portions of the message with regular expressions -- \******************************************************************************/ //Removes e-mail addresses of commas and semi-colons which may cause // problems in the message headers function clean_email($email_addr){ if($email_addr!=null){ $email_addr = str_replace(","," ",$email_addr); $email_addr = str_replace(";"," ",$email_addr); } return $email_addr; } //Verifies that e-mail addresses in arguments match one form of // e-mail via regular expressions function verify_email($email_addr){ if (eregi($this->regex_email, $email_addr)) return true; else if (eregi($this->regex_email2, $email_addr)) return true; else { $this->addError("Invalid E-mail Address: $email_addr"); return false; } } //Verifies that the body portion of message matches a given // regular expression. Nice for setting a minimum message length. function verify_body($body){ if (eregi($this->regex_body, $body)) return true; else { $this->addError("Invalid Body Content: $body"); return false; } } //Verifies that the subject portion of message matches a given // regular expression. Nice for setting a minimum subject length. function verify_subject($subject){ if (eregi($this->regex_subject, $subject)) return true; else { $this->addError("Invalid Subject Content: $subject"); return false; } } /******************************************************************************\ \******************************************************************************/ //Close Class Definition }
Usage Examples:
/******************************************************************************\ -- -- Program Use Examples -- Purpose: The following are a few examples on using the eMail class in -- an application. -- \******************************************************************************/ /******************************************************************************\ Example 1: Basic Text E-mail //Initialize e-mail object $email = new eMail(); //Add a To recipient $email->addTo("example@example.com"); //Add a subject for the e-mail $email->subject = "Test E-mail Subject"; //Set the body portion of the e-mail $email->setBody(' This is a text body in an e-mail. Nothing else is required, it can now be sent. '); //Send the e-mail $email->sendMail(); -------------------------------------------------------------------------------- Example 2: Basic Html E-mail //Initialize e-mail object $email = new eMail(); //Add a To recipient $email->addTo("example@example.com"); //Add a subject for the e-mail $email->subject = "Test E-mail Subject"; //Set the body portion of the e-mail, setting it to HTML with the // second parameter. $email->setBody(' This is now a html body in an e-mail.<HR> Nothing else is required, it can now be sent. ', true); //Send the e-mail $email->sendMail(); -------------------------------------------------------------------------------- Example 3: Basic Attachment Example with an Html body //Initialize e-mail object $email = new eMail(); //Add a To recipient $email->addTo("example@example.com"); //Add a subject for the e-mail $email->subject = "Test E-mail Subject"; //Set the body portion of the e-mail, setting it to HTML with the // second parameter. $email->setBody(' This is now a html body in an e-mail.<HR> Nothing else is required, it can now be sent. ', true); //Add an attachment to the e-mail $email->addAttachment("Text in the attachment","filename.txt","text/plain"); //Send the e-mail $email->sendMail(); -------------------------------------------------------------------------------- Example 4: Multiple Attachments //Initialize e-mail object $email = new eMail(); //Add a To recipient $email->addTo("example@example.com"); //Add a subject for the e-mail $email->subject = "Test E-mail Subject"; //Set the body portion of the e-mail, setting it to HTML with the // second parameter. $email->setBody(' This is now a html body in an e-mail.<HR> Nothing else is required, it can now be sent. ', true); //Attach an html file containing the body of the message $email->addAttachment($email->body,"email_body.html","text/html"); //Attach a second file $email->addAttachment("File Data","Attachment01.txt"); //Send the e-mail $email->sendMail(); \******************************************************************************/ ?>
Useful Links: