Uncaught phpmailerException: не удалось создать экземпляр почтовой функции - PullRequest
0 голосов
/ 05 февраля 2019

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

У меня есть 3 сайта.Они активно используют контактную форму.Я разделяю один и тот же php-код для всех них, и он работал до тех пор, пока я вчера не узнал, что почтовик фактически не отправляет письма.

Когда я зарегистрировался в журналах ошибок.Вот что я нашел.

[05-Feb-2019 15:41:03 Africa/Johannesburg] PHP Fatal error:  Uncaught phpmailerException: Could not instantiate mail function. in /home/lovecharmking/public_html/phpmailer/class.phpmailer.php:1509
Stack trace:
#0 /home/lovecharmking/public_html/phpmailer/class.phpmailer.php(1346): PHPMailer->mailSend('Date: Tue, 5 Fe...', '<span><b>Name: ...')
#1 /home/lovecharmking/public_html/phpmailer/class.phpmailer.php(1215): PHPMailer->postSend()
#2 /home/lovecharmking/public_html/contact-form.php(47): PHPMailer->send()
#3 {main} thrown in/home/lovecharmking/public_html/phpmailer/class.phpmailer.php on line 1509.

Вот мой код.

<?php
ini_set('display_errors', '1');
require 'PHPMailerAutoload.php';

$contactEmail = $_POST['Email'];
$email2Spa = $_POST['Email2'];
$contactName = $_POST['Name'];
$contactNumber = $_POST['Cell'];
$reason = $_POST['Subject'];
$contactLocation = $_POST['Location'];
$contactMessage = $_POST['Message'];

if(!empty($email2Spa)) die();

$mail = new PHPMailer(true);

$mail->isSMTP();                             // Set mailer to use SMTP
$mail->SMTPDebug = 2;
$mail->SMTPKeepAlive = true;
$mail->Mailer = “smtp”; // don't change the quotes!
$mail->Host = 'mail.domainname.com';             // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                     //  Enable SMTP authentication
$mail->Username = 'help@domainname.com';          // SMTP username
$mail->Password = '**********'; // SMTP password 'TJ&ShBW[H*N#'
$mail->SMTPSecure = 'TLS';                  // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587;                          // TCP port to connect to

$mail->setFrom('help@domainname.com', $contactName);
$mail->addAddress('help@domainname.com', 'Site Owner');     // Add a recipient
$mail->addReplyTo($contactEmail);
$mail->isHTML(true);  // Set email format to HTML

    $email_body = "";
    $email_body .= "<span><b>Name: </b> " . $contactName . "</span><br/><br/>";
    $email_body .= "<span><b>Reason: </b> " . $reason . "</span><br/><br/>";
    $email_body .= "<span><b>Email Address: </b>" . $contactEmail . "</span><br/>";
    $email_body .= "<p>Phone Number: " . $contactNumber . "</p>";
    $email_body .= "<p><b>Location: </b>" . $contactLocation . "</p>";
    $email_body .= "<p><b>Message: </b>" . $contactMessage . "</p>";

    // $mail->Priority = 1;
    $mail->AddCustomHeader("X-MSMail-Priority: High");
    $mail->AddCustomHeader("Importance: High");
    $mail->Subject = $reason;
    $mail->Body    = $email_body;

if(!$mail->send()) {
    // echo 'Mailer Error: ' . $mail->ErrorInfo;
    // $response = array('success'=>"successfully send", 'message'=>"Message sent.");;
   echo json_encode(array('success' => false, "Mailer Error: ".$mail->ErrorInfo));
} else {
  // return $data['success'] = true;
  // echo json_encode($data);
  // echo 'Message has been sent.';
  echo json_encode(array('success' => true, 'message' => "You message has been sent"));

}.

Вот вызов Ajax:

$('#cform').submit(function(e){
  e.preventDefault();
  const formUrl = 'contact-form.php';
  let formData = $('#cform').serialize(); // Collect data from form
  $.ajax({
    type: "POST",
    url: formUrl,
    data: formData,
    timeout: 6000,
    error: function (request, error) {
      console.log(error);},
    success: function (data) {
      var response = JSON.parse(data);
      // console.log(response);
      if (response.success==true) {
        let alertDiv = document.createElement('div');
        alertDiv.innerHTML = `
        <strong>Your Message has been Sent!</strong> Admin will get back to you as soon as he is available.
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
        </button>`
        $('.alert').alert();
        alertDiv.setAttribute('class','alert alert-warning alert-dismissible fade show alertBox');
        alertDiv.setAttribute('role','alert');
        // alertDiv.setAttribute('style','display:inline-block');
        let messageSpan = document.querySelector('.alertMessage');
        let parentForSpan = messageSpan.parentNode;
        parentForSpan.replaceChild(alertDiv,messageSpan);
        // contactForm.appendChild(alertDiv);
        $('#cform')[0].reset();
        // alertDiv.remove()
        // let span = document.createElement('span');
        // span.className = "alertMessage"
        // console.log(response);
      } else {
        console.log('Something wrong is going on. Check it.');
      }
      return false
    }});
    return false;
  });

Вот что возвращает запрос ajax в браузере:

Uncaught SyntaxError: Unexpected token C in JSON at position 1
    at JSON.parse (<anonymous>)
    at Object.success (main.js:212)
    at c (jquery.min.js:4)
    at Object.fireWith [as resolveWith] (jquery.min.js:4)
    at k (jquery.min.js:6)
    at XMLHttpRequest.r (jquery.min.js:6)

Как я сказал, я разделяюКод среди 3 сайтов на данный момент у них все не работает.Все они бегали больше года.Любой вклад будет оценен.

1 Ответ

0 голосов
/ 05 февраля 2019

Это все вызвано этим советом:

$mail->Mailer = “smtp”; // don't change the quotes!

Это просто неправильно.Эти фигурные кавычки могут привести к тому, что для Mailer будет задано какое-то неопределенное значение, то есть для отправки будет использоваться mail().В любом случае вам не нужно этого делать, потому что ваш предыдущий вызов isSMTP() устанавливает Mailer правильно (при условии, что вы действительно хотите использовать SMTP), поэтому удаление этой строки, вероятно, поможет.

Почтикаждый ответ, связанный с PHPMailer, содержит ссылку на руководство по устранению неполадок , в котором рассказывается, как бороться с этой ошибкой: либо переключитесь на SMTP, либо установите почтовый сервер.Он также говорит вам использовать последнюю версию (которой вы не являетесь) и основывать свой код на предоставленных примерах (а не на неправильном, устаревшем, вводящем в заблуждение используемом вами - я хотел бы знать, где вы его взялипоэтому я могу попросить их снять его).

Если вы новичок в PHP (но не в кодировании), первое, что вы должны сделать, это научиться использовать composer ;Композитор для PHP - как gems для ruby, npm для узла, pip для python;используйте его для управления вашими зависимостями, такими как PHPMailer.

При работе с обработчиками ajax убедитесь, что ваш бэкэнд дает понятные результаты (например, действительный JSON) , прежде чем вы попытаетесь использовать егоиз JS, потому что очень распространено посылать клиенту ошибки на стороне сервера (что происходит с вами), которые обычно не могут быть проанализированы из JS, и тогда у вас две проблемы вместо одной.

...