分享
腾虎网络
2022-10-25
php解决群发邮件的几个问题?

当程序执行群发邮箱的时候,会出现等待程序反馈时间太长 这对于用户体验来说是很不好的,用户大多会在程序没有执行完就关闭程序,这样发送邮件也会中断,所以我们的解决思路应该是用异步去执行发邮件的过程。


一、创建一个连接用户操作页面和执行发件的方法:


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.1rn";


$out .= "host:" . $host . "rn";


$out .= "content-length:" . strlen($query) . "rn";


$out .= "content-type:application/x-www-form-urlencodedrn";


$out .= "connection:closernrn";


$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 ServiceSendemailService();


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').';');


/*记录一下日志看程序是否执行发件*/


}


PHP发送邮件截


用户运行结果(以上是测试)


PHP发送邮件截


日志查看


PHP发送邮件截


PHP发送邮件截


测试的两个邮箱都已经收到邮件