I am trying to send an email via php with an attchment. Before anyone suggests using pear or swiftmailer I am aware of all of them but have a host who refuses to install any of them on my clients hosting account.
So I am stuck with writing this function from scratch.

Anyway my code half works in that it is sending me an email but without the attachment and in the body of the email I see the following

This is a multi-part message in MIME format. --==Multipart_Boundary_x9cb327f93cc70e9f329be5f652ca6252x-- Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit --==Multipart_Boundary_x9cb327f93cc70e9f329be5f652ca6252x Content-Type: pdf; name="zwgScheduleMar" Content-Disposition: attachment; filename="zwgScheduleMar" Content-Transfer-Encoding: base64 endnU2NoZWR1bGVNYXJwZGY= --==Multipart_Boundary_x9cb327f93cc70e9f329be5f652ca6252x--

I am thinking their is an error in my header code for the email

Here is my code

// Generate a boundary string
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

// Add the headers for a file attachment
$headers = "From: $from\r\n" .
   "MIME-Version: 1.0\r\n" .
   "Content-Type: multipart/mixed;\r\n" .
   " boundary=\"{$mime_boundary}\"";

// Add a multipart boundary above the plain message
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}--\r\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n ";

// Base64 encode the file data
$data = chunk_split(base64_encode(zwgScheduleMar.pdf));
$fileatt_name = 'zwgScheduleMar';
$fileatt_type = 'pdf';

// Add file attachment to the message
$message .= "--{$mime_boundary}\r\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" .

I am hoping someone might help me spot my error in the above code

Thank you

Recommended Answers

All 3 Replies


I am not sure about the error but do try the following code. It worked for me.

                if ($_SERVER['REQUEST_METHOD']=="POST")

                    // get the sender's name and email address
                    // we'll just plug them a variable to be used later
                    $from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";

                    // generate a random string to be used as the boundary marker

                    // store the file information to variables for easier access
                    $tmp_name = $_FILES['filename']['tmp_name'];
                    $type = $_FILES['filename']['type'];
                    $name = $_FILES['filename']['name'];
                    $size = $_FILES['filename']['size'];

                    $Fname = $_REQUEST['fromname'] ;
                    $FEmail = $_REQUEST['fromemail'] ;
                    $FPhone = $_REQUEST['fromphone'] ;

                    // we'll begin by assigning the To address and message subject

                    $subject= "Form Submission : $Fname";

                    // here we'll hard code a text message
                    // again, in reality, you'll normally get this from the form submission
                    $message = "Application: $Fname, $FEmail, $FPhone";

                    // if the upload succeded, the file will exist
                    if (file_exists($tmp_name))

                        // check to make sure that it is an uploaded file and not a system file

                            // open the file for a binary read
                            $file = fopen($tmp_name,'rb');

                            // read the file content into a variable
                            $data = fread($file,filesize($tmp_name));

                            // close the file

                            // now we encode it and split it into acceptable length lines
                            $data = chunk_split(base64_encode($data));

                        // now we'll build the message headers
                        $headers = "From: $from\r\n" .
                        "MIME-Version: 1.0\r\n" .
                        "Content-Type: multipart/mixed;\r\n" .
                        " boundary=\"{$mime_boundary}\"";

                        // next, we'll build the message body
                        // note that we insert two dashes in front of the
                        // MIME boundary when we use it
                        $message = "This is a multi-part message in MIME format.\n\n" .
                        "--{$mime_boundary}\n" .
                        "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
                        "Content-Transfer-Encoding: 7bit\n\n" .
                        $message . "\n\n";

                        // now we'll insert a boundary to indicate we're starting the attachment
                        // we have to specify the content type, file name, and disposition as
                        // an attachment, then add the file content and set another boundary to
                        // indicate that the end of the file has been reached
                        $message .= "--{$mime_boundary}\n" .
                        "Content-Type: {$type};\n" .
                        " name=\"{$name}\"\n" .
                        //"Content-Disposition: attachment;\n" .
                        //" filename=\"{$fileatt_name}\"\n" .
                        "Content-Transfer-Encoding: base64\n\n" .
                        $data . "\n\n" .

                        // now we just send the message
                        if (@mail($to, $subject, $message, $headers))
                            echo "Submitted successfully".'<br>'.'<a href="index.php">'."Click here to go back".'</a>';
                        #echo "<meta http-equiv='refresh' content='0;url=http://www.website.com'>";
                            echo "Failed to send";
                        echo "Hmm.. Maybe you forget to upload".'<br>'.'<a href="index.php">'."Click here to go back".'</a>';
                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"
                 enctype="multipart/form-data" name="form1">

                <label>Name:</label><input type="text" name="fromname" size="25px"><br><br>
                <label>Email:</label><input type="text" name="fromemail" size="25px"><br><br>
                <label>Phone:</label><input type="text" name="fromphone" size="25px"><br><br><br>
                <label>Upload:</label><br><input type="file" name="filename" size="20px"><br><br>
                <label></label><input type="submit" name="Submit" value="Submit">
            <?php } ?>

Thanks Alex
but I am still getting emails with no attachment and just
the following in the body of the email

This is a multi-part message in MIME format. --==Multipart_Boundary_x254682098ddc49158598e82e225b9620x Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit hello world --==Multipart_Boundary_x254682098ddc49158598e82e225b9620x Content-Type: ; name="zwgScheduleMar" Content-Transfer-Encoding: base64 endnU2NoZWR1bGVNYXJwZGY= --==Multipart_Boundary_x254682098ddc49158598e82e225b9620x--

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.