防止PHP等待mail()函数

时间:2014-02-21 17:31:33

标签: php email apache2

在我的网络应用程序中,当用户对其帐户进行更改时,我调用php mail()函数向该用户发送电子邮件通知。实施此操作后,我发现帐户更改操作需要很长时间(> 20秒)才能完成。我怀疑这是因为PHP等待mail()函数发送电子邮件。有没有办法在没有等待的情况下拨打电话并立即继续下一行代码?

谢谢,

4 个答案:

答案 0 :(得分:4)

创建另一个PHP脚本(我们将此示例称为“mailuser.php”)。在此文件中,您的代码将查找尚未通过电子邮件发送的激活帐户...然后发送电子邮件。

在原始代码中(激活帐户后),请致电:

exec("php mailuser.php > /dev/null 2>&1 &");

这应该产生进程,但不要等待它返回。

有关详细信息,请参阅以下帖子:php exec command (or similar) to not wait for result& Run PHP Task Asynchronously

您还可以选择在命令行上传递用户ID,以便mailuser.php不必根据字段/标志查找用户。

答案 1 :(得分:0)

您可以将调用mail函数放在一个名为sendMail.php的单独的php文件中,然后使用(jQuery AJAX)将请求发送到该函数[https://api.jquery.com/jQuery .ajax的/].

$.ajax({
   type: "POST",
    url: "sendMail.php",
    data: { name: "Foo", email: "foobar@baz.com" }
})
.done(function( msg ) {
    alert( "Email sent: " + msg );
});

答案 2 :(得分:0)

您可以发送Ajax调用来发送邮件,然后出于安全考虑,如果邮件没有发送,您可以调用数据库查询回滚,这样您的代码就会安全。

答案 3 :(得分:0)

我有同样的问题。编写sendmail.php程序并使用ajax调用它。

<?
session_start();
header("Content-Type: text/html; charset=iso-8859-1");
require_once("libreria/class.phpmailer.php");
$mail             = new PHPMailer();
$body="";
$body.="<body>";
$body.=$_POST['cbody'];
$body.="</body>";
$mail->IsSMTP();
$mail->SMTPAuth   = true;                  
//$mail->SMTPDebug  = 2;
$mail->Host       = "mail.xxx.xxx";
$mail->Port       = 25;
$mail->Username   = "usermail@xxx.xxx";  
$mail->Password   = "xxxxxx";        
$mail->From       = "usermail@xxx.xxx";
$mail->FromName   = "xxx";
$mail->Subject    = $_POST['subject'];
$mail->WordWrap   = 50;
$mail->MsgHTML($body);
$mail->AddAddress($_POST['email'], "User");
$mail->IsHTML(true);
$mail->Send();
?>

(您可以使用ajax调用的响应来管理错误。)