Since my plan for this tutorial consists primarily of improving the implementation of the “getMimeTypes()” method that was coded in the preceding article, this is the appropriate moment to list its corresponding definition, before I start modifying the method in question. Here’s how the pertaining “Mailer” class looked previously: class Mailer{ var $sender; var $recipient; var $subject; var $headers=array(); var $attachments=array(); function Mailer($sender,$recipient,$subject,$message){ // validate incoming parameters if(!preg_match("/^.+@.+$/",$sender)){ trigger_error('Invalid value for email sender.'); } if(!preg_match("/^.+@.+$/",$recipient)){ trigger_error('Invalid value for email recipient.'); } if(!$subject||strlen($subject)>255){ trigger_error('Invalid length for email subject.'); } if(!$message){ trigger_error('Invalid value for email message.'); } $this->sender=$sender; $this->recipient=$recipient; $this->subject=$subject; $this->message=$message; // define some default MIME headers $this->headers['MIME-Version']='1.0'; $this->headers['Content-Type']='multipart/mixed;boundary="MIME_BOUNDRY"'; $this->headers['From']='<'.$this->sender.'>'; $this->headers['Return-Path']='<'.$this->sender.'>'; $this->headers['Reply-To']=$this->sender; $this->headers['X-Mailer']='PHP 4/5'; $this->headers['X-Sender']=$this->sender; $this->headers['X-Priority']='3'; } // create text part of the message function buildTextPart(){ return "--MIME_BOUNDRY\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: quoted-printable\n\n\n".$this->message."\n\n"; } // create attachments part of the message function buildAttachmentPart(){ if(count($this->attachments)>0){ $attachmentPart=''; foreach($this->attachments as $attachment){ $fileStr=file_get_contents($attachment); $fileStr=chunk_split(base64_encode($fileStr)); $attachmentPart.="--MIME_BOUNDRY\nContent-Type: ".$this->getMimeType($attachment)."; name="".basename($attachment).""\nContent-disposition: attachment\nContent-Transfer-Encoding: base64\n\n".$fileStr."\n\n"; } return $attachmentPart; } } // create message MIME headers function buildHeaders(){ foreach($this->headers as $name=>$value){ $headers[]=$name.': '.$value; } return implode("\n",$headers)."\nThis is a multi-part message in MIME format.\n"; } // add new MIME header function addHeader($name,$value){ $this->headers[$name]=$value; } // add new attachment function addAttachment($attachment){ if(!file_exists($attachment)){ trigger_error('Invalid attachment.',E_USER_ERROR); } $this->attachments[]=$attachment; } // get MIME Type of attachment function getMimeType($attachment){ $nameArray=explode('.',basename($attachment)); switch(strtolower($nameArray[count($nameArray)-1])){ case 'jpg': $mimeType='image/jpeg'; break; case 'jpeg': $mimeType='image/jpeg'; break; case 'gif': $mimeType='image/gif'; break; case 'txt': $mimeType='text/plain'; break; case 'pdf': $mimeType='application/pdf'; break; case 'csv'; $mimeType='text/csv'; break; case 'html': $mimeType='text/html'; break; case 'htm': $mimeType='text/html'; break; case 'xml': $mimeType='text/xml'; break; } return $mimeType; } // send email function send(){ $to=$this->recipient; $subject=$this->subject; $headers=$this->buildHeaders(); $message=$this->buildTextPart().$this->buildAttachmentPart()."--MIME_BOUNDRY--\n"; if(!mail($to,$subject,$message,$headers)){ trigger_error('Error sendind email.',E_USER_ERROR); } } } It won’t hurt anybody if I also create a basic script that demonstrates how to use the above class, right? Take a look at the script below: // create a new instance of the 'Mailer' class $mailer=&new Mailer('alejandro@mydomain.com,'mybuddy@yourdomain.com','Testing mailer class','Hello buddy. I am sending to you a couple of attachments.'); // add some attachments $mailer->addAttachment('image1.jpg'); $mailer->addAttachment('image2.jpg'); // send MIME email $mailer->send(); As you can see, the previous MIME mailer class does a decent job when it comes to sending messages in plain text format and attaching the most common types of files, like JPG and GIF images, PDF and HTML documents, and so forth. Nonetheless, the implementation of the “getMimeType()” method still doesn’t convince me, since determining MIME types of the attached files can be done more efficiently by assigning a few simple class properties. Therefore, in the following section, I’m going to show you how to modify the signature of the aforementioned “getMimeType()” method in order to improve the overall structure of the mailer class that was listed a few lines above. To learn about how this will be done, please click on the link below and keep reading.
blog comments powered by Disqus |
|
|
|
|
|
|
|