PHPMailer — вложение отправляется, но форма не сбрасывается

#javascript #php #forms #email #phpmailer

#javascript #php #формы #Адрес электронной почты #phpmailer

Вопрос:

У меня есть два разных файла (.pdf) для отправки на основе выбора, сделанного пользователем. На практике, когда пользователь выбирает выбрать «пользователь», он должен отправить вложение, связанное с этим выбором. При добавлении кода в файл PHP отправка происходит, но форма не сбрасывается. Я ошибаюсь при выборе файла? Отправляется только файл массива «0», даже если выбран второй выбор

Это выбрать:

 <select name="user" id="user">
 <option disabled selected>Richiesta prestazione per</option>
 <option value="adulti">Adulti</option>
 <option value="minori">Minorenni</option>
</select>
 

Это PHPMailer:

     <?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require 'PHPMailer/Exception.php';
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

// Instantiation and passing [ICODE]true[/ICODE] enables exceptions
$mail = new PHPMailer(true)
  
$name = $_POST['name'];
$surname = $_POST['surname'];
$email = $_REQUEST['email'] ;
$phone = $_POST['phone'];
//$user = $_POST['user']; // i tried to disable this //
$pay = $_POST['pay'];
$message = $_REQUEST['message'];
$cod = mt_rand(100000, 999999);

//replacing them with this
$user = array (0 => './documents/test.pdf', 1 => './documents/test2.pdf');
$file = $user[(int) $_POST['user']];

try {
 //Server settings
 //$mail->SMTPDebug = 2; // Enable verbose debug output
 $mail->isSMTP(); // Set mailer to use SMTP
 $mail->CharSet = 'UTF-8';
 $mail->Host = '_MYMAIL_'; // Specify main and backup SMTP servers
 $mail->SMTPAuth = true; // Enable SMTP authentication
 $mail->Username = '_MYMAIL_'; // SMTP username
 $mail->Password = '_MYPASS_'; // SMTP password
 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
 $mail->Port = 587; // TCP port to connect to

//Recipients
 $mail->setFrom($email, $name);
 $mail->addAddress('_MYMAIL_', '_MYNAME_'); // Add a recipient
 $mail->addReplyTo($email, $name);

// Content
 $mail->isHTML(true); // Set email format to HTML
 $mail->Subject = "xF0x9Fx93x86 Richiesta di Consulenza Online";
 $mail->Body = _MYMESSAGE_;

 if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message sent';
}

$mail->ClearAddresses();
$mail->ClearaddReplyTo();

// Add the admin address
$mail->AddAddress($email);
$mail->setFrom('_MYMAIL_', '_MYNAME_');
$mail->Subject = _MYSUBJECT_;
$mail->addReplyTo('_MYMAIL_', '_MYNAME_');
$mail->AddAttachment($file) **//I add this to attach the .pdf file**
$mail->Body = 

<body>
 
   <h2>Codice prenotazione: '.$cod.'</h2>
 
   <table>
     <thead>
       <tr>
         <th>Nome</th>
         <th>Cognome</th>
         <th>Adulto/Minore</th>
         <th>Pagamento</th>
         <th>Telefono</th>
       </tr>
     </thead>
     <tbody>
       <tr>
         <td>'.$name.'</td>
         <td>'.$surname.'</td>
         <td>'.$user.'</td> //this is line 114
         <td>'.$pay.'</td>
         <td>'.$phone.'</td>
       </tr>
       <tr>
         <td colspan="5">Messaggio:<br><br>'.$message.'</td>
       </tr>
     </tbody>
   </table>
 </body>;

