sahar
sahar

Reputation: 569

send email with attachment using php

I used this code to send email with attachment using php, but there is something error in the attachment since I receive an email and the attachment appears in the content. before I use the same code and it worked successfully. why???

<?php
// sending email with attachments

    function sendEmail($to,$from,$file,$ext){

      $to = "[email protected]";
     $from = "[email protected]";
      $subject = "Translation Request";

  $random_hash = md5(date('r', time()));

  $headers = "From: [email protected]\r\nReply-To: [email protected]";

  $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";

  $attachment = chunk_split(base64_encode(file_get_contents("Test.doc")));

  $output = "
        --PHP-mixed-$random_hash;
        Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
        --PHP-alt-$random_hash
        Content-Type: text/plain; charset='iso-8859-1'
        Content-Transfer-Encoding: 7bit

        Hello World!
        This is the simple text version of the email message.

        --PHP-alt-$random_hash
        Content-Type: text/html; charset='iso-8859-1'
        Content-Transfer-Encoding: 7bit

        <h2>Hello World!</h2>
        <p>This is the <b>HTML</b> version of the email message.</p>

        --PHP-alt-$random_hash--

        --PHP-mixed-$random_hash
        Content-Type: application/doc; name=Test.doc
        Content-Transfer-Encoding: base64
        Content-Disposition: attachment

        $attachment
        --PHP-mixed-$random_hash--";
      $send =  @mail($to, $subject, $output, $headers);
  return $send;
  }
?>

please help.

Upvotes: 5

Views: 35215

Answers (6)

Kai Behncke
Kai Behncke

Reputation: 147

It also works very well in that way:

$to = '[email protected]'; 
 $from = '[email protected]'; 
$fromName = 'Me'; 


$subject = 'Hello';  


$file = "D:/xxxxxxx/kanal_uebersicht.pdf"; 


$htmlContent= "Sehr geehrte Damen und Herren, \r\n";
 $htmlContent.= "blabla. \r\n";
$htmlContent.= "Mit freundlichen Grüßen, \r\n";
$htmlContent.= "blabla. \r\n";



$headers = "From: $fromName"." <".$from.">"; 


$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}\""; 


$message .= "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"UTF-8\"\n" . 
"Content-Transfer-Encoding: 7bit\n\n" . $htmlContent . "\n\n";  


if(!empty($file) > 0){ 
    if(is_file($file)){ 
        $message .= "--{$mime_boundary}\n"; 
        $fp =    @fopen($file,"rb"); 
        $data =  @fread($fp,filesize($file)); 

        @fclose($fp); 
        $data = chunk_split(base64_encode($data)); 
        $message .= "Content-Type: application/octet-stream; name=\"".basename($file)."\"\n" .  
        "Content-Description: ".basename($file)."\n" . 
        "Content-Disposition: attachment;\n" . " filename=\"".basename($file)."\"; size=".filesize($file).";\n" .  
        "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
    } 
} 
$message .= "--{$mime_boundary}--"; 
$returnpath = "-f" . $from; 


$mail = @mail($to, $subject, $message, $headers, $returnpath); 

Upvotes: 0

Manoj Balakonda
Manoj Balakonda

Reputation: 138

I am using this and ( with out using PHPMailer ), Hope this is helpful to you.

<form enctype="multipart/form-data" method="POST" action="">
    <label>Your Name <input type="text" name="sender_name" /> </label> <br>
    <label>Your Email <input type="email" name="sender_email" /> </label> <br>
    <label>Subject <input type="text" name="subject" /> </label> <br>
    <label>Message <textarea name="message"></textarea> </label> <br>
    <label>Attachment <input type="file" name="my_file" /></label><br>
    <label><input type="submit" name="button" value="Submit" /></label>
</form>

