Я создал довольно простую почтовую программу, которая использует 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, как я могу сделать тайм-аут с той же ошибкой, возвращаемой в интерфейс почтовой программы?