Friday, May 13, 2011

PHP Mail Class


/**
 * Email
 *
 * @usage:
 *
 * Email::getInstance()->setEmailTo('you@email.com');
 * Email::getInstance()->setEmailFrom('me@email.com');
 * Email::getInstance()->setEmailFromName('My Name');
 * Email::getInstance()->setEmailReplyTo('replyToMe@email.com');
 * Email::getInstance()->setEmailCc('ccMe@email.com');
 * Email::getInstance()->setEmailBcc('bccMe@email.com');
 * Email::getInstance()->setEmailSubject('Subject');
 * Email::getInstance()->setEmailMessage('Message');
 * Email::getInstance()->setEmailMessageWithHtml('HTML Message');
 * Email::getInstance()->setEmailAttachment('attachment.txt');
 *
 * echo Email::getInstance()->sendEmail(); // will start a new instance when sending the email
 */

class Email {
    private $emailTo;
    private $emailFrom;
    private $emailFromName;
    private $emailCc;
    private $emailBcc;
    private $emailReplyTo;
    private $emailSubject;
    private $emailMessage;
    private $emailMessageWithHtml;
    private $emailHeader;
    private $emailAttachment;
    private $emailAttachmentFileName;
    private $emailAttachmentMimeType;
    private static $instance = null;
   
/**
* Constructor
*
* @param
* @return
*/
    public function __construct() {
        $this->emailTo                  = '';
        $this->emailFrom                = '';
        $this->emailFromName            = '';
        $this->emailCc                  = '';
        $this->emailBcc                 = '';
        $this->emailReplyTo             = '';
        $this->emailSubject             = '';
        $this->emailMessage             = '';
        $this->emailMessageWithHtml     = '';
        $this->emailHeader              = '';
        $this->emailAttachment          = '';
        $this->emailAttachmentFileName  = '';
        $this->emailAttachmentMimeType  = '';
    }
   