$mail->Send();


} catch (Exception $e) {
 echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
 

И это вызов Ajax в file .js:

     $("#formBook").submit(function (event) {
    // cancels the form submission
    event.preventDefault();
    submitForm();
  });
  
  function submitForm() {
     //Initiate Variables With Form Content
     var name = $("#name").val();
     var surname = $("#surname").val();
     var email = $("#email").val();
     var phone = $("#phone").val();
     var user = $("#user").val();
     var message = $("#message").val();
     var pay = $("#pay").val();
  
    $.ajax({
      type: "POST",
      url: "email_monia.php",
      data: "name="   name   "amp;email="   email   "amp;message="   message   "amp;user="   user   "amp;phone="   phone   "amp;pay="   pay   "amp;surname="   surname,
      success: function (data) {
        if (data == 'Message sent') {
          formSuccess();
        }
      }
    });
  }

function formSuccess() {
$("#formBook")[0].reset();
// custom toast
iziToast.show({
  color: 'light',
  icon: 'fas fa-paper-plane',
  message: '<strong>Grazie!</strong></br>Il tuo messaggio è stato inviato',
  messageLineHeight: 20,
  messageSize: 15,
  position: 'center', // bottomRight, bottomLeft, topRight, topLeft, topCenter, bottomCenter
  progressBarColor: '#00909D',
  backgroundColor: ' #9ad3ca',
  titleColor: '#222',
  messageColor: '#222',
  iconColor: '#F7F7F7',
  closa: false,
  displayMode: 'once',
  pauseOnHover: false,
  resetOnHover: false,
});
}
 

Комментарии:

1. используйте $_POST для получения данных, затем используйте простой if для изменения документ

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

3. Что вы подразумеваете под «форма не сбрасывается»? Разве не должно быть никакого кода для обработки этого? Когда вы используете AJAX для отправки формы, ее сброс также должен выполняться с использованием JS (что делает этот вопрос полностью независимым от кода PHP)

4. я отредактировал сообщение с помощью js-кода, который запускается для сброса

Ответ №1:

Я думаю, что вы отправляете имя в user поле вместо индекса, в этом случае вам следует обновить массив вложений до ассоциативного массива

 //replacing them with this
$user = array ( 
    'adulti' => './documents/test.pdf',
    'minori' => './documents/test.pdf'
);
$file = $user[$_POST['user']];
 

В formSuccess функции

 $("#formBook").reset();
 

Можете ли вы подтвердить свой ответ

 $.ajax({
  type: "POST",
  url: "email_monia.php",
  data: "name="   name   "amp;email="   email   "amp;message="   message   "amp;user="   user   "amp;phone="   phone   "amp;pay="   pay   "amp;surname="   surname,
  success: function (data) {
    // check response here
    console.log(data);
    if (data == 'Message sent') {
      formSuccess();
    }
  }
 

Комментарии:

1. да, с этим изменением оно теперь работает! Отправьте другой файл на основе вашего выбора. Но теперь я не могу заставить форму сбросить работу и получить сообщение об отправке

2. вы console.log и убедитесь, что получаете ожидаемый ответ Message sent

3. куда я должен войти в console.log?

4. ваша модификация массива работает, но теперь я возвращаю значение «Массив», а не значение выбора в пользовательском поле формы. Есть ли способ заставить меня вернуть значение поля выбора?

5. я не уверен, что вы имеете в виду? проверьте мой обновленный ответ, как войти в систему и подтвердить свой ответ

Ответ №2:

За это отвечает ваш JS. Вы вызываете event.preventDefault(); , но затем ничего не делаете, чтобы очистить форму самостоятельно, поэтому ничего не происходит. Вам нужно явно указать форме сброс, например, вызвав это в вашей formSuccess() функции:

 document.getElementById("formBook").reset();
 

В вашем PHP не используйте адрес отправителя в качестве адреса отправки. Используйте там свой собственный адрес и укажите адрес отправителя в ответе на использование addReplyTo() . В противном случае это будет подделка, и ваши сообщения, вероятно, не будут доставлены.

Комментарии:

1. Я пропустил фрагмент кода, написал команду, которая у меня есть для сброса

2. странно то, что если я удалю всю часть вложения, команда сброса будет работать нормально