Функция PHP mail (), отправляющая дубликат (пустой) адрес электронной почты

Я пробовал искать форумы, я обнаружил, что у некоторых других людей была такая же проблема, как у меня, но пока не найдено решение, которое работает.

Я создаю портал, в котором клиент вводит свою информацию в форме и загружает изображение, которое затем отправляется как вложение в электронное письмо.

Я нахожу, что, когда я использую функцию PHP mail (), он отправляет повторяющиеся электронные письма, один с данными POST и один без. Я только вызываю функцию один раз, и насколько я могу судить, я только загружаю страницу один раз.

Вот мой код:

//recipient address (made up but you get the idea) $to = 'sales@skycommunications.net'; //subject of email $subject = 'Phone Order from Online Portal'; //create body of message $message = "An order has been placed using the Portal.\n"; $message .= "The order details are as follows:\n"; $message .= "\n"; $message .= "First Name: ".$_POST["firstname"]."\n"; $message .= "Last Name: ".$_POST["lastname"]."\n"; $message .= "Phone Number: ".$_POST["phonenumber"]."\n"; $message .= "Email Address: ".$_POST["emailaddress"]."\n"; $message .= "\n"; $message .= "Phone: " . $_POST["phone"] . "\n"; $message .= "Color: " . $_POST["color"] . "\n"; $message .= "Voice Plan: " . $_POST["voiceplan"] . "\n"; $message .= "Data Plan: " . $_POST["dataplan"] . "\n"; //get file details from previous form $file_tmp_name = $_FILES['uploaded_file']['tmp_name']; $file_name = $_FILES['uploaded_file']['name']; $file_size = $_FILES['uploaded_file']['size']; $file_type = $_FILES['uploaded_file']['type']; //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)); //random number for headers $boundary = md5("sanwebe"); //create the headers $headers = "MIME-Version: 1.0\r\n"; $headers .= "From: noreply@skycommunications.net\r\n"; $headers .= "Reply-To: noreply@skycommunications.net\r\n"; $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; //plain text info $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 info $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; //send the email mail($to, $subject, $body, $headers); 

Все работает красиво, за исключением того факта, что он отправляет одно электронное письмо с информацией и вложением, другое без информации из POST и вложения 0kb. Есть идеи? Возможно ли это с сервером?

Оберните весь почтовый код некоторой логикой проверки. В целом вы хотите:

  1. Убедитесь, что сделанный запрос является фактически запросом POST
  2. Убедитесь, что требуемые параметры POST включены в запрос.

Вы можете добиться этого с помощью кода, подобного следующему:

 function validRequest() { return ( // make sure that the request type is POST $_SERVER['REQUEST_METHOD'] === 'POST' // make sure the required POST variables were included && isset($_POST['firstname']) && isset($_POST['lastname']) && isset($_POST['phonenumber']) && isset($_POST['emailaddress']) && isset($_POST['phone']) && isset($_POST['color']) && isset($_POST['voiceplan']) && isset($_POST['dataplan']) // make sure that there is a file && $_FILES['uploaded_file'] ); } if (validRequest()) { // your email code } else { // there was some sort of error } 

Я бы поспорил, если вы посмотрели на свой журнал сервера, вы получите некоторые ошибки, говорящие, что ключ массива не существует.

Моя ставка заключается в том, что вы перенаправляетесь с помощью .htaccess или другого перенаправления. Он будет вызываться один раз с данными сообщения и снова вызываться после перенаправления.

Простое исправление будет заключаться в следующем:

 if(!empty($_POST['someinput'])) { //send email } 

если вы разместите этот код на верхней части страницы, так как тогда при загрузке начальной страницы он отправит пустое письмо на адрес sales@skycommunications.net.

Второе электронное письмо будет отправлено при отправке формы.

Чтобы предотвратить это, вам нужно обернуть это в условие IF и проверить, что $ _POST не пуст. таким образом, скрипт не будет выполняться при начальной загрузке страницы.

Лучший способ – проверить значение отправки, а также проверить и другие значения.

Предположим, что ваше имя кнопки отправки «отправить».

 if (isset($_POST['submit']) && !empty($_POST['submit'])){ //recipient address (made up but you get the idea) $to = 'sales@skycommunications.net'; //subject of email $subject = 'Phone Order from Online Portal'; //create body of message $message = "An order has been placed using the Portal.\n"; $message .= "The order details are as follows:\n"; $message .= "\n"; $message .= "First Name: ".$_POST["firstname"]."\n"; $message .= "Last Name: ".$_POST["lastname"]."\n"; $message .= "Phone Number: ".$_POST["phonenumber"]."\n"; $message .= "Email Address: ".$_POST["emailaddress"]."\n"; $message .= "\n"; $message .= "Phone: " . $_POST["phone"] . "\n"; $message .= "Color: " . $_POST["color"] . "\n"; $message .= "Voice Plan: " . $_POST["voiceplan"] . "\n"; $message .= "Data Plan: " . $_POST["dataplan"] . "\n"; //get file details from previous form $file_tmp_name = $_FILES['uploaded_file']['tmp_name']; $file_name = $_FILES['uploaded_file']['name']; $file_size = $_FILES['uploaded_file']['size']; $file_type = $_FILES['uploaded_file']['type']; //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)); //random number for headers $boundary = md5("sanwebe"); //create the headers $headers = "MIME-Version: 1.0\r\n"; $headers .= "From: noreply@skycommunications.net\r\n"; $headers .= "Reply-To: noreply@skycommunications.net\r\n"; $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; //plain text info $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 info $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; //send the email mail($to, $subject, $body, $headers); } 

Эврика! Спасибо всем за помощь!

Вот код, который я использовал для проверки данных POST до вызова функции mail ():

 //check for empty post so duplicate emails are not sent if ( isset($_POST["firstname"]) && isset($_POST["lastname"]) && isset($_POST["phonenumber"]) && isset($_POST["emailaddress"]) && isset($_POST['phone']) && isset($_POST['color']) && isset($_POST['voiceplan']) && isset($_POST['dataplan']) && isset($_FILES["uploaded_file"]) ) { mail($to, $subject, $body, $headers); } 

Я обнаружил, что если бы я использовал оператор else, чтобы страница не закончила загрузку, поэтому я просто использовал оператор if, и presto отправляется только одно электронное сообщение с данными POST.

Еще раз спасибо за помощь всем.