Cześć wszystkim, jestem Michał, miło mi. Mam kilka miesięcy komerycjnego doświadczenia, ale musiałem się zwolnić z pracy i od kilku miesięcy uczę się programować na własną rękę. Ta miłość rodzi sie w bólu, ale mam zapas cieprliwości i apap, więc się nie zniechęcam :) Jednak tym razem napotkałem ścianę i nie potrafię dojść do przyczyny problemu, utknąłem.
Do meritum. Mam formularz z opcją dodawania załączników. Przerobiłem skrypt pod swoje wymagania i w zasadzie działa, mail z zawartością dochodzi, ale po submicie wyświetla mi się pusta strona z adresem pliku php. Uparłem się, żeby to wywołać bez przeładowania, po wysyłce wyrzucić ramkę z podziękowaniami.
Googlowałem, min. na stackoverflow znalazłem kilka rozwiązań wykorzystującej AJAX. Skrypt jquery się niby wykonuje poprawnie (pokazuje "test"), konsola pokazuje, że został wykonany plik "secondform.php"(plik z instrukcją formularza), ale na skrzynce jest pusto, a wystarczy, że przywróce submit przez html (nie wiem czy dobrze się wyrażam) i mail dociera. Wrzuciłem też bez przeróbek skrypt, na którym bazowałem i efekt był taki sam - jquery sukces, brak wiadomości na skrzynce.
Moje wnioski są następujące:
- Jeśli wykonam submit klasycznie bez jquery @ dochodzi, więc PHP jest ok
- Jeśli wykonam submit przez jquery pokazuje się sukces, ale wydaje mi się, że tu jest problem z przekazywaniem zawartości formularza do PHP
- Ewentualnie problem leży po stronie serwera lub konfiguracji (to mój ostatni pomysł)
- Mam nadzieje, że nie mam nigdzie głupiej literówki :(
Jeśli ktoś znajdzie chwilę czasu na odpowiedź, to gotowe rozwiązanie będzie super, ale bardziej będę wdzięczny za udzielenie wskazówek jak diagnozować takie problemy z ewentualnym wyjaśnieniem tej konkretnej sytuacji, żebym mógł zrozumieć problem. Coś na zasadzie ryby i nauki łowienia :) Poniżej wklejam kody.
Do usłyszenia. Pozdrawiam
formularz:
<form name="mailForm" id="mailForm" method="post" action="" enctype="multipart/form-data">
<div>
<input type="text" class="input-field" name="userName" id="userName" placeholder="Imię" />
<input type="text" class="input-field" name="userEmail" id="userEmail" placeholder="E-mail" />
<input type="text" class="input-field" name="userPhone" id="userPhone" placeholder="Tel. kontaktowy" />
</div>
<div> <input type="text" class="input-field" name="device" id="device" placeholder="Model" />
<select name="topic">
<option value="Nie wybrano">Rodzaj usterki</option>
<option value="Uszkodzony ekran">Uszkodzony ekran</option>
<option value="Nie włącza się">Nie włącza się</option>
<option value="Nie ładuje się">Nie ładuje się</option>
<option value="Inny">Inny</option>
</select>
</div>
<textarea name="userMessage" id="userMessage" class="input-field" id="userMessage" placeholder="Krótki opis usterki"></textarea>
<input type="text" class="input-field" name="userPrice" id="userPrice" placeholder="Propozycja ceny" />
<div class="attachment-row">
<input type="file" class="input-field" name="attachment[]">
</div>
<span>
<span class="add-btn" onClick="addMoreAttachment();" title="Add More Attachments">Dodaj kolejne</span>
<input type="submit" name="send" class="btn-submit" value="Wyślij" />
</span>
<div id="statusMessage">
<?php
if (! empty($message)) {
?>
<p class='<?php echo $type; ?>Message'>
<?php echo $message; ?>
</p>
<?php
}
?>
</div>
</form>
jquery:
$("#mailForm").on('submit', (function(e) {
e.preventDefault();
$.ajax({
url: "./php/secondform.php",
type: "POST",
data: new FormData(this),
contentType: false,
cache: false,
processData:false,
success: function(data) {
alert("test"); // show response from the php script.
}
});
}));
Instrukcja formularza:
<?php
if(!empty($_POST["send"])) {
require("/home/PHPMailer/src/PHPMailer.php");
require("/home/PHPMailer/src/SMTP.php");
require("/home/PHPMailer/src/Exception.php");
$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->Host = 'smtp.gmail.com';
$mail->Username = "[email protected]";
$mail->Password = "blablabla";
$mail->Mailer = "smtp";
if (isset($_POST["userEmail"])) {
$userEmail = $_POST["userEmail"];
}
if (isset($_POST["userName"])) {
$userName = $_POST["userName"];
}
if (isset($_POST["userPhone"])) {
$userPhone = $_POST["userPhone"];
}
if (isset($_POST["device"])) {
$subject = $_POST["device"];
}
if (isset($_POST["topic"])) {
$topic = $_POST["topic"];
}
if (isset($_POST["userMessage"])) {
$description = $_POST["userMessage"];
}
if (isset($_POST["userPrice"])) {
$userPrice = $_POST["userPrice"];
}
header("content-type: application/json; charset=utf-8");
$headers = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: 8bit";
$message = nl2br("Kontakt: $userPhone\r\n");
$message.= nl2br("E-mail: $userEmail\r\n\r\n");
$message.= nl2br("Urządzenie: $subject\r\n");
$message.= nl2br("Usterka: $topic\r\n");
$message.= nl2br("Opis usterki: $description\r\n");
$message.= nl2br("Cena: $userPrice\r\n");
$mail->SetFrom($userEmail, $userName);
$mail->AddReplyTo($userEmail, $userName);
$mail->AddAddress("[email protected]"); // set recipient email address
$mail->Subject = $topic;
$mail->WordWrap = 80;
$mail->MsgHTML($message);
$mail->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mail->IsHTML(true);
if (! empty($_FILES['attachment'])) {
$count = count($_FILES['attachment']['name']);
if ($count > 0) {
// Attaching multiple files with the email
for ($i = 0; $i < $count; $i ++) {
if (! empty($_FILES["attachment"]["name"])) {
$tempFileName = $_FILES["attachment"]["tmp_name"][$i];
$fileName = $_FILES["attachment"]["name"][$i];
$mail->AddAttachment($tempFileName, $fileName);
}
}
}
}
if (! $mail->Send()) {
$message = "Problem in sending email";
$type = "error";
} else {
$message = "Mail sent successfully";
$type = "success";
}
}
?>