简体   繁体   English

发送带有多个附件和 JavaScript Ajax 请求的电子邮件

[英]Sending E-Mail with multiple attachments and JavaScript Ajax request

I have a pop up form that sends an email after it has been submitted.我有一个弹出表单,在提交后会发送一封电子邮件。 It all works fine.一切正常。 I am trying to add 3 upload file fields for documents to be added.我正在尝试为要添加的文档添加 3 个上传文件字段。 I have tried to use the input type="file" with no luck.我尝试使用 input type="file" 没有运气。 I have edited the question with my whole code as requested.我已经按照要求用我的整个代码编辑了这个问题。 I have added the code at the bottom that sends the mail我在底部添加了发送邮件的代码

The form works fine.该表格工作正常。 I am just missing these 3 fields for document uploads.我只是缺少这 3 个用于文件上传的字段。

My javascript:我的javascript:

<script language="javascript">
function validate(){
    var f=document.formED;
    if(f.idnumber.value==''){
        alert('ID Number is required');
        f.idnumber.focus();
        return false;
    }
    /** doing the same for each field => remove here **/

    //f.command.value='btn1';
    //f.submit();

}
    function showHide(){
    var f=document.formED;
    if(f.fullnames.value==''){
        f.fullnames.focus();
        return false;
    }
    /** doing the same for each field => remove here **/

    //create an object reference to the div containing images 
    var oimageDiv=document.getElementById('searchingimageDiv') 
    //set display to inline if currently none, otherwise to none 
    oimageDiv.style.display=(oimageDiv.style.display=='none')?'inline':'none' 
    }
</script>
<div class="col-md-8">
    <div class="panel panel-white">
        <!-- Removed the irrelevant HTML content for this question -->
        <div class="panel-body">
            <form onsubmit="return validate()" autocomplete="off" name="formED" action="#" method="post" role="form">
                <!-- Removed the irrelevant HTML content for this question -->

                <div class="form-group">
                    <label for="exampleInputEmail1">License Disk Copy:(Please press control while selecting to choose
                        multiple images)</label>
                    <input type="file" name="multiple_files[1]" multiple="multiple">

                </div>

                <div class="form-group">
                    <label for="exampleInputEmail1">Picture Of Damage:(Please press control while selecting to choose
                        multiple images)</label>
                    <input type="file" name="multiple_files[2]" multiple="multiple">
                </div>

                <div class="form-group">
                    <label for="exampleInputEmail1">License Copy: (Please press control while selecting to choose
                        multiple images)</label>
                    <input type="file" name="multiple_files[3]" multiple="multiple">
                </div>

                <!-- Removed the irrelevant HTML content for this question -->
                <button type="submit" name="newClient" class="btn btn-info" onclick="showHide()">Submit <i
                            class="fa fa-check" aria-hidden="true"></i></button>
            </form>
        </div>
    </div>
</div>

The php that sends the mail:发送邮件的php:

<?php
$to = 'info@****';
$subject = "New Assessment Request has been submitted by ".$fullnames;
// Get HTML contents from file
$htmlContent = '<div style="font-family:HelveticaNeue-Light,Arial,sans-
serif;background-color:#FFFFFF"><!-- Removed the irrelevant HTML content for this question -->
</div>';

// Set content-type for sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// Additional headers
$headers .= 'From: Digiteks Assessment Request<info@****>' . "\r\n";

// Send email
if(mail($to,$subject,$htmlContent,$headers)):

else:
//$errorMsg = 'We are unable to send you a mail, possible your email is a scam..';
endif;  
?>          

Usually you need to add enctype="multipart/form-data" to your from field.通常您需要将enctype="multipart/form-data"到您的from字段。 If you add multiple attribute to your input field user can select more than one file at once, or you do it with 3 single input fields.如果您向input字段添加multiple属性,用户可以一次选择多个文件,或者您使用 3 个单个输入字段进行选择。 type="file" is correct: type="file"是正确的:

<form method="POST" action="/upload" accept-charset="UTF-8" enctype="multipart/form-data">
    <input type="file" name="multiple_files[]" multiple="multiple">
    <input type="file" name="single_file1">
    <input type="file" name="single_file2">
    <input type="file" name="single_file3">
    <input value="Upload" type="submit">
</form>

The enctype="multipart/form-data" part is missing in your Code if you do not use Ajax.如果您不使用 Ajax,您的代码中将缺少enctype="multipart/form-data"部分。 You also have an syntax error with the names of your fields.您的字段名称也有语法错误。 It's multiple_files1[] or multiple_files[1][] not multiple_files[1] .它是multiple_files1[]multiple_files[1][]而不是multiple_files[1]

In your mail() function you do not handle the files, so even if the rest is correct, you do not send it at all, and with mail() this is hard to do.在您的mail()函数中,您不处理文件,因此即使其余部分是正确的,您也根本不会发送它,而使用mail()则很难做到这一点。

Try PHPMailer script from here: http://github.com/PHPMailer/PHPMailer从这里尝试 PHPMailer 脚本: http : //github.com/PHPMailer/PHPMailer
But if you really want to do it with mail() here is a tutorial how you could do it: http://webcheatsheet.com/php/send_email_text_html_attachment.php但是如果你真的想用mail()来做,这里有一个教程你怎么做: http : //webcheatsheet.com/php/send_email_text_html_attachment.php

Because you did not share the Ajax code (eg jQuery Ajax), I can't check if you have some mistake in your JavaScript Code.因为您没有共享 Ajax 代码(例如 jQuery Ajax),所以我无法检查您的 JavaScript 代码是否有错误。

I got it to work after some time working on the headers and MIME在处理标题和 MIME 一段时间后,我让它开始工作

<?php

 error_reporting(E_ALL);
 ini_set('display_errors', 1);

if(isset($_FILES) && (bool) $_FILES) {

$allowedExtensions = array("pdf","doc","docx","gif","jpeg","jpg","png","rtf","txt");

$files = array();
foreach($_FILES as $name=>$file) {
    $file_name = $file['name']; 
    $temp_name = $file['tmp_name'];
    $file_type = $file['type'];
    $path_parts = pathinfo($file_name);
    $ext = $path_parts['extension'];
    if(!in_array($ext,$allowedExtensions)) {
        die("File $file_name has the extensions $ext which is not allowed");
    }
    array_push($files,$file);
}

// email fields: to, from, subject, and so on
$to = "***";
$from = "***"; 
$subject ="New Assessment Request";
$message = "Test Message";

$headers = "From: $from";

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

// headers for attachment 
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 

// multipart boundary 
$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"; 
$message .= "--{$mime_boundary}\n";

// preparing attachments
for($x=0;$x<count($files);$x++){
    $file = fopen($files[$x]['tmp_name'],"rb");
    $data = fread($file,filesize($files[$x]['tmp_name']));
    fclose($file);
    $data = chunk_split(base64_encode($data));
    $name = $files[$x]['name'];
    $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$name\"\n" . 
    "Content-Disposition: attachment;\n" . " filename=\"$name\"\n" . 
    "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
    $message .= "--{$mime_boundary}\n";
}
// send

    $ok = mail($to, $subject, $message, $headers); 
if ($ok) { 
     echo '<script language="javascript">';
     echo 'alert("Your Message successfully sent, we will get back to you ASAP.");';
     echo 'window.location.href="index.php";';
     echo '</script>';

} else { 
    echo "<p>mail could not be sent!</p>"; 
} 
}   

?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM