2
votes

I created a form for my customers to submit their comment:

<form role="form" action="comment.php" method="post" class="col-md-6 col-md-offset-3" enctype="multipart/form-data">
    <div>
        <div class="form-group">
            <label>Email<span style="color:gray;"> (optional)</span></label>
                <input type="email" name="email" class="form-control">
        </div>

        <div class="form-group">
            <label>Description<span style="color:red;"> *</span></label>
            <textarea class="form-control" name="description" rows="3" required></textarea>
        </div>

        <div class="form-group">
            <label>Attach your file</label>
            <input type="file" name="file">
        </div>

        <div style="margin-top: 25px; direction: rtl;">
            <div class="form-group">
                <button type="submit" name="submit" value="yes" class="btn btn-info">Send Comment</button>
            </div>
        </div>
    </div>
</form>

I used PHPMailer for sending Email in comment.php:

if($g_ok == 1){
    $email = new PHPMailer();
    $email->From      = 'noreply@ideanetwork.co';
    $email->FromName  = 'Idea Network Ticketing';
    $email->Subject   = 'New comment from ticketing portal';
    $email->Body      = $bodytext;
    $email->AddAddress( 'submitcomments@ideanetwork.co' );
    $email->WordWrap = 70;

    if (isset($_FILES['file']) && $_FILES['file']['error'] == UPLOAD_ERR_OK) {
        $info = pathinfo($_FILES['file']['name']);
        $ext = $info['extension'];
        if ($ext == "php" or $ext == "exe" or $ext == "msi"){
            header("location:../php/accessdenied.php");
            exit;
        }
        else{
            if (filesize($_FILES['file']['tmp_name']) > 4194304){
                $filenote .= "Maximum file size must be 4 MB.";
            }
            else{
                $finfo = finfo_open(FILEINFO_MIME_TYPE);
                $mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
                $email->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name'], $encoding = 'base64', $mime_type);
            }
        }
    }
    if(!$email->Send()){
        $filenote .= "<script>alert('Mailer Error: " . $email->ErrorInfo."')</script>";
    }
    else{
        $ok = 1;
    }
}

also I tried this code:

$email->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']);

when I tested my form, every things were OK except attached file! my email size is true, for example when I attach an image with size 150KB, my received email size is 150KB too, but that haven't any attached file. instead of file I received a long unclear text and some information about attached file in header and footer like this:

boundary="b1_2d997b3e49a2cbf59277c329683b668e" Content-Transfer-Encoding: 8bit

This is a multi-part message in MIME format.

--b1_2d997b3e49a2cbf59277c329683b668e Content-Type: text/plain; charset=us-ascii

in header and:

--b1_2d997b3e49a2cbf59277c329683b668e Content-Type: image/jpeg; name="apple.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=apple.jpg

/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC ........(hundreds of lines like this).............. JAkwgptNz//Z

--b1_2d997b3e49a2cbf59277c329683b668e--

in footer

my PHP version: 5.5

1
Why are you using unfiltered input from $_FILES? Read the PHP docs on handling uploads, or the example "send upload" code provided with PHPMailer. You've based your code on an obsolete example, so make sure you're using latest PHPMailer.Synchro
@Synchro what do you mean about unfiltered input? must i have filter my uploaded file? i used $_FILES in another part of my website and it works well.Hamed Mehraei
Just because it works doesn't mean it's safe. Refer to the PHP docs on the subject, specifically you need to call move_upload_file()Synchro
Instead of including a couple of lines from the mail, try attaching a tiny file like this and include the entire email output including headers.miken32

1 Answers

0
votes

SOLVED!!!

Problem was using PHPMailer!

PHPMailer classes can't create headers correctly. I create headers using this post and every things were OK!

Thanks @synchro