Ограничение времени AJAX внутри каждого цикла для функции отправки почты PHP - PullRequest
0 голосов
/ 03 мая 2018

Я создал довольно простую почтовую программу, которая использует PEAR Mail и отправляет электронные письма через Amazon SES относительно небольшому (<100) списку людей. </p>

Мой JavaScript выглядит так:

$('#mailer_final_form').on('submit',function(e){
    e.preventDefault();
    $('#forms_wrap').slideUp();
    $('#sender').slideDown();
    var url = "/mailer?action=send";
    var totalEmailrec = $('.email-recipients').length;
    var totalEmailrecp = totalEmailrec+1;
    $('#total_togo').html(totalEmailrec);

    var totalSent = 1;

    $('.email-recipients').each(function(){
    var thisRecipient = $(this).val();
        $.ajax({
         type: "POST",
         url: url,
         data: $('#mailer_final_form').serialize()+'&recipient='+thisRecipient,
         success: function(data)
         {
            $('#total_sent').html(totalSent++);
            $('#return_values').append(data);
                if (totalSent==totalEmailrecp) {
                    $('#loader_image').fadeOut();
                    $('#return_values').append('<br><b>Finished!</b>');
                }
         }
     });

    });

});

К сожалению, иногда происходит сбой почтовой программы, и это не говорит мне, почему, это мой PHP:

if ($_GET['action']=="send") {

    set_include_path('/opt/cpanel/ea-php56/root/usr/share/pear');

    $mailer_from = $_POST['sender'];
    $mailer_subject = $_POST['email_subject'];
    $mailer_body = $_POST['email_body'];        
    $salutation_type = $_POST['salutation_type'];       
    $recipient = $_POST['recipient'];
    $recipient = explode('||',$recipient);
    $recipient_name = trim($recipient[0]);
    $recipient_email = trim($recipient[1]);

    if (filter_var($recipient_email, FILTER_VALIDATE_EMAIL)) {

    define('USERNAME','my_ses_id');  
    define('PASSWORD','my_ses_pw');  
    define('HOST', 'email-smtp.us-west-2.amazonaws.com');  
    define('PORT', '587');     

    require_once 'Mail.php';

    define('SENDER', "$mailer_from");

    if (strpos($recipient_name, '@') !== false) {
    define('RECIPIENT', "$recipient_email");
    } else {
        define('RECIPIENT', "$recipient_name <$recipient_email>");
    }

    define('SUBJECT', "$mailer_subject");

    switch ($salutation_type) {
        case 1: // dear ***
            if (strpos($recipient_name, '@') !== false) {
                $salutation = "Dear recipient,<br><br>";
            } else {
                $salutation = "Dear $recipient_name,<br><br>";
            }
        break;
        case 2: // no salutation
        $salutation = "";
        break;
    }

    define('BODY',"
    <html>
    <head>
    <title>$mailer_subject</title>
    </head>
    <body style='background:#eee;padding:40px;width:100%;'>
    $mailer_template_header
    $salutation
    $mailer_body
    $mailer_template_footer
    </body>
    </html>");

    $headers = array ('MIME-Version'=>'1.0','Content-type'=>'text/html;charset=UTF-8','From' => SENDER,'To' => RECIPIENT,'Subject' => SUBJECT);
    $smtpParams = array ('debug' => false,'host' => HOST,'port' => PORT,'auth' => true,'username' => USERNAME, 'password' => PASSWORD);

    $mail = Mail::factory('smtp', $smtpParams);
    $mail->send(RECIPIENT, $headers, BODY); 

    if (PEAR::isError($mail)) { "<span class='emails-sent'>$recipient_name ($recipient_email) -".$mail->getMessage()."</span><br>"; } else {
    echo "<span class='emails-sent'>$recipient_name ($recipient_email) - OK</span><br>";
    }

    } else { echo "<span class='emails-sent'>$recipient_name ($recipient_email) - INVALID EMAIL ADDRESS / NOT SENT</span><br>"; }
}

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

Я без устали пытался сделать это с помощью setInterval jQuery и различных циклов таймера, но, похоже, не нужно работать в первичном каждом цикле (выполнение вызова AJAX по почте для каждого адреса электронной почты).

Может ли кто-нибудь любезно предложить способ (желательно с jQuery) пропустить адрес электронной почты с сообщением «Ошибка xyz из-за тайм-аута» на этот конкретный адрес? Или, может быть, покажите мне в моем PHP, как я могу сделать тайм-аут с той же ошибкой, возвращаемой в интерфейс почтовой программы?

...