    /**
     * Get Instance
     *
     * @param
     * @return object
     */
    public static function getInstance() {
        if(!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
   
/**
* New Instance
*
* @param
* @return object
*/
    private static function newInstance() {
        if(isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
   
/**
* Send Email
*
* @param
* @return string
*/
    public function sendEmail() {
        $emailStatusMessage = "";

        if($this->emailFromName() != '') {
            $this->setEmailHeader($this->emailHeader()."From: ".$this->emailFromName()." <".$this->emailFrom().">\r\n");
        } else {
            $this->setEmailHeader($this->emailHeader()."From: ".$this->emailFrom()." \r\n");
        }
       
        if($this->emailReplyTo() != '') {
            $emailStatusMessage .= " Reply-To: ".$this->emailReplyTo();
            $this->setEmailHeader($this->emailHeader()."Reply-To: ".$this->emailReplyTo()." \r\n");
        }
 
        if($this->emailCc() != '') {
            $emailStatusMessage .= " cc: ".$this->emailCc();
            $this->setEmailHeader($this->emailHeader()." Cc: ".$this->emailCc()." \r\n");
        }
       
        if($this->emailBcc() != '') {
            $emailStatusMessage .= " bcc: ".$this->emailBcc();
            $this->setEmailHeader($this->emailHeader()." BCC: ".$this->emailBcc()." \r\n");
        }
       
        if($this->emailMessageWithHtml() !='' || $this->emailAttachment() != '') {
            $this->setEmailHeader($this->emailHeader()."MIME-Version: = 1.0\r\n");
        }
       
        if($this->emailAttachment() != '') {
            $fileName   = empty($this->emailAttachmentFileName) ? basename($this->emailAttachment) : $this->emailAttachmentFileName;
            $path       = dirname($this->emailAttachment);

            $file       = $path.'/'.$fileName;
            $fileSize   = filesize($file);
            $handle     = fopen($file,"r");
            $content    = fread($handle, $fileSize);
            fclose($handle);
           
            $content    = chunk_split(base64_encode($content));
            $uid        = md5(uniqid(time()));
            $name       = basename($file);
           
            $mimeType   = $this->mimeType($file);

if($mimeType == '') {
$returnEmailStatusMessage = "Email Notification was NOT sent as the MIME TYPE was not found for the file: '".$file."' for this email to: ".$this->emailTo()."".$emailStatusMessage;
           $this->newInstance();
           return $returnEmailStatusMessage;
}
           
            $this->setEmailHeader($this->emailHeader()."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."This is a multi-part message in MIME format.\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."\r\n");
           
            if($this->emailMessageWithHtml() != '') {
                $emailStatusMessage .= ", Email is HTML";
                $this->setEmailHeader($this->emailHeader()."Content-type:text/html;charset=iso-8859-1\r\n");
            } else {
                $this->setEmailHeader($this->emailHeader()."Content-type:text/plain; charset=iso-8859-1\r\n");
            }

            $this->setEmailHeader($this->emailHeader()."Content-Transfer-Encoding: 7bit\r\n\r\n");
            $this->setEmailHeader($this->emailHeader().$this->emailMessage()."\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Type: ".$mimeType."; name=\"".$fileName."\"\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Transfer-Encoding: base64\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Disposition: attachment; filename=\"".$fileName."\"\r\n\r\n");
            $this->setEmailHeader($this->emailHeader().$content."\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."--");
           
            $emailStatusMessage .= ", Email has attachment: ".$fileName;
            $this->setEmailMessage("");
        } elseif($this->emailMessageWithHtml() != '') {
            $emailStatusMessage .= ", Email is HTML";
            $this->setEmailHeader($this->emailHeader()."Content-type:text/html;charset=iso-8859-1\r\n");
        }
       
        try {
            mail(
                $this->emailTo(),
                $this->emailSubject(),
                $this->emailMessage(),
                $this->emailHeader()
            );

            $returnEmailStatusMessage = "Email Notification was successfully sent to: ".$this->emailTo()."".$emailStatusMessage;
            $this->newInstance();
            return $returnEmailStatusMessage;
        } catch (Exception $e) {
            $returnEmailStatusMessage = "ERROR: Email Notification was not sent to: ".$this->emailTo()."".$emailStatusMessage." Caught exception: ".$e->getMessage();
            $this->newInstance();
            return $returnEmailStatusMessage;
        }
    }

/**
* Set Email Attachment Mime Type
*
* @param string
* @return
*/
    public function setEmailAttachmentMimeType($emailAttachmentMimeType) {
        $this->emailAttachmentMimeType = $emailAttachmentMimeType;
    }
   
/**
* Email Attachment Mime Type
*
* @param
* @return string
*/
    public function emailAttachmentMimeType() {
        return $this->emailAttachmentMimeType;
    }
   
/**
* Set Email Attachment File Name
*
* @param string
* @return
*/
    public function setEmailAttachmentFileName($emailAttachmentFileName) {
        $this->emailAttachmentFileName = $emailAttachmentFileName;
    }
   
    /**
* Email Attachment File Name
*
* @param
* @return string
*/
    public function emailAttachmentFileName() {
        return $this->emailAttachmentFileName;
    }
   
/**
* Set Email Attacchment
*
* @param string
* @return
*/
    public function setEmailAttachment($emailAttachment) {
        $this->emailAttachment = $emailAttachment;
    }
   
    /**
* Email Attachment
*
* @param
* @return string
*/
    public function emailAttachment() {
        return $this->emailAttachment;
    }
   
/**
* Set Email To
*
* @param string
* @return
*/
    public function setEmailTo($emailTo) {
        $this->emailTo = $emailTo;
    }
   
/**
* Email To
*
* @param
* @return string
*/
    public function emailTo() {
        return $this->emailTo;
    }
   
/**
* Set Email From
*
* @param string
* @return
*/
    public function setEmailFrom($emailFrom) {
        $this->emailFrom = $emailFrom;
    }
   
/**
* Email From
*
* @param
* @return string
*/
    public function emailFrom() {
        return $this->emailFrom;
    }
   
/**
* Set Email From Name
*
* @param string
* @return
*/
    public function setEmailFromName($emailFromName) {
        $this->emailFromName = $emailFromName;
    }
   
/**
* Email From Name
*
* @param
* @return string
*/
    public function emailFromName() {
        return $this->emailFromName;
    }
   
/**
* Set Email Reply To
*
* @param string
* @return
*/
    public function setEmailReplyTo($emailReplyTo) {
        $this->emailReplyTo = $emailReplyTo;
    }
   
/**Email Reply To
*
*
* @param
* @return string
*/
    public function emailReplyTo() {
        return $this->emailReplyTo;
    }
   
/**
* Set Email CC
*
* @param string
* @return
*/
    public function setEmailCc($emailCc) {
        $this->emailCc = $emailCc;
    }
   
/**
* Email CC
*
* @param
* @return string
*/
    public function emailCc() {
        return $this->emailCc;
    }
   
/**
* Set Email BCC
*
* @param string
* @return
*/
    public function setEmailBcc($emailBcc) {
        $this->emailBcc = $emailBcc;
    }
   
/**
* Email BCC
*
* @param
* @return string
*/
    public function emailBcc() {
        return $this->emailBcc;
    }
   
/**
* Set Email Subject
*
* @param string
* @return
*/
    public function setEmailSubject($emailSubject) {
        $this->emailSubject = $emailSubject;
    }
   
/**
* Email Subject
*
* @param
* @return string
*/
    public function emailSubject() {
        return $this->emailSubject;
    }
   
/**
* Set Email Message
*
* @param string
* @return
*/
    public function setEmailMessage($emailMessage) {
        $this->emailMessage = $emailMessage;
    }
   
/**
* Email Message
*
* @param
* @return string
*/
    public function emailMessage() {
    if(is_array($this->emailMessage)) {
    return implode("\n\r", $this->emailMessage);
    }
        return $this->emailMessage;
    }
   
/**
* Set Email Message With HTML
*
* @param string
* @return
*/
    public function setEmailMessageWithHtml($emailMessageWithHtml) {
        $this->emailMessageWithHtml = $emailMessageWithHtml;
        $this->setEmailMessage($emailMessageWithHtml);
    }
   
/**
* Email Message With HTML
*
* @param
* @return string
*/
    public function emailMessageWithHtml() {
        return $this->emailMessageWithHtml;
    }
   
/**
* Set Email Header
*
* @param string
* @return
*/
    public function setEmailHeader($emailHeader) {
        $this->emailHeader = $emailHeader;
    }
   
/**
* Email Header
*
* @param
* @return string
*/
    public function emailHeader() {
        return $this->emailHeader;
    }
   
/**
* Mime Type
*
* @param string
* @return string
*/
    public function mimeType($file) {
        $mimeTypes = array(
            "323"       => "text/h323",
            "acx"       => "application/internet-property-stream",
            "ai"        => "application/postscript",
            "aif"       => "audio/x-aiff",
            "aifc"      => "audio/x-aiff",
            "aiff"      => "audio/x-aiff",
            "asf"       => "video/x-ms-asf",
            "asr"       => "video/x-ms-asf",
            "asx"       => "video/x-ms-asf",
            "au"        => "audio/basic",
            "avi"       => "video/x-msvideo",
            "axs"       => "application/olescript",
            "bas"       => "text/plain",
            "bcpio"     => "application/x-bcpio",
            "bin"       => "application/octet-stream",
            "bmp"       => "image/bmp",
            "c"         => "text/plain",
            "cat"       => "application/vnd.ms-pkiseccat",
            "cdf"       => "application/x-cdf",
            "cer"       => "application/x-x509-ca-cert",
            "class"     => "application/octet-stream",
            "clp"       => "application/x-msclip",
            "cmx"       => "image/x-cmx",
            "cod"       => "image/cis-cod",
            "cpio"      => "application/x-cpio",
            "crd"       => "application/x-mscardfile",
            "crl"       => "application/pkix-crl",
            "crt"       => "application/x-x509-ca-cert",
            "csh"       => "application/x-csh",
            "css"       => "text/css",
            "dcr"       => "application/x-director",
            "der"       => "application/x-x509-ca-cert",
            "dir"       => "application/x-director",
            "dll"       => "application/x-msdownload",
            "dms"       => "application/octet-stream",
            "doc"       => "application/msword",
            "dot"       => "application/msword",
            "dvi"       => "application/x-dvi",
            "dxr"       => "application/x-director",
            "eps"       => "application/postscript",
            "etx"       => "text/x-setext",
            "evy"       => "application/envoy",
            "exe"       => "application/octet-stream",
            "fif"       => "application/fractals",
            "flr"       => "x-world/x-vrml",
            "gif"       => "image/gif",
            "gtar"      => "application/x-gtar",
            "gz"        => "application/x-gzip",
            "h"         => "text/plain",
            "hdf"       => "application/x-hdf",
            "hlp"       => "application/winhlp",
            "hqx"       => "application/mac-binhex40",
            "hta"       => "application/hta",
            "htc"       => "text/x-component",
            "htm"       => "text/html",
            "html"      => "text/html",
            "htt"       => "text/webviewhtml",
            "ico"       => "image/x-icon",
            "ief"       => "image/ief",
            "iii"       => "application/x-iphone",
            "ins"       => "application/x-internet-signup",
            "isp"       => "application/x-internet-signup",
            "jfif"      => "image/pipeg",
            "jpe"       => "image/jpeg",
            "jpeg"      => "image/jpeg",
            "jpg"       => "image/jpeg",
            "js"        => "application/x-javascript",
            "latex"     => "application/x-latex",
            "lha"       => "application/octet-stream",
            "log"       => "text/plain",
            "lsf"       => "video/x-la-asf",
            "lsx"       => "video/x-la-asf",
            "lzh"       => "application/octet-stream",
            "m13"       => "application/x-msmediaview",
            "m14"       => "application/x-msmediaview",
            "m3u"       => "audio/x-mpegurl",
            "man"       => "application/x-troff-man",
            "mdb"       => "application/x-msaccess",
            "me"        => "application/x-troff-me",
            "mht"       => "message/rfc822",
            "mhtml"     => "message/rfc822",
            "mid"       => "audio/mid",
            "mny"       => "application/x-msmoney",
            "mov"       => "video/quicktime",
            "movie"     => "video/x-sgi-movie",
            "mp2"       => "video/mpeg",
            "mp3"       => "audio/mpeg",
            "mpa"       => "video/mpeg",
            "mpe"       => "video/mpeg",
            "mpeg"      => "video/mpeg",
            "mpg"       => "video/mpeg",
            "mpp"       => "application/vnd.ms-project",
            "mpv2"      => "video/mpeg",
            "ms"        => "application/x-troff-ms",
            "mvb"       => "application/x-msmediaview",
            "nws"       => "message/rfc822",
            "oda"       => "application/oda",
            "p10"       => "application/pkcs10",
            "p12"       => "application/x-pkcs12",
            "p7b"       => "application/x-pkcs7-certificates",
            "p7c"       => "application/x-pkcs7-mime",
            "p7m"       => "application/x-pkcs7-mime",
            "p7r"       => "application/x-pkcs7-certreqresp",
            "p7s"       => "application/x-pkcs7-signature",
            "pbm"       => "image/x-portable-bitmap",
            "pdf"       => "application/pdf",
            "pfx"       => "application/x-pkcs12",
            "pgm"       => "image/x-portable-graymap",
            "pko"       => "application/ynd.ms-pkipko",
            "pma"       => "application/x-perfmon",
            "pmc"       => "application/x-perfmon",
            "pml"       => "application/x-perfmon",
            "pmr"       => "application/x-perfmon",
            "pmw"       => "application/x-perfmon",
            "pnm"       => "image/x-portable-anymap",
            "pot"       => "application/vnd.ms-powerpoint",
            "ppm"       => "image/x-portable-pixmap",
            "pps"       => "application/vnd.ms-powerpoint",
            "ppt"       => "application/vnd.ms-powerpoint",
            "prf"       => "application/pics-rules",
            "ps"        => "application/postscript",
            "pub"       => "application/x-mspublisher",
            "qt"        => "video/quicktime",
            "ra"        => "audio/x-pn-realaudio",
            "ram"       => "audio/x-pn-realaudio",
            "ras"       => "image/x-cmu-raster",
            "rgb"       => "image/x-rgb",
            "rmi"       => "audio/mid",
            "roff"      => "application/x-troff",
            "rtf"       => "application/rtf",
            "rtx"       => "text/richtext",
            "scd"       => "application/x-msschedule",
            "sct"       => "text/scriptlet",
            "setpay"    => "application/set-payment-initiation",
            "setreg"    => "application/set-registration-initiation",
            "sh"        => "application/x-sh",
            "shar"      => "application/x-shar",
            "sit"       => "application/x-stuffit",
            "snd"       => "audio/basic",
            "spc"       => "application/x-pkcs7-certificates",
            "spl"       => "application/futuresplash",
            "src"       => "application/x-wais-source",
            "sst"       => "application/vnd.ms-pkicertstore",
            "stl"       => "application/vnd.ms-pkistl",
            "stm"       => "text/html",
            "svg"       => "image/svg+xml",
            "sv4cpio"   => "application/x-sv4cpio",
            "sv4crc"    => "application/x-sv4crc",
            "t"         => "application/x-troff",
            "tar"       => "application/x-tar",
            "tcl"       => "application/x-tcl",
            "tex"       => "application/x-tex",
            "texi"      => "application/x-texinfo",
            "texinfo"   => "application/x-texinfo",
            "tgz"       => "application/x-compressed",
            "tif"       => "image/tiff",
            "tiff"      => "image/tiff",
            "tr"        => "application/x-troff",
            "trm"       => "application/x-msterminal",
            "tsv"       => "text/tab-separated-values",
            "txt"       => "text/plain",
            "uls"       => "text/iuls",
            "ustar"     => "application/x-ustar",
            "vcf"       => "text/x-vcard",
            "vrml"      => "x-world/x-vrml",
            "wav"       => "audio/x-wav",
            "wcm"       => "application/vnd.ms-works",
            "wdb"       => "application/vnd.ms-works",
            "wks"       => "application/vnd.ms-works",
            "wmf"       => "application/x-msmetafile",
            "wps"       => "application/vnd.ms-works",
            "wri"       => "application/x-mswrite",
            "wrl"       => "x-world/x-vrml",
            "wrz"       => "x-world/x-vrml",
            "xaf"       => "x-world/x-vrml",
            "xbm"       => "image/x-xbitmap",
            "xla"       => "application/vnd.ms-excel",
            "xlc"       => "application/vnd.ms-excel",
            "xlm"       => "application/vnd.ms-excel",
            "xls"       => "application/vnd.ms-excel",
            "xlsx"      => "vnd.ms-excel",
            "xlt"       => "application/vnd.ms-excel",
            "xlw"       => "application/vnd.ms-excel",
            "xof"       => "x-world/x-vrml",
            "xpm"       => "image/x-xpixmap",
            "xwd"       => "image/x-xwindowdump",
            "z"         => "application/x-compress",
            "zip"       => "application/zip"
        );
       
        $extension = end(explode('.', $file));
        return $mimeTypes[$extension];
    }
}

?>

2 comments:

xyz said...

Hi Phil,

I have a problem with your email class. I am sending a email with a pdf attachment.
When I receiced this message, I can't open the pdf, outlook is telling me that the pdf is damaged or wrongly mime typed.
Please advice.....

Phill said...

Is the PDF corrupt?