PHP mail() не работает

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

Цель состоит в том, чтобы:

Отправьте на мой адрес электронной почты очень хорошо отформатированную строку из правильно сформированного объекта в моем JavaScript. Для этого я понимаю, что PHP-скрипт необходимо выполнять с его знаменитой функцией email().

Шаги, предпринятые для достижения цели:

  1. Иметь работающий JavaScript (без ошибок), который создает и заполняет данные для вышеупомянутого объекта JS (назовите его: 'person');
  2. Отформатируйте его в хорошую строку (потому что я хочу, чтобы он отправлял как простой текстовый формат, а не HTML);
  3. Попросите jQuery вызвать $.ajax() для взаимодействия CORS с серверной стороной, которая представляет собой PHP, содержащий необходимые заголовки и код для отправки простой почты в указанное место назначения (например, мой адрес электронной почты).
  4. (Необязательно) Прошли сжатие 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:

Функция заголовка PHP

скажи мне, если работает.

Другие вопросы по тегам