jQuery $ .ajax失败但后面的Mail-Script被执行

时间:2014-02-20 07:34:22

标签: php jquery ajax yii

我有一个非常奇怪的问题。我正在使用jQuery执行几个ajax请求,以将邮件发送到参与者列表。这是jQuery:

function sendnext() {
    if(sending_ids.length > 0) {
        objekt = sending_ids.pop();
        $('#dialog-loader-log').show(); 
        $('#dialog-loader-log').append('Sending '+objekt['id']+' for '+objekt['failures']+'. time<br />');
        ajax = $.ajax({
            type: 'POST',
            url: baseUrl+'/evaluation/iteration/versenden/id/'+id,
            data: { 
                'ajax' : 1,
                'bewerbung_id' : objekt['id'],
                'text': $('#versenden-text').val()
            }
        }).done(function(content) {
            if(content != objekt['id']) {
                objekt['failures'] += 1;
                $('#dialog-loader-log').show(); 
                $('#dialog-loader-log').append(parseInt(objekt['failures'])+'. Failure('+objekt['id']+'): '+content+'<br />');
                $('#dialog-loader').dialog('option', 'height', $('#dialog-loader').dialog('option', 'height')+20);
                if(objekt['failures'] >= 3)
                    $dialog.find('#warnung_'+objekt['id']).show();  
                else
                    sending_ids.unshift(objekt);

            else {
                $dialog.find('#haken_'+objekt['id']).show();
                success_ids.push(objekt['id']);
            }
            setTimeout(sendnext(), 1000);
        }).fail(function(jqXHR, textStatus) {
            objekt['failures'] += 1;
            $('#dialog-loader-log').show(); 
            $('#dialog-loader-log').append('Connection failed: '+textStatus+'<br />');
            $('#dialog-loader').dialog('option', 'height', $('#dialog-loader').dialog('option', 'height')+20);
            if(objekt['failures'] >= 3)
                $dialog.find('#warnung_'+objekt['id']).show();  
            else
                sending_ids.unshift(objekt);
            setTimeout(sendnext(), 1000);
        });
    }
}
sendnext();

/evaluation/iteration/versenden/id/后面的脚本使用PHPMailer的实例和Yii mailer extension来发送邮件。

所以,这个想法是:如果执行done(),并且脚本的响应是发送邮件的用户的id,则发送邮件。如果执行了fail(),则发送失败并且必须重试。

但它不是那样的!有时,我在整个执行过程中某处连接失败(可能是第一封邮件,可能是第五封邮件,它很随机),但邮件是仍然发送!

那么在执行脚本但是我的AJAX请求的fail()被触发时它意味着什么?

如果不是AJAX响应,我可以安全地依赖什么来确定邮件是否已发送?

提前感谢。

//编辑1: 有关其他信息,这是正在执行的PHP脚本:

$iHatB = IterationHatBewerbung::model()->findByAttributes(array('iteration_id'=>$id, 'bewerbung_id'=>$_POST['bewerbung_id']));
if(!$iHatB)
    die('Fehler beim Versenden ('.$_POST['bewerbung_id'].'): ID existiert nicht');

$bewerbung = Bewerbung::model()->findByAttributes(array('ID'=>$iHatB->bewerbung_id));
if(!$bewerbung)
    die('Fehler beim Versenden ('.$iHatB->bewerbung_id.'): Student nicht vorhanden');

$platzhalter = array(
    '%LINK%',
    '%DEADLINE%'
);
$ersetzungen = array(
    'http://evaluation.itc-dortmund.de/index/key/'.$iHatB->shortkey,                    '<b>'.date('d.m.Y 23:59', strtotime($model->deadline)).'</b>'
);

foreach($platzhalter as $p) {
    if (strpos($text, $p) === false)
        die('Fehler beim Versenden: Der Platzhalter '.$p.' muss vorhanden sein');
}
$text = 'Sehr geehrte'.($bewerbung->Geschlecht=='weiblich'?' Frau ':'r Herr ').$bewerbung->Name.',

'.str_replace($platzhalter, $ersetzungen, $text);
$altText = preg_replace('/<\/?[a-zA-Z]+>/', '', str_replace('\n', PHP_EOL, $text));
$htmlText = nl2br($text);
Yii::app()->mailer->From = 'webserver@itc-dortmund.de';
Yii::app()->mailer->FromName = 'IT-Center Dortmund';
Yii::app()->mailer->AddReplyTo(Yii::app()->params['adminEmail']);
Yii::app()->mailer->AddAddress($bewerbung->EMail);
Yii::app()->mailer->Subject = 'ITC Lehrevaluation';
Yii::app()->mailer->isHtml();
Yii::app()->mailer->Body = $htmlText;
Yii::app()->mailer->AltBody = $altText;

if(!Yii::app()->mailer->Send()) {
    die('Fehler beim Versenden ('.$iHatB->bewerbung_id.'): '.Yii::app()->mailer->ErrorInfo);
}
else {
    $iHatB->versandt = true;
    $iHatB->save();
}

echo $iHatB->bewerbung_id;  

//编辑2: 当我手动执行脚本并通过GET提供参数时,我会随机遇到SMTP Error: Could not authenticate。但不是所有的时间,有时候。邮件服务器太慢了吗?

//编辑3: 好吧,只是为了记录:我实现了一个超时,将负载限制为每秒1个请求,并且脚本一遍又一遍地尝试,直到发送邮件为止。不是最好的解决方案,但IMO是唯一的解决方案..

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现的最佳解决方案是手动运行脚本而不是通过ajax进行调试。邮件发送后可能会失败。在这种情况下,php脚本仍会发送电子邮件,但无法返回您期望的数据,或者由于出错而终止执行。 Ajax错误在大多数情况下都非常模糊。

您可以安全地假设邮件已发送的唯一方式(越来越多收到)是检查发送给它的电子邮件,并查看它是否成功。我遇到过我的脚本运行正常的情况,但是邮件永远不会到达它的目的地。换句话说,不要只因为你的脚本发送它没有失败就收到邮件。