<?php 
echo "<pre>";print_r($_REQUEST);echo "</pre>"; //comment this line
echo "<pre>";print_r($_FILES);echo "</pre>"; //comment this line
if($_POST && isset($_FILES['my_file']))
{

    $from_email         = 'noreply@your_domain.com'; //from mail, it is mandatory with some hosts
    $recipient_email    = '[email protected]'; //recipient email (most cases it is your personal email)

    //Capture POST data from HTML form and Sanitize them, 
    $sender_name    = filter_var($_POST["sender_name"], FILTER_SANITIZE_STRING); //sender name
    $reply_to_email = filter_var($_POST["sender_email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header
    $subject        = filter_var($_POST["subject"], FILTER_SANITIZE_STRING); //get subject from HTML form
    //$message        = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message
    $message        = "Name : ".$sender_name."\nMessage : ".$_POST["message"]; //message

    //Get uploaded file data
    $file_tmp_name    = $_FILES['my_file']['tmp_name'];
    $file_name        = $_FILES['my_file']['name'];
    $file_size        = $_FILES['my_file']['size'];
    $file_type        = $_FILES['my_file']['type'];
    $file_error       = $_FILES['my_file']['error'];

    if($file_error > 0)
    {
        die('Upload error or No files uploaded');
    }
    //read from the uploaded file & base64_encode content for the mail
    $handle = fopen($file_tmp_name, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));

        $boundary = md5("sanwebe");
        //headers
        $headers = "MIME-Version: 1.0\r\n"; 
        $headers .= "From:".$from_email."\r\n"; 
        $headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 

        //body plain text 
        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
        $body .= chunk_split(base64_encode($message)); 

        //attachment file
        $body .= "--$boundary\r\n";
        $body .="Content-Type: $file_type; name=".$file_name."\r\n";
        $body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
        $body .="Content-Transfer-Encoding: base64\r\n";
        $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
        $body .= $encoded_content; 
    $sentMail = @mail($recipient_email, $subject, $body, $headers);
    if($sentMail) //output success or failure messages
    {       
        die('Thank you for your email');
    }else{
        die('Could not send mail!');  
    }
}
?>

Upvotes: 0

Ardika Rifqi
Ardika Rifqi

Reputation: 11

Your code wont be work, because email doesnt support whitespaces.

  $output = "
       --PHP-mixed-$random_hash;
       Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
       --PHP-alt-$random_hash
       Content-Type: text/plain; charset='iso-8859-1'
       Content-Transfer-Encoding: 7bit

You must use without whitespaces

 $output = "
 --PHP-mixed-$random_hash;
 Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
 --PHP-alt-$random_hash
 Content-Type: text/plain; charset='iso-8859-1'
 Content-Transfer-Encoding: 7bit

Upvotes: 0

wiitohzjeh
wiitohzjeh

Reputation: 347

for what reason no use phpmailer? example for an attachment:

function mandaMail ($nombredest, $maildest, $asunto, $cuerpo) {
require_once("mailer/class.phpmailer.php");
$mail = new PHPMailer(true);
$mail->IsSMTP();

try {
    $mail->Host = "xxxx"; $mail->Port = 25; // smtp server
    $mail->SMTPAuth = true;
    $mail->Username = "xxxx"; // smtp username
    $mail->Password = "xxxx"; // smtp pass
    $mail->AddReplyTo("xxxx", "xxxx"); // email & name
    $mail->SetFrom("xxxx", "xxxx"); // similar to up value

    $mail->AddAddress($maildest, $nombredest);
    $mail->Subject = $asunto;
    $mail->MsgHTML(file_get_contents($cuerpo));

    $mail->AddAttachment("xxxx", "xxxx"); // attachments directory, attachment name (ie: dir/blah.jpg, blah.jpg)
    $mail->Send();

} catch (phpmailerException $e) { echo $e->errorMessage();
} catch (Exception $e) { echo $e->getMessage(); }

Upvotes: 6

Mohit Bumb
Mohit Bumb

Reputation: 2493

I'm using this :

function attachfile($file, $type = "application/octetstream")  {
    if(!($fd = fopen($file, "r"))) {
      $this->errstr = "Error opening $file for reading.";
      return 0;
    }
    $_buf = fread($fd, filesize($file));
    fclose($fd);

    $fname = $file;
    for($x = strlen($file); $x > 0; $x--)
      if($file[$x] == "/")
        $fname = substr($file, $x, strlen($file) - $x);

    // Convert to base64 becuase mail attachments are not binary safe.
    $_buf = chunk_split(base64_encode($_buf));

    $this->attachments[$file] = "\n--" . $this->boundary . "\n";
    $this->attachments[$file] .= "Content-Type: $type; name=\"$fname\"\n";
    $this->attachments[$file] .= "Content-Transfer-Encoding: base64\n";
    $this->attachments[$file] .= "Content-Disposition: attachment; " .
                                     "filename=\"$fname\"\n\n";
    $this->attachments[$file] .= $_buf;

    return 1;
  }

Upvotes: 0

Bojangles
Bojangles

Reputation: 101533

You can either do it the way this tutorial describes, or you can use one of the PEAR modules to send an email with an attachment the way this tutorial describes.

Using PEAR is probably a better option as it's easier to do. The only caveat is that PEAR isn't available on all hosts.

Upvotes: 2

Related Questions