email — PHP не отправляет почту при прикрепленном файле

Я искал через этот сайт, но я не могу найти что-то связанное с этим. Если есть, пожалуйста, покажи мне.

Мой php делится на две секции, одна отправляет почту, если вложения нет (работает нормально)

Далее следует прикрепить файл и отправить его вместе с ними $ msg. Это, однако, не работает. Я собираюсь включить полную отправку почты PHP здесь.

    <?php
error_reporting(-1);
ini_set('display_errors', 'on');

ini_set("SMTP", '\');
ini_set("smtp_port", "25");
ini_set('sendmail_from','noreply@edomain');
if($_POST)
{
$to_email       = "email here"; //Recipient email, Replace with own email here

$from_email     = "noreply@domain"; //From email address (eg: [email protected])

//check if its an ajax request, exit if not
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
$output = json_encode(array( //create JSON data
'type'=>'error',
'text' => 'Sorry Request must be Ajax POST'
));
die($output); //exit script outputting json data
}

//Sanitize input data using PHP filter_var().
$user_name      = filter_var($_POST["user_name"], FILTER_SANITIZE_STRING);
$user_email     = filter_var($_POST["user_email"], FILTER_SANITIZE_EMAIL);
$country_code   = filter_var($_POST["country_code"], FILTER_SANITIZE_NUMBER_INT);
$phone_number   = filter_var($_POST["phone_number"], FILTER_SANITIZE_NUMBER_INT);
$subject        = filter_var($_POST["subject"], FILTER_SANITIZE_STRING);
$message        = filter_var($_POST["msg"], FILTER_SANITIZE_STRING);

//additional php validation
if(strlen($user_name)<4){ // If length is less than 4 it will output JSON error.
$output = json_encode(array('type'=>'error', 'text' => 'Name is too short or empty!'));
die($output);
}
if(!filter_var($user_email, FILTER_VALIDATE_EMAIL)){ //email validation
$output = json_encode(array('type'=>'error', 'text' => 'Please enter a valid email!'));
die($output);
}
if(!filter_var($country_code, FILTER_VALIDATE_INT)){ //check for valid numbers in country code field
$output = json_encode(array('type'=>'error', 'text' => 'Enter only digits in country code'));
die($output);
}
if(!filter_var($phone_number, FILTER_SANITIZE_NUMBER_FLOAT)){ //check for valid numbers in phone number field
$output = json_encode(array('type'=>'error', 'text' => 'Enter only digits in phone number'));
die($output);
}
if(strlen($subject)<3){ //check emtpy subject
$output = json_encode(array('type'=>'error', 'text' => 'Subject is required'));
die($output);
}
if(strlen($message)<3){ //check emtpy message
$output = json_encode(array('type'=>'error', 'text' => 'Too short message! Please enter something.'));
die($output);
}

//email body
$message_body = $message."\r\n\r\n".$user_name."\r\nEmail : ".$user_email."\r\nPhone Number : (".$country_code.") ". $phone_number ;

### Attachment Preparation ###
$file_attached = false;
if(isset($_FILES['file_attach'])) //check uploaded file
{
//get file details we need
$file_tmp_name    = $_FILES['file_attach']['tmp_name'];
$file_name        = $_FILES['file_attach']['name'];
$file_size        = $_FILES['file_attach']['size'];
$file_type        = $_FILES['file_attach']['type'];
$file_error       = $_FILES['file_attach']['error'];

//exit script and output error if we encounter any
if($file_error>0)
{
$mymsg = array(
1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini",
2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
3=>"The uploaded file was only partially uploaded",
4=>"No file was uploaded",
6=>"Missing a temporary folder" );

$output = json_encode(array('type'=>'error', 'text' => $mymsg[$file_error]));
die($output);
}

//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));
//now we know we have the file for attachment, set $file_attached to true
$file_attached = true;
}

if($file_attached) //continue if we have the file
{
# Mail headers should work with most clients
$headers = "MIME-Version: 1.0\r\n";
$headers = "X-Mailer: PHP/" . phpversion()."\r\n";
$headers .= "From: ".$from_email."\r\n";
$headers .= "Subject: ".$subject."\r\n";
$headers .= "Reply-To: ".$user_email."" . "\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=".md5('boundary1')."\r\n\r\n";

$headers .= "--".md5('boundary1')."\r\n";
$headers .= "Content-Type: multipart/alternative;  boundary=".md5('boundary2')."\r\n\r\n";

$headers .= "--".md5('boundary2')."\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n\r\n";
$headers .= $message_body."\r\n\r\n";
$headers .= $obj."\r\n\r\n";
$headers .= $product_code."\r\n\r\n";
$headers .= $cart_itm."\r\n\r\n";
$headers .= $total."\r\n\r\n";

$headers .= "--".md5('boundary2')."--\r\n";
$headers .= "--".md5('boundary1')."\r\n";
$headers .= "Content-Type:  ".$file_type."; ";
$headers .= "name=\"".$file_name."\"\r\n";
$headers .= "Content-Transfer-Encoding:base64\r\n";
$headers .= "Content-Disposition:attachment; ";
$headers .= "filename=\"".$file_name."\"\r\n";
$headers .= "X-Attachment-Id:".rand(1000,9000)."\r\n\r\n";
$headers .= $encoded_content."\r\n";
$headers .= "--".md5('boundary1')."--";
}else{
//proceed with PHP email.
$headers = 'From: '.$user_name.'' . "\r\n" .
'Reply-To: '.$user_email.'' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
}

$send_mail = mail($to_email, $subject, $message_body, $headers);

if(!$send_mail)
{
//If mail couldn't be sent output error. Check your PHP email configuration (if it ever happens)
$output = json_encode(array('type'=>'error', 'text' => 'Could not send mail! Please check your PHP mail configuration.'));
die($output);
}else{
$output = json_encode(array('type'=>'message', 'text' => 'Hi '.$user_name .' Thank you for your email'));
die($output);
}
}
?>

