I am hoping someone can help me fix the issue I am having with a php script that sends a email with a attachement. The script does generate a email that goes out. However when I recieve it the email has a attachment correctly named but when I open it, for example it is a PDF it sayd is is not a supported file type or because the file has been damaged ???

Below is my PHP code

//Send email with attachment
$fileatt = "$fileName"; // Path to the file                  
$fileatt_type = "application/pdf"; // File Type  
$fileatt_name = "$fileName"; // Filename that will be used for the file as the attachment  
$email_from = "info@****.com"; // Who the email is from  
$email_subject = "File Uploaded To ***.com"; // The Subject of the email  
$email_message = "Thanks for uploading test.<br>";
$email_message .= "Thanks for visiting.<br>"; // Message that the email has in it  
$email_to = "***@****.com";  
$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_message .= "\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";  
 mail($email_to, $email_subject, $email_message, $headers);  

The first thing that comes to mind is that the email structure should always use the Windows form of newlines, \r\n, rather than the Unix form, \n.

However you are making this far more difficult on yourself than it has to be. The mail function is only really a good option for text mails, or perhaps very simple HTML emails. For more complex mails, like multi-part emails containing complex HTML or attachments, you should be using a more extensive library. Those will make things like attaching files trivial.

I suggest you look into Swift Mailer or PHPMailer. Both are easy to set up, and both allow easy creation of complex multi-part mails.

For example, using Swift Mailer, your code could be replicated more or less like this:

<?php
require "lib/swift_required.php";

$transport = Swift_MailTransport::newInstance();
$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance()
    ->setSubject('File Uploaded To ***.com')
    ->setFrom(array('"info@****.com'))
    ->setTo(array('***@****.com'))
    ->setBody("Thanks for uploading test.\nThanks for visiting.\n")
    ->addPart("Thanks for uploading test.<br>\nThanks for visiting.<br>\n", 'text/html');
    ->attach(Swift_Attachment::fromPath($fileName));

if ($mailer->send($message)) {
    echo "Message sent.";
}
else {
    echo "Failed to send message.";
}

(This assumes the Swift Mailer code is located at ./lib/, relative to the script file this is in, or anything inside the include path.)

Note, especially, that attaching a simple file can be done in one line, by creating a very simple object instance and attaching it to the $message object.

Member Avatar for LastMitch

However when I recieve it the email has a attachment correctly named but when I open it, for example it is a PDF it sayd is is not a supported file type or because the file has been damaged ???

@jayreis

I look over your code and you are missing few lines.

You can take a look at this code:

http://www.barattalo.it/2010/01/10/sending-emails-with-attachment-and-html-with-php/

Your code have some similarity with the code from the link.

I think you are very close of solving this.

Be a part of the DaniWeb community

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