TP5做工资条群发系统

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

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

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

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


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

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


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

<?php
namespace util;
use PHPMailer\PHPMailer\PHPMailer;
class Mail
{
    private $emails = [
        '[email protected]',
        '[email protected]',
        '[email protected]',
    ];
    private $current_id =0;
    private $last_id = 0;
    private $password = '***';//因为我上边用的邮箱,密码都是相同的,所以我在这里定义了一个密码
    private static $instance=null;

    function __construct(){
        $this->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.',发送成功<br/>';
        } else {
            echo '收件人:'.$to_name.',收件邮箱:'.$to_emails.',<a href="mail">发送失败,重新发送</a><br/>';
        }
    }
    /**
     * @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导入到数据库的,每位员工的邮箱也存在这里边,所以这里我就直接在数据库里取了

<?php
namespace app\index\controller;
use app\index\model\Wage;
use think\Controller;
use util\Mail as UE;
class Mail extends Controller{
    /**
     * 获取数据库人员所有信息
     */
    public function index(){
        $wage = new Wage();
        $content = $wage->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']."的邮箱不合法,请检查邮箱后<b style='color:red;'>单条导入</b>,重新发送<a href='/Index/index'>返回首页</a><br/>";
                continue(1);
            }//验证邮箱合法性

            $message = "<style>
                        td {width:50%;}
                        tr {height: 50px;border:1px dashed lightblue;;}
                    </style>
                    <table border='1' style='border-collapse:collapse;border: lightblue solid 2px;text-align:center;'>
                        <tr>    <td>工资月份</td>       <td>{$v['this_month']}</td>               </tr>
                        <tr>    <td>入职时间</td>       <td>{$v['join_time']}</td>                </tr>
                        <tr>    <td>姓名</td>          <td>{$v['name']}</td>                     </tr>
                        <tr>    <td>基本工资</td>       <td>{$v['basic_wage']}</td>               </tr>
                        <tr>    <td>出勤天数</td>       <td>{$v['attendance']}</td>               </tr>
                        <tr>    <td>业绩考核</td>       <td>{$v['performance']}</td>              </tr>
                        <tr>    <td>奖金</td>          <td>{$v['award']}</td>                    </tr>
                        <tr>    <td>加班时间</td>       <td>{$v['overtime']}</td>                 </tr>
                        <tr>    <td>薪资变动</td>       <td>{$v['wage_change']}</td>              </tr>
                        <tr>    <td>请假天数</td>       <td>{$v['askforleave']}</td>              </tr>
                        <tr>    <td>公休</td>          <td>{$v['dayoff']}</td>                   </tr>
                        <tr>    <td>迟到扣款</td>       <td>{$v['late_forfeit']}</td>             </tr>
                        <tr>    <td>缺卡扣款</td>       <td>{$v['sign_forfeit']}</td>             </tr>
                        <tr>    <td>社保扣费</td>       <td>{$v['social_security']}</td>          </tr>
                        <tr>    <td>旷工</td>          <td>{$v['neglect_work']}</td>             </tr>
                        <tr>    <td>应发工资</td>       <td>{$v['gross_pay']}</td>                </tr>
                        <tr>    <td>个人所得税扣费</td>  <td>{$v['individual_income_tax']}</td>    </tr>
                        <tr>    <td>实发工资</td>       <td>{$v['real_pay']}</td>                 </tr>
                    </table>";

            if(empty($message)){
                continue(1);
            }//判断内容是否为空

            UE::instance()->send($v['name'],$v['mail'],$message);
            $wage->editStatus($v['id']);//这个是在发送完成以后把数据库里的一个字段标识改一下
        }
    }
}

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



   

猜你喜欢

转载自blog.csdn.net/qq_29582277/article/details/80730903
tp5
今日推荐