当程序执行群发邮箱的时候,会出现等待程序反馈时间太长这对于用户体验来说是很不好的,用户大多会在程序没有执行完就关闭程序,这样发送邮件也会中断,所以我们的解决思路应该是用异步去执行发邮件的过程。
一、创建一个连接用户操作页面和执行发件的方法:
privatefunctionconnect($host,$path,$param=array()){
$query=isset($param)?http_build_query($param):'';
$port=80;
$errno=0;
$errstr='error';
$timeout=30;//连接超时时间(S)
$fp=@fsockopen($host,$port,$errno,$errstr,$timeout);
if(!$fp){
return'连接失败';
}
if($errno||!$fp){
return$errstr;
}
stream_set_blocking($fp,0);//非阻塞
stream_set_timeout($fp,1);//响应超时时间(S)
$out=POST.$path.HTTP/
1.1\r\n;
$out.=host:.$host.\r\n;
$out.=content-length:.strlen($query).\r\n;
$out.=content-type:application/x-www-form-urlencoded\r\n;
$out.=connection:close\r\n\r\n;
$out.=$query;
$result=@fputs($fp,$out);
@fclose($fp);
return$result;
}
二、用户操作方法传递参数页面
publicfunctionindex(){
$param=array(
0='xxx@qq.com',
1='xxx@qq.com',
);
$url='http://'.$_SERVER['HTTP_HOST']..'/Sends/emails';
$info=parse_url($url);
/*dump($info);*/$res=$thisConnect($info[host],$info['path'],$param);
/*调用方法*/
echo'发送成功';/*提示用户发送成功*/
}
三、发送邮件
publicfunctionemails(){
set_time_limit(0);/*设置程序运行时间没有限制防止运行超时*/
ignore_user_abort(true);//设置与客户机断开是否会终止执行
$data=I('post.');
$email='';
$sendTitle=邮件标题;
$sendinfo='邮件内容';
$send=array(
'title'=$sendTitle,
'detail'=$sendinfo,
);
$mail=newService\SendemailService();
foreach($dataas$k=$v){
$email.=$v.'|';
$toMail=$v;
$info=$mail-sendEmail($send,$toMail);
/*执行发送邮箱*/
}
$log_name=Public/notify_url.log;//log文件路径
$thislog_result($log_name,$email.date(time(),'H:i:s').';');
/*记录一下日志看程序是否执行发件*/
}
用户运行结果(以上是测试)
日志查看
测试的两个邮箱都已经收到邮件