【问题标题】:PHPMailer 5.2.0 sends out 2 mails each timePHPMailer 5.2.0 每次发送 2 封邮件
【发布时间】:2011-12-01 10:49:55
【问题描述】:

首先;抱歉,如果以前有人回答过这个问题,我最近几天一直在搜索,但没有成功。

我正在使用 PHPMailer 5.2.0 从表单发送邮件,该表单由带有 jQuery form 的 jQuery 脚本的 AJAX 调用调用,每次我发送邮件时它都会发送两次。一定是脚本被调用了两次,但我不知道它发生在哪里。

这是 php 脚本:

<?php
require_once('PHPMailer_5.2.0/class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$navn= $_REQUEST['navn'];
$tlf= $_REQUEST['tlf'];
$ring= isset($_REQUEST['ring']) ? $_REQUEST['ring'] : 0;
if($ring == 0)
{
$ring2 = " - og vil gerne ringes tilbage.";
}
else
{
$ring = "";
}
$email= $_REQUEST['email'];
$sendToOwn= isset($_REQUEST['sendToOwn']) ? $_REQUEST['sendToOwn'] : 0;
$besked= $_REQUEST['besked'];

$mail             = new PHPMailer();

//$body             = "testing 30/11";//file_get_contents('contents.html');
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host       = "SMTP.Server.com"; // SMTP server
$mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                       // 1 = errors and messages
                                       // 2 = messages only

$mail->SetFrom('noreply@sentfromDomain.dk', 'Name');

$mail->ClearReplyTos("");
$mail->AddReplyTo("mail@adress.com","Name");

$mail->Subject = "Besked fra mjtransportogflyt.dk";
$mail->MsgHTML("TEST FOR HELVEDE");//"<p>Denne mail er sendt af ".$navn." (".$email.") - ".$tlf.$ring2."</p><p>".$besked."</p>");
$mail->AltBody = "Denne mail er sendt af ".$navn." (".$email.") - ".$tlf.$ring2."<br /> ".$besked; // optional, comment out and test

//$mail->MsgHTML($body);

$address = "Sendto@thisadress.com";
$mail->AddAddress($address, "Kasper John Doe");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

if(!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
?>

这里是 jQuery:

$(document).ready(function(){
    function validate(formData, jqForm, options) { 
        for (var i=0; i < formData.length; i++) { 
            if (!formData[i].value) { 
                $('#results').removeClass('info').addClass('error');
                $('#results').html('<p><strong>Udfyld venligst alle felter</strong></p><p>Din besked blev <strong>ikke</strong> sendt</p>'); 
                //Test om det bliver kaldt
                //alert('works?');
                return false; 
            } 
        }
        var options = {
            //target: '#results',
            success: showResponse
        };
        function showResponse(statusText){
            $('#results').removeClass('info').addClass('success');
            $('#results').html('<strong><p>Beskeden er sendt!</p></strong>');
            //Får tilbagemelding fra processed.php
            //alert(statusText);
        }
            $('#myform').ajaxSubmit(options);
        }
    $('#myform').ajaxForm({beforeSubmit:validate})

});

最后是表格:

<form id="myform" method="post" action="processed.php">
    Lots and lots of inputs and stuff
    <!--submit button below-->
    <button class="btn action">Send besked</button>
</form>

【问题讨论】:

  • 您可以使用客户端工具(firebug、chrome 开发工具、opera dragonfly 等)检查网络选项卡,看看它是否发出了两个请求。这样您就可以确定是 jQuery 问题还是 PHP 问题。
  • 我找不到它的任何踪迹。但话说回来,我不知道在哪里找,所以我一直在随机寻找,如果你能告诉我在哪里可以找到它,我将不胜感激?

标签: php jquery jquery-plugins phpmailer


【解决方案1】:

我认为您的问题是您将 ajaxForm 添加到表单中,该表单本身会自动发送表单。但是,在发送之前,您将其发送到验证它的validate 函数,然后您也可以使用ajaxSubmit 在其中提交表单。

删除ajaxSubmit 应该会修复它,因为ajaxForm 会自行提交

我认为这会奏效

$(document).ready(function() { 
    var options = { 
        beforeSubmit:  validate,  // pre-submit callback 
        success:       showResponse  // post-submit callback 

    }; 

    // bind form using 'ajaxForm' 
    $('#myForm').ajaxForm(options); 
}); 



function showResponse(responseText, statusText, xhr, $form){
    $('#results').removeClass('info').addClass('success');
    $('#results').html('<strong><p>Beskeden er sendt!</p></strong>');
    //Får tilbagemelding fra processed.php
    //alert(statusText);
}

function validate(formData, jqForm, options) { 
        for (var i=0; i < formData.length; i++) { 
            if (!formData[i].value) { 
                $('#results').removeClass('info').addClass('error');
                $('#results').html('<p><strong>Udfyld venligst alle felter</strong></p><p>Din besked blev <strong>ikke</strong> sendt</p>'); 
                //Test om det bliver kaldt
                //alert('works?');
                return false; 
            } 
        }
    }

【讨论】:

  • 谢谢!这行得通,现在它只发送 1 封邮件,虽然现在直接发送到处理的.php 而不是触发 showResponse。有什么想法吗?
  • 是否出现任何javascript错误?我已经对我的答案进行了一些编辑,以便从开发人员网站上复制更多示例。试试上面的方法,看看会发生什么?
  • 恐怕它仍然没有触发功能。看看这里mjtransport.dk/index2.htm 表格在名为“kontakt”的页面上
  • 不,还是不行——我要拔头发了——mjtransportogflyt.dk/index.htm
  • 您的 javascript 中有语法错误。您需要在您的验证功能上关闭}。完成此操作后,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多