TP5做工资条群发系统

本人接触PHP已有一年,公司需要导入excel然后发送给每个人工资条,所以我就借助各方面资源写了这些,现在公司已经开始使用了,如有一些地方写得有问题或者很糟糕的地方,还请各位大神给出指点,小弟再修正.

思路是使用多个邮箱 轮流 依次 给多个员工发送邮件,是为了防止因为短时间大批量发送邮件被封,我也不知道这样管不管用,但是我是这么做的,比如有邮箱m1,m2,m3.员工有12345,那么发送的顺序是这样的m1=>1,m2=>2,m3=>3,m1=>4,m2=>5

这篇文章省略了Excel的导入,DAO层的操作,主要是controller和service层的邮箱选择并且轮流给每位员工发送邮件的操作,看起来比较简陋,我个人感觉功能应该没什么太大的问题

邮箱里边这个东西要先打开,要不然一切都是徒劳

TP5做工资条群发系统_第1张图片

phpexcel和phpmailer放在了vendor下边,这两个文件git上都有自己下载就是了

我也在网盘里存了一份,链接:https://pan.baidu.com/s/1kYnVs21US6pRxrDIRMfXjg 密码:fg5d

TP5做工资条群发系统_第2张图片

在extend里边写了一个执行发送和选择邮箱的类

last_id=count($this->emails)-1;
        $this->current_id=0;
    }
    /**
     * @return Mail|null
     * 单例   避免并发冲突
     */
    static public function instance(){
        if(!(self::$instance instanceof Mail)){
            self::$instance = new self;
        }
        return self::$instance;
    }
    /**
     * @param $to_email
     * @param $message
     * @return array
     * @throws \PHPMailer\PHPMailer\Exception
     * 发送邮件
     */
    public function send($to_name,$to_emails,$message){
        $email = $this->getNextEmail();//每次发送都要获取一个邮箱

        $mail = new PHPMailer();
        $mail->Port = 465;
        $mail->CharSet = 'UTF-8';
        $mail->isSMTP();
        $mail->SMTPDebug = 0;
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = 'ssl';
        $mail->isHTML(true);
        $mail->Host = 'smtp.mxhichina.com';
        $mail->FromName = '';
        $mail->Username = $email;
        $mail->Password = $this->password;

        $mail->setFrom($email,'财务部'); //发送方地址和昵称
        $mail->addAddress($to_emails);//收件方地址和昵称
        $mail->Subject = "工资条"; //标题
        $mail->Body = $message; //内容

        if ($mail->send()) {
            echo '收件人:'.$to_name.',收件邮箱:'.$to_emails.',发送成功
';         } else {             echo '收件人:'.$to_name.',收件邮箱:'.$to_emails.',发送失败,重新发送
';         }     }     /**      * @return mixed      * 获取下一个邮箱      */     private function getNextEmail(){         if($this->current_id<$this->last_id){             $this->current_id++;         }else{             $this->current_id=0;         }         return $this->emails[$this->current_id];     } }

控制器,获取要发送的信息和收件人的邮箱,然后引用上边那个类来执行发送操作

因为工资表的信息是用excel导入到数据库的,每位员工的邮箱也存在这里边,所以这里我就直接在数据库里取了

getContent();//获取数据表信息
        foreach($content as $k=>$v){

            if(empty($v['mail'])){
                continue(1);
            };//判断邮箱是否为空

            $chars = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
            if (!preg_match($chars, $v['mail'])){
                echo $v['name']."的邮箱不合法,请检查邮箱后单条导入,重新发送返回首页
"; continue(1); }//验证邮箱合法性 $message = "
工资月份 {$v['this_month']}
入职时间 {$v['join_time']}
姓名 {$v['name']}
基本工资 {$v['basic_wage']}
出勤天数 {$v['attendance']}
业绩考核 {$v['performance']}
奖金 {$v['award']}
加班时间 {$v['overtime']}
薪资变动 {$v['wage_change']}
请假天数 {$v['askforleave']}
公休 {$v['dayoff']}
迟到扣款 {$v['late_forfeit']}
缺卡扣款 {$v['sign_forfeit']}
社保扣费 {$v['social_security']}
旷工 {$v['neglect_work']}
应发工资 {$v['gross_pay']}
个人所得税扣费 {$v['individual_income_tax']}
实发工资 {$v['real_pay']}
"; if(empty($message)){ continue(1); }//判断内容是否为空 UE::instance()->send($v['name'],$v['mail'],$message); $wage->editStatus($v['id']);//这个是在发送完成以后把数据库里的一个字段标识改一下 } } }

最后感谢我上上任技术经理给了我很大的帮助



   

你可能感兴趣的:(代码)