IT Community - Software Programming, Web Development and Technical Support

mail function

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...


Go Back   IT Community - Software Programming, Web Development and Technical Support > Web Development > PHP Programming

Register FAQ Members List Calendar Mark Forums Read
  #1 (permalink)  
Old 07-19-2007, 03:20 AM
vijayanand vijayanand is offline
D-Web Analyst
 
Join Date: Feb 2007
Posts: 293
vijayanand is on a distinguished road
Default Attaching a file in a mail

how to attach files in the mail function
__________________

J.Vijayanand

Last edited by vijayanand : 07-20-2007 at 06:21 AM. Reason: changing the title
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Sponsored Links
  #2 (permalink)  
Old 08-02-2007, 07:09 AM
jegan jegan is offline
D-Web Sr.Programmer
 
Join Date: Jul 2007
Posts: 161
jegan is on a distinguished road
Default Re: mail function

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>
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 08-03-2007, 12:55 AM
vijayanand vijayanand is offline
D-Web Analyst
 
Join Date: Feb 2007
Posts: 293
vijayanand is on a distinguished road
Default Re: mail function

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
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


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


All times are GMT -7. The time now is 02:59 AM.


Copyright ©2004 - 2007, DiscussWeb. All Rights Reserved.

SEO by vBSEO 3.0.0