本人接觸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']);//這個是在發送完成以後把數據庫裏的一個字段標識改一下
}
}
}
最後感謝我上上任技術經理給了我很大的幫助