当程序执行群发邮箱的时候,会出现等待程序反馈时间太长 这对于用户体验来说是很不好的,用户大多会在程序没有执行完就关闭程序,这样发送邮件也会中断,所以我们的解决思路应该是用异步去执行发邮件的过程。
一、创建一个连接用户操作页面和执行发件的方法:
private function connect($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;
}
二、用户操作方法 传递参数页面
public function index(){
$param = array(
0 => 'xxx@qq.com',
1 => 'xxx@qq.com',
);
$url='http://'.$_SERVER['HTTP_HOST']..'/Sends/emails';
$info=parse_url($url);
/*dump($info);*/ $res=$this>Connect($info["host"],$info['path'],$param);
/*调用方法*/
echo '发送成功'; /*提示用户发送成功*/
}
三、发送邮件
public function emails(){
set_time_limit(0);/*设置程序运行时间没有限制防止运行超时*/
ignore_user_abort(true);//设置与客户机断开是否会终止执行
$data=I('post.');
$email='';
$sendTitle="邮件标题";
$sendinfo='邮件内容';
$send=array(
'title'=>$sendTitle,
'detail'=>$sendinfo,
);
$mail= new Service\SendemailService();
foreach ($data as $k => $v) {
$email.=$v.'|';
$toMail=$v;
$info=$mail->sendEmail($send,$toMail);
/*执行发送邮箱*/
}
$log_name = "Public/notify_url.log"; //log文件路径
$this>log_result($log_name,$email.date(time(),'H:i:s').';');
/*记录一下日志看程序是否执行发件*/
}
用户运行结果(以上是测试)
日志查看
测试的两个邮箱都已经收到邮件