HTML и JS

<label><span>Name <span class="required">*</span></span>
<input type="text" name="name" id="name" required class="input-field"/>
</label>
<label><span>Email <span class="required">*</span></span>
<input type="email" name="email" required class="input-field"/>
</label>
<label><span>Phone <span class="required">*</span></span>
<input type="text" name="phone1" maxlength="4" placeholder="+91"  required="true" class="tel-number-field"/>&mdash;<input type="text" name="phone2" maxlength="15"  required="true" class="tel-number-field long" />
</label>
<label><span>Attachment</span>
<input type="file" name="file_attach" class="input-field" />
</label>

<label for="subject"><span>Please select</span>
<select name="subject" class="select-field">
<option value="Order Paid">Order Paid</option>
<option value="Awaiting Payment">Order Awaiting Payment</option>
</select>
</label>
<label for="field5"><span>Delivery Address <span class="required">*</span></span>
<textarea name="message" id="message" class="textarea-field" required></textarea>
</label>
<label>
<span class="loader"></span><input type="submit" id="submit_btn" value="Submit" />
</label>

<script type="text/javascript">
$(document).ready(function() {
$("#submit_btn").click(function(){
$(".loader").html('<img src="https://web-answers.ru/wp-content/uploads/2019/03/ajax-loader.gif" />');

var proceed = true;
//simple validation at client's end
//loop through each field and we simply change border color to red for invalid fields
$("#contact_form input[required=true], #contact_form textarea[required=true]").each(function(){
$(this).css('border-color','');
if(!$.trim($(this).val())){ //if this field is empty
$(this).css('border-color','red'); //change border color to red
proceed = false; //set do not proceed flag
}
//check invalid email
var email_reg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
if($(this).attr("type")=="email" && !email_reg.test($.trim($(this).val()))){
$(this).css('border-color','red'); //change border color to red
proceed = false; //set do not proceed flag
}
});

if(proceed) //everything looks good! proceed...
{
//data to be sent to server
var m_data = new FormData();
m_data.append( 'user_name', $('input[name=name]').val());
m_data.append( 'user_email', $('input[name=email]').val());
m_data.append( 'country_code', $('input[name=phone1]').val());
m_data.append( 'phone_number', $('input[name=phone2]').val());
m_data.append( 'subject', $('select[name=subject]').val());
m_data.append( 'msg', $('textarea[name=message]').val());
m_data.append( 'file_attach', $('input[name=file_attach]')[0].files[0]);

//instead of $.post() we are using $.ajax()
//that's because $.ajax() has more options and flexibly.
$.ajax({
url: 'contact_me.php',
data: m_data,
processData: false,
contentType: false,
type: 'POST',
dataType:'json',
success: function(response){
$(".loader").html("");
//load json data from server and output message
if(response.type == 'error'){ //load json data from server and output message
output = '<div class="error">'+response.text+'</div>';
$(".loader").html("");
}else{
output = '<div class="success">'+response.text+'</div>';
}
$("#contact_form #contact_results").hide().html(output).slideDown();
$(".loader").html("");

}
});}
});

//reset previously set border colors and hide all message on .keyup()
$("#contact_form  input[required=true], #contact_form textarea[required=true]").keyup(function() {
$(this).css('border-color','');
$("#result").slideUp();
});
});
</script>

У меня есть идея, что это связано с $ FILES и $ POST, но я не могу сделать это правильно

-1

Решение

В вашем коде есть синтаксическая ошибка:

 if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
$output = json_encode(array( //create JSON data
'type'=>'error',
'text' => 'Sorry Request must be Ajax POST'
));
die($output); //exit script outputting json data
}

Посмотрите ‘позади POST в выходном массиве.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]