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']);//這個是在發送完成以後把數據庫裏的一個字段標識改一下
        }
    }
}

最後感謝我上上任技術經理給了我很大的幫助



   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章