This is a discussion on mail function within the PHP Programming forums, part of the Web Development category; how to attach files in the mail function...
| |||||||
| Register | FAQ | Members List | Calendar | Mark Forums Read |
| |||
| the following class can be used for mail attachments using mime mail. <?php /* --------------------------------------------------------- MIME Class: Allows creation of e-mail messages via the MIME Standard. The class supports multiple attachments and presenting an e-mail in HTML. --------------------------------------------------------- */ include ("MIME.def"); class MIME_mail { //public: var $to; var $from; var $subject; var $body; var $headers = ""; var $errstr=""; // these are the names of the encoding functions, user // provide the names of user-defined functions var $base64_func= ''; # if !specified use PHP's base64 var $qp_func = ''; # None at this time // If do not have a local mailer..use this array to pass info of an SMTP object // e.g. $mime_mail->mailer = array('name' => 'smtp', method => 'smtp_send()'); // 'name' is the name of the object less the $ and 'method' can have parameters // specific to itself. If you are using MIME_mail object's to, from, etc. // remember to send parameters a literal strings referring 'this' object!!!! // If in doubt, you are probably better off subclassing this class... var $mailer = ""; # Set this to the name of a valid mail object //private: var $mimeparts = array(); // Constructor. function MIME_mail($from="", $to="", $subject="", $body="", $headers = "") { $this->to = $to; $this->from = $from; $this->subject = $subject; $this->body = $body; if (is_array($headers)) { if (sizeof($headers)>1) $headers=join(CRLF, $headers); else $headers=$headers[0]; } if ($from) { $headers = preg_replace("!(from:\ ?.+?[\r\n]?\b)!i", '', $headers); } $this->headers = chop($headers); $this->mimeparts[] = "" ; //Bump up location 0; $this->errstr = ""; return; } /* --------------------------------------------------------- Attach a 'file' to e-mail message Pass a file name to attach. This function returns a success/failure code/key of current attachment in array (+1). Read attach() below. --------------------------------------------------------- */ function fattach($path, $description = "", $contenttype = OCTET, $encoding = BASE64, $disp = '') { $this->errstr = ""; if (!file_exists($path)) { $this->errstr = "File does not exist"; return 0; } // Read in file $fp = fopen($path, "rb"); # (b)inary for Win compatability if (!$fp) { $this->errstr = "fopen() failed"; return 0; //failed } $contenttype .= ";\r\n\tname=".basename($path); $data = fread($fp, filesize($path)); return $this->attach($data, $description, $contenttype, $encoding, $disp); } /* --------------------------------------------------------- Attach data provided by user (rather than a file) Useful when you want to MIME encode user input like HTML. NOTE: This function returns key at which the requested data is attached. IT IS CURRENT KEY VALUE + 1!! Construct the body with MIME parts --------------------------------------------------------- */ function attach($data, $description = "", $contenttype = OCTET, $encoding = BASE64, $disp = '') { $this->errstr = ""; if (empty($data)) { $this->errstr = "No data to be attached"; return 0; } if (trim($contenttype) == '') $contenttype = OCTET ; if (trim($encoding) == '') $encoding = BASE64; if ($encoding == BIT7) $emsg = $data; elseif ($encoding == QP) $emsg = $$this->qp_func($data); elseif ($encoding == BASE64) { if (!$this->base64_func) # Check if there is user-defined function $emsg = base64_encode($data); else $emsg = $$this->base64_func($data); } $emsg = chunk_split($emsg); //Check if content-type is text/plain and if charset is not specified append default CHARSET if (preg_match("!^".TEXT."!i", $contenttype) && !preg_match("!;charset=!i", $contenttype)) $contenttype .= ";\r\n\tcharset=".CHARSET ; $msg = sprintf("Content-Type: %sContent-Transfer-Encoding: %s%s%s%s", $contenttype.CRLF, $encoding.CRLF, ((($description) && (BODY != $description))?"Content-Description: $description".CRLF:""), ($disp?"Content-Disposition: $disp".CRLF:""), CRLF.$emsg.CRLF); BODY==$description? $this->mimeparts[0] = $msg: $this->mimeparts[] = $msg ; return sizeof($this->mimeparts); } /* --------------------------------------------------------- private: Construct mail message header from info already given. This is a very important function. It shows how exactly the MIME message is constructed. --------------------------------------------------------- */ function build_message() { $this->errstr = ""; $msg = ""; $boundary = 'PM'.chr(rand(65, 91)).'------'.md5(uniqid(rand())); # Boundary marker $nparts = sizeof($this->mimeparts); // Case 1: Attachment list is there. Therefore MIME Message header must have multipart/mixed if (is_array($this->mimeparts) && ($nparts > 1)): $c_ver = "MIME-Version: 1.0".CRLF; $c_type = 'Content-Type: multipart/mixed;'.CRLF."\tboundary=\"$boundary\"".CRLF; $c_enc = "Content-Transfer-Encoding: ".BIT7.CRLF; $c_desc = $c_desc?"Content-Description: $c_desc".CRLF:""; $warning = CRLF.WARNING.CRLF.CRLF ; // Since we are here, it means we do have attachments => body must become an attachment too. if (!empty($this->body)) { $this->attach($this->body, BODY, TEXT, BIT7); } // Now create the MIME parts of the email! for ($i=0 ; $i < $nparts; $i++) { if (!empty($this->mimeparts[$i])) $msg .= CRLF.'--'.$boundary.CRLF.$this->mimeparts[$i].CRLF; } $msg .= '--'.$boundary.'--'.CRLF; $msg = $c_ver.$c_type.$c_enc.$c_desc.$warning.$msg; else: if (!empty($this->body)) $msg .= $this->body.CRLF.CRLF; endif; return $msg; } /* --------------------------------------------------------- public: Now Generate the entire Mail Message, header and body et al. --------------------------------------------------------- */ function gen_email($force=false) { $this->errstr = ""; if (!empty($this->email) && !$force) return $this->email ; // saves processing $email = ""; if (empty($this->subject)) $this->subject = NOSUBJECT; if (!empty($this->from)) $email .= 'From: '.$this->from.CRLF; if (!empty($this->headers)) $email .= $this->headers.CRLF; $email .= $this->build_message(); $this->email = $email; return $this->email; } /* --------------------------------------------------------- public: Printable form --------------------------------------------------------- */ function print_mail($force=false) { $this->errstr = ""; $email = $this->gen_email($force); if (!empty($this->to)) $email = 'To: '.$this->to.CRLF.$email; if (!empty($this->subject)) $email = 'Subject: '.$this->subject.CRLF.$email; print $email; } /* --------------------------------------------------------- public: Send mail via local mailer --------------------------------------------------------- */ function send_mail($force=false) { $this->errstr = ""; $email = $this->gen_email($force); if (empty($this->to)) { $this->errstr = "To Address not specified"; return 0; } if (is_array($this->mailer) && (1 == sizeof($this->mailer)) ) { $mail_obj = $this->mailer['name']; $mail_method = $this->mailer['method']; if (empty($mail_obj)) { $this->errstr = "Invalid object name passed to send_mail()"; return 0; } global $mail_obj; eval("$ret = \$$mail_obj".'->'."$mail_method;"); return $ret; } return mail($this->to, $this->subject, "", $email); } } // Class End class usage: <html> <head> <title>Mime Example 1</title> <style type="text/css"> input.submit { background-color: #ffffe0; font-weight: bold; } </style> </head> <body> <?php /* -------------------------------------------------- This example shows how to use the class to get an attachment from a user and send it via email. e.g., a job site where a prospect is sending resume. -------------------------------------------------- */ include "MIME.class"; define('TO', 'jobs@company.com'); # CHANGE THIS TO A REAL ADDRESS (yours?) // Has there been a form submission? If yes, go on and // process... if (is_array($HTTP_POST_VARS)) { if ($resume != 'none') { $fname = './'.$resume_name; // make a real filename // Get the content-type of the uploaded file if (preg_match("!/x\-.+!i", $resume_type)) $type = OCTET; else $type = $resume_type; $from = sprintf("'%s' <%s>", $name, $email) ; copy($resume, $fname); //do error checking if need $mime = new MIME_mail($from, TO, 'Resume', "Please find attached my resume", "Cc: $email"); $mime->fattach($fname, "Resume of $name", $type); $mime->send_mail(); echo "Dear $name<p>Your resume has been emailed and a copy sent to you<br>"; unlink($resume); // remove the uploaded file } else { echo "Dear $name<p>You have not submitted your resume. Please use the browse button to attach it and click send!<br>"; } } ?> <form name="upload" action="<?php echo $PHP_SELF;?>" method="post" enctype="multipart/form-data"> <table cellpadding=0 cellspacing=0 summary="upload table"> <tr> <td>Name:</td><td><input name="name" size=30 maxlength=60> </tr> <tr> <td>E-mail:</td><td><input name="email" size=30 maxlength=60> </tr> <tr> <td>Resume:</td><td><input type=file name="resume"></td> </tr> <tr> <td colspan=2 align="right"><input type=submit class='submit' name='action' value='Send'></td> </tr> </table> </form> |
| |||
| hi jegan, Thanks for ur solution and Me too got another short following solution for the above problem, $fileatt = "xxx.xxx"; // Path to the file $fileatt_type = "application/octet-stream"; // File Type $fileatt_name = "xxx.xxx"; // Filename that will be used for the file as the attachment $email_from = "test@test.com"; // Who the email is from $email_subject = "testing"; // The Subject of the email $email_txt = "testing the test"; // Message that the email has in it $email_mess = "message content"; $email_to = "xxxxxxx@xxxxx.com"; // Who the email is to send $headers = "From: ".$email_from; $file = fopen($fileatt,'rb'); $data = fread($file,filesize($fileatt)); fclose($file); $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; $email_message .= "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type:text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $email_mess . "\n\n"; $data = chunk_split(base64_encode($data)); $email_message .= "--{$mime_boundary}\n" . "Content-Type: {$fileatt_type};\n" . " name=\"{$fileatt_name}\"\n" . //"Content-Disposition: attachment;\n" . //" filename=\"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n" . "--{$mime_boundary}--\n<br>"; $ok = @mail($email_to, $email_subject, $email_message, $headers); if($ok) { echo "<font face=verdana size=2>The file was successfully sent!</font>"; } else { die("Sorry but the email could not be sent. Please go back and try again!"); }
__________________ J.Vijayanand |
![]() |
| Thread Tools | |
| Display Modes | |
| |
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| HTML format and attachment in the mail function are work in gmail but not in yahoo | Vani Sri | PHP Programming | 0 | 10-18-2007 02:48 AM |
| e-mail from an ASP.NET | Arun | ASP and ASP.NET Programming | 3 | 09-20-2007 10:28 PM |
| Mail header | P.Sathiya | PHP Programming | 1 | 07-20-2007 07:36 AM |
| What are the header contents to be sent in the php mail function... | bluesky | PHP Programming | 0 | 07-17-2007 03:46 AM |
| Diff inline function and ordinary function | vigneshgets | C and C++ Programming | 1 | 05-24-2007 11:34 AM |