当程序执行群发邮箱时,等待程序反馈的时间会太长,这对用户体验非常不好。大多数用户会在程序完成之前关闭程序,发送电子邮件也会被中断,所以我们的解决方案应该是使用发送电子邮件过程的异步执行。
1、创建连接用户操作页面并执行发送的方法:
私有函数连接($host,$path,$param=array()){
$query=isset($param)?http_build_query($param):'';
$端口=80;
$错误号=0;
$errstr='错误';
$超时=30;//连接超时时间(S)
$fp=@fsockopen($host,$port,$errno,$errstr,$timeout);
如果(!$fp){
return'连接失败';
}
if($errno||!$fp){
返回$errstr;
}
Stream_set_blocking($fp,0);//非阻塞
Stream_set_timeout($fp,1);//响应超时时间(S)
$out='发布'。$路径。'HTTP/1.1\r\n';
$out.='host:'。$主机。'\r\n';
$out.='内容长度:'。strlen($query)。'\r\n';
$out.='content-type:application/x-www-form-urlencoded\r\n';
$out.='connection:close\r\n\r\n';
$out.=$query;
$结果=@fputs($fp,$out);
@fclose($fp);
返回$结果;
}
2、用户操作方式:传递参数页面
公共函数索引(){
$参数=数组(
0='',
1='',
);
$url=''.$_SERVER['HTTP_HOST'].'/发送/电子邮件';
$info=parse_url($url);
/*dump($info);*/$res=$thisConnect($info['host'],$info['path'],$param);
/*调用方法*/
echo'发送成功';/*提示用户发送成功*/
}
3.发送电子邮件
公共函数电子邮件(){
set_time_limit(0);/*设置程序运行时间无限制,防止运行超时*/
ignore_user_abort(true);//设置与客户端断开连接是否终止执行
$data=I('发布。');
$电子邮件='';
$sendTitle='邮件标题';
$sendinfo='邮件内容';
$发送=数组(
'标题'=$sendTitle,
'详细信息'=$sendinfo,
);
$mail=newService\SendemailService();
foreach($dataas$k=$v){
$email.=$v.'|';
$toMail=$v;
$info=$mail-sendEmail($send,$toMail);
/*执行发送邮件*/
}
$log_name='公共/notify_url.log';//日志文件路径
$thislog_result($log_name,$email.date(time(),'H:i:s').';');
/*记录日志,看程序是否执行发送*/
}
用户运行结果
日志查看
两个测试邮箱均已收到邮件。