php异步群发邮件

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

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

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').';');
/*记录一下日志看程序是否执行发件*/       
}





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


日志查看



测试的两个邮箱都已经收到邮件
写评论...