PHP mail() не работает
Я пытаюсь общаться между JavaScript и PHP с последних двух дней. После прочтения многочисленных руководств, предложений и решений аналогичных проблем других людей, я не могу добиться успеха, как задумано. Скажем так, я программирую в своей области, а не локально.
Цель состоит в том, чтобы:
Отправьте на мой адрес электронной почты очень хорошо отформатированную строку из правильно сформированного объекта в моем JavaScript. Для этого я понимаю, что PHP-скрипт необходимо выполнять с его знаменитой функцией email().
Шаги, предпринятые для достижения цели:
- Иметь работающий JavaScript (без ошибок), который создает и заполняет данные для вышеупомянутого объекта JS (назовите его: 'person');
- Отформатируйте его в хорошую строку (потому что я хочу, чтобы он отправлял как простой текстовый формат, а не HTML);
- Попросите jQuery вызвать $.ajax() для взаимодействия CORS с серверной стороной, которая представляет собой PHP, содержащий необходимые заголовки и код для отправки простой почты в указанное место назначения (например, мой адрес электронной почты).
- (Необязательно) Прошли сжатие GZIP, минимизировав HTML/CSS/JS для ускорения загрузки контента на клиент.
В чем проблема?
Мой AJAX-код работает без ошибок, но не так, как ожидалось. Вместо того, чтобы прыгать / входить в SUCCESS, он сразу же выполняет пользовательские функции ERROR, и я, похоже, не могу расшифровать, что может пойти не так.
Я собираюсь опубликовать ниже как JS (вызов AJAX), так и PHP-скрипт, который я использую для достижения цели, упомянутой выше.
JavaScript (обновлено):
function submitOnClick() {
var full_name = "John Doe";
var profile_person = "--[Name: John, Surname: Doe, Birthday: 25/02/1950]--";
var hr = new XMLHttpRequest();
hr.open("POST", "submit_to_email.php", true);
hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
hr.send("full_name=" + full_name + "&" + "person=" + profile_person);
hr.onreadystatechange = function () {
if (hr.readyState == 4 && hr.status == 200) {
var data = hr.responseText;
console.log("PHP responded with: " + data);
}
}
}
PHP скрипт (обновленный):
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Content-Type: application/json');
$postvars = $_POST['person'];
//var_dump($postvars);
if (isset($postvars)) {
$to = 'to@gmail.com';
$subject = 'Subject Title';
$email_message = $postvars;
$headers = 'From: noreply@mydomain.com'."\r\n".
'Reply-To: noreply@mydomain.com'."\r\n" .
'X-Mailer: PHP/' . phpversion();
$checker = @mail($to, $subject, $email_message, $headers);
if ($checker == true) {
echo 'Mail was sent to'.$to;
}
else {
echo 'Mail was NOT sent to'.$to;
}
}
?>
<?php
die();
?>
ОБНОВИТЬ
$.ajax() вообще не был необходим, вместо этого он начал использовать простой ванильный JS с методом XMLHttpRequest(). Содержимое успешно отправляется в мой PHP-файл, НО путем проверки mail (), если это правда / ложь (отправлено / нет), приводит к ЛОЖЬ. Файл конфигурации необходим для предоставления PHP информации о моей настройке SMTP. Я использую хостинг Arvixe, и на нем установлен IIS-сервер. Я немного новичок в веб-хостинге и в обслуживании домена, поэтому не знаю, нужно ли мне настраивать файл web.config в папке моего проекта или добавлять расширенные файлы конфигурации PHP.
2 ответа
После нескольких дней исследований я наконец нашел одно возможное и очень эффективное решение. Проблема заключалась в том, что мой домен настроен для работы на Windows Server 2008+ с хостингом IIS, поэтому функция PHP mail() была неполной для выполнения почты.
Решение было и есть: PHPMailer - очень распространенная и наиболее часто используемая библиотека php, специально разработанная для предоставления уверенного и простого кода разработчикам. Я скачал его из исходного кода GitHub в виде zip, а затем распаковал его. После этого создал новый пустой файл php и скопировал / вставил демонстрационный скрипт о том, как отправить письмо, и изменил его в соответствии с моими потребностями. Наконец загрузил папку PHPMailer и вновь созданный скрипт в мой домен. После выполнения сценария вручную я получил почту (я) в своем почтовом ящике, а не как спам. Этот урок спас мне жизнь тоже. Сценарий выглядит следующим образом:
<? php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Content-Type: application/json');
$postvars = $_POST['person'];
if (isset($postvars)) {
$to = 'recipient@gmail.com';
$subject = 'Some Title';
$email_message = $postvars;
require 'PHPMailerAutoload.php'; // The script needed to be called in order to executed
// further commands below
$mail = new PHPMailer;
$mail - > isSMTP(); // Set mailer to use SMTP
$mail - > Host = 'smtp.mydomain.com'; // Specify main and backup SMTP servers
$mail - > SMTPAuth = true; // Enable SMTP authentication
$mail - > Username = 'mymail@mydomain.com'; // SMTP username
$mail - > Password = 'password_here'; // SMTP password
$mail - > SMTPSecure = 'ssl'; // Enable TLS encryption, `ssl` also accepted
$mail - > Port = 465; // TCP port to connect to
$mail - > CharSet = 'UTF-8'; // Character set specified because I use "ë" and other ones
$mail - > From = 'mymail@mydomain.com'; // The same email address as specified above for authentication
$mail - > FromName = 'Myself'; // The name of the sender (optional)
$mail - > addAddress($to, 'recipients_name'); // Add a recipient & name (optional)
$mail - > addReplyTo('mymail@mydomain.com', 'Some text'); // To who to reply
$mail - > WordWrap = 70; // Wrapping words
$mail - > isHTML(true); // if TRUE , format is HTML or FALSE, format is Plain Text
$mail - > Subject = $subject;
$mail - > Body = $email_message; //Plain or HTML formatted string
$mail - > AltBody = $email_message; //The same as Body BUT it has to be Plain text always
if (!$mail - > send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: '.$mail - > ErrorInfo;
} else {
echo 'Message has been sent';
}
}
?>
Я думаю, единственное, что вам нужно поставить заголовок успеха с соответствующим кодом 200 к вашему ответу.
если вы отвечаете в формате json, jquery прочитайте этот код, чтобы перенаправить его на обработчик успеха или ошибки.
проверьте функцию заголовка php:
скажи мне, если работает.