本人接触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']);//这个是在发送完成以后把数据库里的一个字段标识改一下 } } }
最后感谢我上上任技术经理给了我很大的帮助