Ich verwende phpmailer, um E-Mails von einem PHP / Javascript zu senden, und es funktioniert, ABER es gibt nicht den Erfolg zurück: function (response).

Mein Javascript:

<script type="text/javascript" language="javascript">
$(document).ready(function() {

     $('.pendente').click(function() {
            $.ajax({
                type: 'POST',
                dataType: 'json',
                url: 'send_email.php',
                async: true,
                data: dados,
                context: this,
                success: function(response) {
                    alert("Ok!");
                    $(this).removeClass('btn-default').addClass('btn-warning');

                }
            });

});

Meine send_email.php:

<?php 
include "ligacao.php"; //connection string to BD

$encweb = $_POST['enc'];
$datapendente = date("Y-m-d H:i:s");

$texto = "'Pendente em ".$datapendente;
$texto = $texto."'";

$sql="UPDATE Texoleo.dbo.bo set bo.logi2=0, bo.logi4=1 ";
$sql=$sql.", bo.dataopen='".$datapendente."', bo.u_msgshist=";
$sql=$sql." concat(".$texto.", char(13)+char(10))+(cast(bo.u_msgshist as nvarchar(600))) ";
$sql=$sql." where bo.fref='".$encweb."'";

$result = odbc_exec($connect, $sql);
/**** Fim sql ****/


/**** Enviar email ****/

$clientenome = $_POST['nome'];
$clienteemail = $_POST['email'];

include('lib/class.phpmailer.php');
include('lib/class.smtp.php');

$mail = new PHPMailer;

$mail->SMTPDebug = 2;                              

$mail->isSMTP();                                      
$mail->Host = 'myhost.com';  
$mail->SMTPAuth = true;                              

$mail->Username ='user@user.com';
$mail->Password = 'mypassword'; 
$mail->SMTPSecure = 'tls';                           
$mail->Port = 587;                                  

$mail->setFrom('my@email.com', 'Me');
$mail->addAddress('customer email', 'Customer name');

$mail->isHTML(true);                                  
$texto = 'bla, bla, bla ';
$mail->Subject = 'My subject';
$mail->Body    =  $texto;
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

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

$response = array("success" => true);
echo json_encode($response);

?>

Wenn Sie dasselbe Javascript ohne $ mail-> send () testen, wird der Erfolg true zurückgegeben, aber mit $ mail-> send () wird das getan, was zu tun ist (einige SQL-Updates und E-Mails gesendet), aber der Erfolg wird nicht true zurückgegeben um den Javascript-Code fortzusetzen.

0
femo 18 Apr. 2018 im 16:24

4 Antworten

Beste Antwort

Wie in meinem Kommentar:

Die Debug-Ausgabe spielt mit dem JSON-Format. Deaktivieren Sie es, indem Sie SMTPDebug = 0 festlegen, und entfernen Sie auch alle anderen Nicht-JSON-Ausgaben.

Normalerweise können Sie dies beobachten, wenn Sie die Antworten auf Ihre XHR-Anforderungen in den Entwicklertools Ihres Browsers überprüfen.

1
Synchro 18 Apr. 2018 im 14:45

Mir ist aufgefallen, dass es nur wenige Echos gibt, die das Problem verursachen. Ihre Antwort sieht folgendermaßen aus:

Message has been sent
{"success":true}

Und Sie möchten, dass es wie folgt aussieht, damit Javascript es als json und nicht als Zeichenfolge verarbeiten kann:

{"success":true, "msg":'Message has been sent'}

Sie sollten Ihre Nachrichten als variabel festlegen, damit Sie sie mit einer Antwort übergeben können.

if(!$mail->send()) {
    $msg = 'Message could not be sent: '.$mail->ErrorInfo;
} else {
    $msg = 'Message has been sent'; 
};

$response = array("success" => true, 'msg' => $msg);
echo json_encode($response);

Sie können die Registerkarte Netzwerk in den Entwicklertools verwenden, um die Anforderungs- und Antwortnutzlast Ihrer Ajax-Anrufe zu ermitteln.

Außerdem sollten Sie den Inhaltstyp-Header besser auf json setzen.

<?php
header('Content-Type: application/json');
0
Атанас Атанасов 18 Apr. 2018 im 13:37

Das Problem war mit SMTPDebug = 2. Es sollte SMTDebug = 0 sein, wie von @synchro vorgeschlagen. Vielen Dank auch an Атанас Атанасов für seine Hilfe. $ mail-> SMTPDebug = 0;

0
femo 18 Apr. 2018 im 14:29

Welche Version von jQuery verwenden Sie?

Wenn Sie jQuery 3.0+ verwenden, sollten Sie .done () anstelle von .success () verwenden, da es veraltet ist.

Verfallshinweis: Die Rückrufe jqXHR.success (), jqXHR.error () und jqXHR.complete () werden ab jQuery 3.0 entfernt. Sie können stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always () verwenden.

0
Атанас Атанасов 18 Apr. 2018 im 13:49